Ayrıntılı bir doku oluşturmak için daha uzun sürüyor mu?


22

Diyelim ki bir kare yapmak istiyorum; onun dokusu "square.png."

Doku sadece düz bir renkse bilgisayarın görüntülemesi daha mı kolay?

Peki ya burada ve orada tamamen rasgele renklerle çok gürültülü bir doku varsa?

Ya da bu doku içindeki her pikselin birinden diğerine farklı olduğu, ancak sadece küçük bir bit tarafından farklı olduğu takdirde gürültülü olabilirse?

Yanıtlar:


39

Oyun geliştirmedeki ve özellikle oyun grafiğindeki çoğu şey gibi, cevabı da "bağlıdır"

Doku boyutu

Dokunuzun çözünürlüğünün oluşturma hızı üzerinde bir etkisi olabilir. İçerdiği piksel sayısı arttıkça, GPU'ya yüklenecek daha ham veriler ve bir kerede önbelleğe sığabileceğimiz doku miktarı azalır, bu nedenle gölgelendirici dokunun sağ kısmını beklerken daha fazla duraklamaya neden olabilir önbelleğe almak için.

Mipmap kullanmak, bunun etkisini azaltabilir. Mipmap'larla, dokuların küçültülmüş versiyonlarını bir zincirde saklıyoruz; bu, ilk başta etrafta dolaşmak için daha fazla bellek gibi geliyor. Ancak, doku ekranda küçük bir boyutta (perspektifte uzak bir nesne gibi) görüntülendiğinde daha küçük sürümlerden okumamızı sağlar, böylece numunelerimiz her yere atlamak yerine doku önbelleğini daha iyi kullanır. Bu aynı zamanda takma adımı da azaltır.

Doku detay

Dokularınızın içeriğinin, çoğu zaman verimliliği artırmada etkisi yoktur.

Bir renk, GPU’ya gelince, sadece bir demet sayıdır, bu yüzden bu sayıların ne olduğu umrunda değil, sadece matematiği ile aynı şekilde hizalamasını sağlar. "Ah, daha önce bu yeşilde bir piksel gördüm, sadece bu girişi gördüğümde hesapladığım çıktıyı tekrar kullanacağım" hatırlamak gibi bir şey yapmaz, böylece dokunuz tek renkli mi? veya rastgele parıldıyorsa, GPU'nuz aynı işi yapıyor.

Görüntünün öngörülebilir alanlarında daha verimli bir şekilde sıkıştıran ve karmaşık bölgelerde daha fazla bit yiyen PNG ve JPG gibi formatlardan farklı olarak, BTC, ETC, PVRTC ve hatta ham RGBA gibi GPU doku formatları blok başına sabit sayıda bit kullanır. piksel. Dolayısıyla, aynı sıkıştırma biçimini korurken dokunuzu daha fazla veya daha az ayrıntılı hale getirmek, veri boyutunu değiştirmez veya veri aktarımını ve önbellekle ilgili verimliliği etkilemez.

Ancak, önceki sıkıştırmanızın iyi bir şekilde korumadığı belirli bir ayrıntı kullanırsanız, tüm görüntünüzü, veri boyutunu tekrar değiştirebilecek farklı bir format kullanmak üzere değiştirmeniz gerekebilir.

Shader Dallanma ve Dolaylılık

İşte durumdaki en büyük yıldız işareti: bu doku renk girdisini if()dal gibi kararlar vermek için kullanıyor olabilirsiniz . Burada detay hız için önemlidir.

GPU gölgeleme birimleri, aynı komutları birden fazla veri akışında paralel olarak çalıştırarak toplu işlerde piksel blokları üzerinde çalışır. Öyleyse, bloktaki bazı pikseller bir dalını alırken ifdiğer pikseller diğerini alır, tüm toplu işlemin her iki daldan geçmesi gerekir (bir piksel kümesine veya diğerine uygulanmayan sonuçları maskelemek)

Girişiniz düzgün / tahmin edilebilir bir şekilde değişiyorsa, büyük olasılıkla yalnızca tek bir dal almanız gereken birçok bloğa sahip olursunuz ve bu her iki dalın da olayı, geçiş sınırındaki dar bantlarla sınırlandırılır. Ancak girişiniz rastlantısalsa, blokların her ikisinin de dal almasını ve görüntülemeyi yavaşlatmasını bekleriz.

