Bu bölümde, farklı diller için Uygulama SDK’sını entegre ederken yapılabilecek olası optimizasyonlardan bahsedeceğiz.
Dil agnostik #
Malzeme önizlemeleri #
Uygulamanıza bir malzeme önizleme paneli eklerseniz, aynı basit sahnenin farklı malzemeler uygulanmış birden fazla render işlemini başlatmanız gerekecektir. İç nedenlerden dolayı render işleminin başlatılmasının özellikle hızlı olmadığını ve bunun da panelin yüklenme süresini yavaşlatacağını fark edebilirsiniz. Çözüm, üretim render işlemi yerine etkileşimli bir render işlemi oluşturmak, keepInteractiveRunning=true ayarını yapmak ve önceden ayarlanmış bir sahneden yüklenen aynı temel nesneye farklı malzemeleri uygulamaktır. Bu yalnızca bir for döngüsü içinde kullanılmalıdır. Önizlenecek malzeme listesi tükendiğinde, render işleminin kaynaklarını serbest bırakması için durdurulması gerekir.
Değişiklik grubunu kaydet #
Etkileşimli modda, değişikliklerin birlikte uygulanmasını sağlamak için renderer.commit() yöntemini açıkça çağırmanın yanı sıra oluşturucunun autoCommit=false seçeneğini de kullanın. Bu, değişikliklerin uygulanması için gereken toplam süreyi azaltacaktır.
GUI mesaj işleme #
GUI mesaj işleme varsayılan olarak etkinleştirildiğinden, dahili beklemeler sırasında devre dışı bırakılması entegrasyon yazılımının genel yanıt hızını artırabilir. Arayüzün adı setGUIMessageProcessing(bool enable) .
Bellek ve performans optimizasyonları #
-
Büyük verilerin (köşeler, harita kanalları, ham bitmap tamponları) V-Ray belleğine verimli bir şekilde aktarılması, performans optimizasyonuna yol açabilir.
-
Harici dosyalar dışında, büyük veriler çoğunlukla VectorList ve IntList gibi tipli listelerde bulunur (ki bunlar map_channels örneğinde olduğu gibi genel heterojen listelerin içine de yerleştirilebilir).
Eklenti özellikleri (parametreleri) desteklenen tüm programlama dillerinde her zaman değer olarak ayarlanır ve okunur.
Eklenti parametre optimizasyonu ipuçlarını listele #
Desteklenen tüm programlama dillerinde, App SDK, birçok durumda verileri tahmin edebilen ve verimli bir şekilde dönüştürebilen “akıllı” eklenti parametre değeri ayarlayıcıları kullanır:
-
Örneğin, ayarlanan bir eklenti özelliğinin tanım türü VectorList ise ve ona 3*N adet float veya double değerinden oluşan bir dizi veya liste atamaya çalışırsanız, veriler otomatik olarak yeniden yorumlanır veya N elemanlı bir VectorList’e dönüştürülür; bu işlem genellikle kodunuzda yapmaktan daha verimlidir. Bu, verileri beklenenden farklı bir biçimde aldığınız durumlarda yararlı olabilir.
-
Bu tür bir kod çalışacaktır (aşağıdaki örneklerde Python/js benzeri sözdizimi kullanılmıştır ancak teknik desteklenen tüm dillerde çalışır):
mesh.vertices = [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9] # değerler otomatik olarak dönüştürülür
veya
mesh.vertices = FloatList(1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9) # değer doğrudan yeniden yorumlanır
mesh.vertices değeri artık VectorList(Vector(1.1, 2.2, 3.3), Vector(4.4, 5.5, 6.6), Vector(7.7, 8.8, 9.9)) -
C++’da std::vector<double> ve C#’da List<double> veya double[] gibi ifadelerin, özellik tanım türüne bağlı olarak otomatik olarak FloatList, VectorList veya ColorList’e verimli bir şekilde dönüştürüleceğini unutmayın. Ancak bunu kullanmak için genel Plugin.setValue(propertyName, value) fonksiyonunu
çağırmanız gerekir , çünkü C++’daki özellik ayarlayıcıları ve C#’daki özellikler güçlü tiplidir ve başka herhangi bir türdeki veriyi kabul etmez.
Node.js’e özgü #
Eklenti özellikleri (parametreler) her zaman referans yoluyla değil, değer yoluyla ayarlanır ve okunur!
Senkron/asenkron #
-
Node.js bağlayıcısındaki birçok yöntem hem senkron hem de asenkron sürümler sunar. Tüm sürecin tamamlanmasını beklemeniz gerekmediğinde, asenkron sürümü kullanabilirsiniz.
-
Standart senkron VRayRenderer nesne oluşturma işlemine ek olarak, asenkron API vray.createVRayRenderer(callback, options) de mevcuttur.
-
Benzer şekilde, vray.createVRayServer(callback, options) yöntemi, bir VRayServer nesnesini eşzamansız olarak oluşturmak için kullanılabilir.
-
Aşağıdaki VRayRenderer yöntemlerinin senkron/asenkron sürümleri mevcuttur: start, export, pickPlugin, pickPlugins, load, append, loadAsText, appendAsText, loadFromBuffer, appendFromBuffer, loadFiltered, appendFiltered, loadAsTextFiltered, appendAsTextFiltered, appendFromBufferFiltered, saveIrradianceMapFile, saveLightCacheFile, savePhotonMapFile, saveCausticsFile, addHosts, removeHosts, resetHosts, getAllHosts, getActiveHosts, getInactiveHosts
-
Aşağıdaki VRayServer yöntemlerinin senkron/asenkron sürümleri mevcuttur: addHosts, removeHosts, resetHosts, getAllHosts, getActiveHosts, getInactiveHosts
-
Aşağıdaki VRayImage yöntemlerinin senkron/asenkron sürümleri mevcuttur: createFromBuffer, save, compress, getDownscaled, getResized, getDownscaledCropped, getResizedCropped, getFitIn, getFitOut, getCutIn, load, loadSize
-
Aşağıdaki VFB yöntemlerinin senkron/asenkron sürümleri mevcuttur: saveImage, loadImage
Yazılı Listeler #
-
Node.js’deki genel listeler JavaScript dizilerini / [] kullanır . Türlü listeler ise JavaScript türlü dizilerine dayanır.
-
FloatList , VectorList ve ColorList , Float32Array’in etrafında oluşturulmuş çok ince sarmalayıcılardır ve bu şekilde serbestçe kullanılabilirler (ve çoğu durumda bunların yerine Float32Array kullanılabilir).
-
Benzer şekilde IntList, Int32Array’in etrafında oluşturulmuş ince bir sarmalayıcıdır .
-
Eklenti özelliklerini okuduğunuzda, her zaman temel alınan liste verilerinin bir kopyasını elde edersiniz.
-
Ancak, eklenti özelliklerini ayarlarken, JavaScript türündeki dizi verilerini doğrudan V-Ray belleğine kaydetmeyi tercih edebilirsiniz. Bu davranış, her VRayRenderer örneği için VRayRenderer.maxTypedListsCopyByteSize özelliği tarafından kontrol edilir. Bir tür listesinin bayt cinsinden veri boyutu, maxTypedListsCopyByteSize tarafından belirtilen eşiğin üzerindeyse , JavaScript türündeki dizide bulunan veriler doğrudan V-Ray belleğine kaydedilir. maxTypedListsCopyByteSize’ın varsayılan değeri -1’dir, bu da verilerin her zaman kopyalanacağı anlamına gelir. Bellek tüketimini azaltmak ve kodu hızlandırmak için bunu 0’a veya küçük bir değere (örneğin 200) değiştirebilirsiniz.
-
Node.js’de V-Ray ile oluşturulan türlendirilmiş listeler bir kez oluşturulduktan sonra yeniden boyutlandırılamaz (çünkü JavaScript’te türlendirilmiş diziler yeniden boyutlandırılamaz).
Gerektiğinde, temel aldıkları ArrayBuffer ikili veri depolama alanına erişerek ve bunu yeni tür oluşturucuya ileterek, farklı türdeki tüm tipli listeler, tipli diziler ve düğüm arabellekleri arasında serbestçe “dönüştürme” yapabilirsiniz:
var a = FloatList(0.1, 0.2, 0.3, 0.4, 0.5, 0.6); // let's have a float list
var b = Buffer.from(a.buffer); // now the buffer 'b' shares its bytes with 'a'
var c = new VectorList(b.buffer); // now the VectorList shares its data with buffer 'b' and the list 'a'
// 'c' is VectorList(Vector(0.1, 0.2, 0.3), Vector(0.4, 0.5, 0.6))
v6.20’den beri
6.20 sürümünde iki yeni tipli liste eklendi:
-
PluginList, JavaScript Array’den miras alan ancak (yalnızca) eklenti nesnelerini verimli bir şekilde depolayabilen, yeniden boyutlandırılabilir bir eklenti kapsayıcısıdır . Artık VRayRenderer.classes.Node.getInstances() gibi fonksiyonlar, JavaScript dizisi yerine PluginList döndürüyor ; bu da yüz binlerce örneğin fazla bellek yükü olmadan döndürülmesine olanak tanıyor. Çoğu durumda, önceden yazılmış kullanıcı kodu, altta yatan değişikliği fark etmeden çalışmaya devam edecektir. Ayrıca, kullanıcı kodu PluginList’leri açıkça oluşturabilir ve eklenti listelerinin beklendiği eklenti özellik ayarlayıcılarına iletebilir (ancak bu zorunlu değildir).
-
TransformList, VectorList , ColorList vb.’ye biraz benzeyen, yeniden boyutlandırılamayan, dizi benzeri bir Transform nesnesi kapsayıcısıdır; ancak Float32Array’in ince bir sarmalayıcısı olmak yerine , verilerini dahili olarak bir FloatList / Float32Array içinde tutar. Bu nedenle, örneğin transList[index] öğesine eriştiğinizde, VectorList veya ColorList’te olduğu gibi yalnızca bir sayı değil, bir Transform nesnesi alırsınız veya ayarlarsınız . Altta yatan FloatList verilerine doğrudan TransformList.floatList özelliğini kullanarak erişebilirsiniz . GeomUtils.readScatterData() fonksiyonu , döndürülen verilerin bir parçası olarak bir TransformList döndürür . Ayrıca, kullanıcı kodu TransformList’leri açıkça oluşturabilir (örneğin, mevcut FloatList / Float32Array örneklerini sarmalayarak ) ve bunları, dönüşüm listelerinin beklendiği eklenti özellik ayarlayıcılarına iletebilir.
C++’a özgü #
Yazılı Listeler #
-
C++’daki tipli listeler std::vector’a dayanır ; örneğin IntList std ::vector<int> , VectorList std ::vector<Vector> vb. Genel liste ValueList de std::vector’a dayanır ve std::vector<Value> şeklindedir.
-
Value türü , bir listeye eklenebilen ve türlendirilmiş listeler veya ValueList içerebilen tüm türlerin birleşimidir .
-
C++’da, C++11 taşıma semantiğinin gücünden yararlanarak, uzun tipli listelerde bulunan verileri kopyalama yapmadan doğrudan V-Ray belleğine yerleştirmek mümkündür.
-
( std::vector tabanlı ) tüm listeler, Value türü ve eklenti özellik ayarlayıcıları hem kopyalama hem de taşıma semantiğini destekler.
-
Küçük veri boyutları (birkaç yüz elemana kadar kısa listeler) için, dinamik bellek tahsis maliyeti düşük (birkaç bayt) olduğundan, taşıma semantiği kullanmak faydalı değildir. Ancak kullanılsa bile, veriler yalnızca belirli bir eşiğin üzerinde taşınacaktır.
Eklenti özellik ayarlayıcıları, listelerin türüne ve boyutuna bağlı olarak verileri seçici olarak taşır veya kopyalar:
Ya da daha karmaşık bir örnekle:
Referans listeleri #
Bu, VRAY_SDK_INTEROPERABILITY makrosu tarafından etkinleştirilen gelişmiş bir özelliktir . Bu türleri büyük temel veri tipleri listeleri için kullanın. Mevcut türler şunlardır: IntRefList, FloatRefList, VectorRefList, ColorRefList, CharString, CharStringRefList, Value, ValueRefList. Ayrıca, V-Ray SDK’ya göre yazılmış mevcut kodun App SDK’ya taşınması için de uygundurlar.
C#’a özgü #
Eklenti özellikleri (parametreler) her zaman referans yoluyla değil, değer yoluyla ayarlanır ve okunur!
Türlü Listeler ve Diziler #
-
.Net tarafından yönetilen belleğe giden/gelen veriler her zaman V-Ray tarafından yönetilmeyen belleğe kopyalanır. Ancak gereksiz ek kopyalamaları en aza indirmemiz gerekiyor.
-
.Net’te tipli listeler IList<T> olarak sunulur ve çoğunlukla List<T>’ ye dayanır . Ve bir eklenti özelliğini okuduğunuzda elde edeceğiniz şey List<T>’ dir ( IList<T>’ ye dönüştürülmüş hali).
-
Eklenti özellik ayarlayıcıları ayrıca IList<T> türünü de kabul eder . Arayüzü destekleyen herhangi bir tür çalışacak olsa da, temel kod List<T> ve T[] için oldukça optimize edilmiştir .
-
.Net’te dizilerin IList<T> arayüzünü açıkça desteklediğini belirtmek çok önemlidir . Bu nedenle, verileriniz bir T[] dizisinde bulunuyorsa , onu doğrudan herhangi bir özelliğe atayın veya IList<T> kabul eden herhangi bir fonksiyona doğrudan iletin! T[]’ yi List<T>’ ye dönüştürüp IList<T> olarak iletmek verimsizdir ve gereksiz bellek tahsislerine ve kopyalamalara neden olur.
-
Listenin uzunluğunu önceden biliyorsanız, istediğiniz boyutta oluşturun. Bu, kapsayıcının genişletilmesinden kaynaklanan gereksiz yeniden tahsisleri önleyecektir. Ya da daha iyisi, sadece düz T[uzunluk] dizisi kullanın.
Özetle #
-
V-Ray için listeler oluştururken T[] veya List<T> kullanın .
-
T[]’ yi List<T>’ ye dönüştürmeye ÇALIŞMAYIN , doğrudan kullanın! ( T[], IList<T>’ ye dönüştürülebilir ).
-
List<T>’ yi T[] ‘ye dönüştürmeye ÇALIŞMAYIN , doğrudan kullanın.
-
Mümkün olan yerlerde, gerekli uzunlukta listeleri önceden ayırın (veya sadece diziler kullanın).
Python’a özgü #
Eklenti özellikleri (parametreler) her zaman referans yoluyla değil, değer yoluyla ayarlanır ve okunur!
Yazılı Listeler #
-
Python’da genel listeler Python listeleri / [] kullanılarak oluşturulur .
-
Ancak V-Ray’in tip tanımlı listeleri, IntList , FloatList , VectorList , ColorList ve 6.20 sürümünden itibaren TransformList ve PluginList gibi özel tipler kullanır ve bunların tümü sequence protokolünü destekler. Bu, çoğu durumda Python listeleri gibi kullanılabilecekleri ancak çok daha verimli oldukları anlamına gelir.
-
a.append(4) ve b+=a gibi tüm standart liste işlemleri de çalışır.
-
Türlü listeler ayrıca bellek görünümü arabellek protokolünü de destekler.
Mümkün olan en yüksek verimliliği sağlamak ve tüm pratik durumları kapsamak için, tipli listelerin bazı özellikleri vardır. Örneğin, konum ve anahtar kelime argümanları tamamen farklıdır:
