Aynı doku birimine bağlı birçok doku varsa (5+ harita diyelim), önbellek için yalnızca 2 veya 3 dokuya sahip olmamdan daha mı kötü çalışır?
Aynı doku birimine bağlı birçok doku varsa (5+ harita diyelim), önbellek için yalnızca 2 veya 3 dokuya sahip olmamdan daha mı kötü çalışır?
Yanıtlar:
Sadece imallett'in cevabına ek olarak , bir gölgelendiricide farklı doku verilerine erişim sayısının artırılmasının GPU önbellek (ler) üzerindeki baskıyı artıracağı doğrudur, ancak etkiyi önemli ölçüde etkileyebilecek birkaç faktör daha vardır. CPU önbellekleri gibi, bir GPU'da birkaç önbellek katmanı olabileceği gerçeği de muhtemelen karmaşıktır. Doku Birimi <= L0 <= L1 <= .. Bellek
Doku verilerinin küçültülmesine sahip bir sahneniz varsa, perspektif veya basit ölçeklendirme nedeniyle olsun ve MIP eşlemesi kullanmıyorsanız, takma ad elde edersiniz. Bu sadece görsel eserler üretmeyecek; performans sorunu olması muhtemeldir.
Takma ad alır almaz, dokuya adres erişimi tutarsız hale gelir, bu da sadece önbellekleri atmakla kalmaz, aynı zamanda maliyetli olabilecek çok sayıda DRAM "sayfa sonu" (daha doğru, satır sonu) sağlar. MIP eşleme tutarsızlığın azaltılmasına yardımcı olur.
Belki biraz bariz bir seçenek, ancak 8bpp'den, örneğin 2bpp'ye kadar hedefleme yapan doku sıkıştırma (örneğin DXTn | ETC * | PVRTC * | vb.) Kullanabiliyorsanız, bellek bant genişliğinin / önbelleğinin etkinliğini büyük ölçüde artırabilirsiniz. 4x ila 16x arasındaki faktörler. Şimdi tüm GPU'lar için konuşamıyor ama bazı veriler bu doku sıkıştırma düzenleri (örneğin yukarıda listelenenler), donanım kod çözme için basit böylece vardır olabilir bu nedenle, tüm önbellek hiyerarşisi içinde sıkıştırılmış kalın ve sadece doku ünitesine içine açılmalıdır bu önbelleklerin boyutunu etkili bir şekilde çoğaltır.
Açıkçası, bazı veriler, örneğin sonraki oluşturmalarda doku verisi olarak kullanılan oluşturma hedefleri, doku sıkıştırma kullanamaz. Mümkün olduğunda, işi yapacak en küçük piksel biçimini kullanın, yani 32 / 16bpp (A) RGB yapacaksa, 4x32 kayan biçim kullanmayın!
Bu biraz yukarıdaki takma ad örneğiyle ilgilidir, ancak büyük oluşturma hedeflerinin oluşturulduğu, ancak daha sonra çok seyrek örneklenen örneklerle karşılaştık. CPU veya GPU'larda önbellek çizgileri oldukça uzundur, bu nedenle her önbellek satırında yalnızca bir piksel kullanıyorsanız, transferleri boşa harcarsınız.
Ayrıca, WRT sıkıştırılmış dokular, bunlar yerel bir metin bölgesi arasında etkili bir şekilde veri paylaşarak sıkıştırma sağlar. Uyumlu erişiminiz yoksa, bellek kapladığı alanı azaltmanın yanı sıra, sıkıştırma muhtemelen yardımcı olmaz.
Çok fazla bir önbellek sorunu (bilgisayarlı erişim oldukça tutarsız olmadıkça), ancak köşelerle sağlanan UV koordinatları tarafından doğrudan tanımlanmayan doku erişimleri doğrudan tanımlanmış olanlardan daha yavaş olabilir .
Bu günlerde çoğu dokunun kiremitli veya Morton benzeri (Twiddled / Swizzled olarak da bilinir) (veya her ikisinin bir kombinasyonu) olarak saklanacağından şüphelenmeme rağmen, bazı dokular hala tarama çizgisi düzeninde olabilir ; doku büyük olasılıkla önbellek kaçırmalarına / sayfa sonlarına yol açar. Ne yazık ki, belirli bir biçim bu şekilde düzenlenmişse nasıl tespit edeceğimi bilmiyorum.
(Arka planda okumak için, Blinn'in Doku Eşlemeyle İlgili Gerçeği'ni deneyin . FWIW, birkaç adım daha ileri giderek, en azından bazı erken PC donanımlarında Twiddled-order (yani Morton order) dokularının kullanılmasına yol açtı ).
Cevap ne demek istediğine bağlı. Modern donanım (örneğin, bağsız dokularla), kaç dokunun "bağlı" olduğunu gerçekten umursamıyor. Asıl soru, kaç tanesini kullandığınızdır .
Dokular genellikle verileri önbellek dostu bir şekilde saklar (Morton eğrisi, sanırım). Daha fazla doku kullanırsanız, daha fazla önbellek özlemi alırsınız, çünkü artık dokular alan için birbirleriyle yarışıyor.
Bu gerçekten iyi bilinen, eski gölgelendirici programlama buluşsallığına gelir: doku muslukları yavaştır; çok fazla kullanma.