Bu, aramaları bozulma veya dizin haritası gibi ikinci bir dokuda kontrol etmek için tek bir doku kullanıyorsanız da olabilir. İlk doku rastgele atlarsa, ikinci dokunun dağınık, rastgele-lekeli noktalarından örnekleme yaparız, doku önbelleğimizi daha az tutarlı kullanır ve ortalama olarak ihtiyaç duyduğumuz verileri elde etmek için daha uzun süre bekleriz.


Yani, genel olarak: hayır, dokunun içeriği, olduğu durumlar hariç, oluşturma hızını çok fazla etkilemez. ;)


Düşük çözünürlüklü dokular (Minecraft'ın düşünün), belirli bir doku önbelleğe yüklendiğinde, bitişik pikseller için önbellek içeren metinleri yüklemesi daha olasıdır, değil mi?
user253751 14:18

6
@ immibis Minecraft'ın küçük dokuları vardır. Varsayılan değer, her çekirdeğin doku önbelleğine o kadar kolay sığmayan yalnızca 16x16'dır: D Ve evet, çoğu doku örneği bloktan çok uzakta olmadığınız sürece, aynı dokuya olacaktır. Bu özellikle ekran alt bölümünü dikkate alırsanız doğrudur - eğer makul bir şekilde yakınsanız, belirli bir çekirdeğin tüm partisi aynı mektuba eşlenebilir: DA daha basit GPU muhtemelen düşük çözünürlüklü dokular için daha iyi çalışacaktır - Minecraft için hiçbir şeye yardım etmeyen optimizasyonlar için çok fazla çaba harcanıyor.
Luaan

1
Yan not: "Piksel başına aynı sayıda bayt kullanır" aslında grafik kodunun kullandığı hız kesmelerinin kilit anahtarıdır. PNG'yi dahili olarak kullanmaya çalışırsanız, hatta değişken piksel boyutunda UTF-8 gibi bir şeye sahip olsanız bile n, o piksele ulaşmak için her bir piksele gitmeniz gerekir. Sabit bir piksel bayt genişliğiyle , özellikle büyük için çok daha hızlı start_of_buffer + width * nolan sadece . n
Fon Monica'nın Davası

@Luaan Demek istediğim, bloktan uzakta olsanız bile, bir tek texel getirdiğinde (hangisi önce olursa), bitişiğindeki bazılarını da önbelleğe çekmesi gerekir.
kullanıcı253751,

4
Mipmapping ile yukarıda bahsettiğim durum budur. Örneklerimizin tüm dokuları atlamasını önlemek için, aralarında önbellek kullanımının az olduğu veya hiç olmadığı kadar büyük boşluklar bırakarak, 512x512 sürümü ve 256x256 sürümü ve .... bazen 1x1'e kadar saklıyoruz. Yani 1024x1024'lük dokuyu 16x16'da çizerken, oyunların çoğu 16x16 mipten okuyor olacak ve 16x16 Minecraft kasasına önbellek verimliliği açısından benzer bir performans gösterecek. Bu aynı zamanda ışıltılı diğer adlandırma yapılarını altörnekleme işleminden azaltır.
DMGregory

1

Yukarıda DMGregory'nin mükemmel cevabının yanı sıra , belki de, bir "doku" nın karmaşıklığının renderleme performansını etkileyebileceği ve önceki renderlemenin sonuçlarının sonraki bir örnekte bir kaynak olarak kullanıldığı, örneğin gölge haritalarının kullanıldığı bir durum vardır. / yansımalar / çevre haritaları.

Bazı modern donanımlar bu tamponlara kayıpsız sıkıştırma uygulayabilir: örneğin PowerVR, PVRIC , AMD, Delta Renk Sıkıştırma ve ARM'de benzer bir şeye sahiptir. Bu sıkıştırma tekniklerinin amacı, sırayla oluşturma performansını artırabilen genel bant genişliğini azaltmaktır.

Veri ne kadar basitse, derinlik veya renk (tamsayı veya kayan nokta), bu şemalar o kadar iyi çalışacaktır. Tabii ki, bunların daha iyi çalışması için renderleme çıktınızı kasıtlı olarak basitleştirmenizi önermem ama gürültülü verileri kullanmaktan kaçınmak bazı durumlarda yardımcı olabilir.

Ayrıca, bu şemaları kullanan çerçeve / derinlik arabelleklerinin seyrek örneklemesini yapmak, boşuna bant genişliğini azaltma girişiminde yardımcı olmaz çünkü blok temelli olmaları çok muhtemeldir.

Ayrıca, bu iki SE Computer Graphics soru ve ilgisini çeken cevaplarını bulabilirsiniz:

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.