Görüntü işleme ve ışın izleme gibi performans açısından kritik alanlarda çalışmakla taraflı olabilirim, ancak yine de "olabildiğince geç" optimize etmeyi söyleyebilirim . Gereksinimleriniz ne kadar kritik olursa olsun, ölçtükten sonra, peşinden her zaman çok daha fazla bilgi ve netlik vardır, bu da en etkili optimizasyonların bile daha sonra bu tür bilgileri edindikten sonra uygulanacağı anlamına gelir.
Tuhaf Durumlar
Ancak bazenbazı tuhaf durumlarda "olabildiğince geç" hala oldukça lanettir. Örneğin, çevrimdışı oluşturuculardan bahsediyorsak, performans elde etmek için kullandığınız veri yapıları ve teknikleri aslında kullanıcı sonu tasarımına sızıyor. Bu iğrenç gelebilir, ancak alan o kadar ileri derecede ve performans açısından kritiktir ki, kullanıcılar belirli bir raytracer için geçerli olan optimizasyon tekniklerine özgü (örn: ışınım önbellekleme veya foton eşleme) kullanıcı sonu kontrolleri kabul eder. bir görüntünün oluşturulması için saatlerce beklemek, diğerleri ise render işlemine adanmış makinelerle bir render çiftliği kiralamak veya sahip olmak için muazzam miktarda para yatırmak için kullanılır. Rekabetçi bir çevrimdışı oluşturucu, harcanan sürede önemsiz bir azalma sunabilirse, bu kullanıcılar için zaman ve parada büyük bir azalma vardır. Bu, zamandaki% 5'lik bir azalmanın kullanıcıları gerçekten heyecanlandırdığı bir tür alandır.
Bu tür tuhaf durumlarda, sadece bir render tekniğini willy-nilly seçemezsiniz ve daha sonra optimize etmeyi umamazsınız, çünkü kullanıcı sonu tasarımı da dahil olmak üzere tüm tasarım, kullandığınız veri yapıları ve algoritmalar etrafında döner. Burada, birey olarak ve belirli güçlü ve zayıf yönlerinizden, rekabetçi bir çözüm sunmada büyük bir etken olarak, diğer insanlar için iyi sonuç veren şeylerle bile gidemezsiniz. Arnold'un arkasındaki ana geliştiricinin zihniyeti ve duyarlılıkları, çok farklı bir yaklaşım kullanan VRay üzerinde çalışanlardan farklıdır; yerleri / teknikleri mutlaka değiştiremez ve en iyi işi yapamazlar (her ikisi de endüstriyel lider olsalar bile). Bir çeşit deneme ve prototip ve kıyaslama yapmak zorundasınız ve Eğer gerçekten satacak rekabetçi bir şey gemi umut orada son teknoloji teknikleri sonsuz dizi verilen yaparken özellikle iyi. Dolayısıyla bu tuhaf durumda, performans endişeleri, kalkınmaya başlamadan önce belki de en önemli endişe olarak öne çıkmaktadır.
Yine de bu, "mümkün olduğunca geç" optimizasyonunun bir ihlali olmak zorunda değildir , bu "mümkün olduğunca geç" , bu aşırı ve tuhaf durumlarda oldukça erken. Bu tür erken performans endişelerinin ne zaman ve neye ihtiyaç duymadığını bulmak, hiç değilse, muhtemelen geliştiricinin ana sorunudur. Optimize etmeyecek şey, bir geliştiricinin kariyerinde öğrenmeye ve öğrenmeye devam etmenin en değerli şeylerinden biri olabilir, çünkü her şeyi optimize etmek isteyen saf geliştiriciler sıkıntısı bulamazsınız (ve ne yazık ki işlerini bir şekilde sürdürmeyi başaran bazı gaziler bile) karşı üretkenliklerine rağmen).
Olabildiğince geç
Belki de en zor kısmı ne anlama geldiğini anlamaya çalışmaktır. Hala öğreniyorum ve neredeyse otuz yıldır programlıyorum. Ama özellikle üçüncü on yılda, bunun o kadar zor olmadığını anlamaya başlıyorum. Uygulamadan ziyade tasarıma odaklanırsanız, bu roket bilimi değildir. Tasarımlarınız daha sonra tasarımda değişiklik yapmadan uygun optimizasyonlar için nefes alan bırakırsa, daha sonra optimize edebilirsiniz. Ve gittikçe daha fazla üretkenlik, bu nefes alma odasını sağlayan bu tür tasarımları araştırmaya başladım.
Daha Sonra Optimize Etmek İçin Solunum Odası Sunan Tasarım
Bu tür tasarımların birçoğu "sağduyu" uygulayabilirsek, çoğu durumda başarılması o kadar da zor değildir. Kişisel bir hikaye olarak görsel sanatlara bir hobi olarak giriyorum (sanatçıların ihtiyaçlarını anlamak ve dillerini konuşmak için biraz kendim olmak için yazılım programlamaya yardımcı olduğunu düşünüyorum) ve 2000'lerin başında Oekaki uygulamalarını kullanarak biraz zaman geçirdim çalışmalarını doodle ve paylaşmak ve diğer sanatçılarla bağlantı kurmak için hızlı bir yol olarak çevrimiçi.
Özellikle benim en sevdiğim site ve uygulama performans kusurları ile bilmece (önemsiz herhangi bir fırça boyutu bir tarama yavaş olurdu), ama çok güzel bir topluluk vardı. Performans sorunları çözmek için ufacık küçük 1 veya 2 piksel fırçaları kullandım ve işimi şöyle karaladım:
Bu arada yazara performansı artırmak için yazılım önerileri vermeye devam ettim ve önerilerimin bellek optimizasyonları ve algoritmaları vb. Hakkında konuşurken özellikle teknik nitelikte olduğunu fark ettim. Bu yüzden aslında bir programcı olup olmadığımı sordu ve evet dedim ve beni kaynak kodu üzerinde çalışmaya davet etti.
Bu yüzden kaynak koduna baktım, çalıştırdım, profilli ettim ve dehşetime, yazılımı "soyut piksel arayüzü" kavramı etrafında tasarlamıştı IPixel
, ki bu, dinamik olan her şey için en üst sıcak noktaların arkasındaki kök neden oldu. her bir görüntünün her bir pikseli tahsis eder ve gönderir. Yine de, tüm yazılımın tasarımını yeniden düşünmeden bunu optimize etmenin pratik bir yolu yoktu çünkü tasarım onu soyutlarımız tek bir soyut pikselin tanecik düzeyinde çalıştığında mikro-optimizasyonların en önemsiz ötesinde bir köşeye sıkışmıştı. ve her şey bu soyut piksele bağlı.
Bence bu "sağduyu" nun ihlali ama açıkçası geliştirici için pek de sağduyu değildi. Ancak, en temel kullanım durumlarının bile milyonlarca, pikseller veya parçacıklar veya devasa bir ordu simülasyonundaki küçük birimler gibi somutlaşacağı böyle ayrıntılı bir şeyleri soyutlamamak gibi. İyilik IImage
ya da (tüm görüntü / piksel o hantal toplam seviyesinde ihtiyaç biçimlerini işleyebilir) IParticleSystem
için IPixel
veya IParticle
, sonra da en temel ve hızlı-to-yazma ve bu tür arayüzler arkasında uygulamalarını basit anlaşılır yapılır ve koyabilirsiniz daha sonra tüm yazılımın tasarımını yeniden düşünmeden optimize etmek için ihtiyaç duyacağınız tüm solunum odasına sahip olun.
Ve bugünlerde gördüğüm gibi amaç bu. Yukarıdaki çevrimdışı oluşturucular gibi tuhaf durumlar hariç tutulursa, mümkün olduğunca geç görüş bilgisiyle (ölçümler de dahil olmak üzere) mümkün olduğunca geç optimize etmek için yeterli solunum odasına sahip tasarımlar yapın ve gerekli optimizasyonları mümkün olduğunca geç uygulayın.
Tabii ki, ortak kullanıcı sonu durumlarda kolayca önemsiz bir boyuta ulaşan girdiler üzerinde ikinci dereceden karmaşıklık algoritmaları kullanarak başlamanızı önermiyorum. Bunu zaten kim yapıyor? Ancak, uygulamanın daha sonra değiştirilmesi kolaysa, bunun çok büyük bir şey olduğunu düşünmüyorum. Herhangi bir tasarımı yeniden düşünmeniz gerekmiyorsa, bu hala ciddi bir hata değildir.