GPU'da bir doku ne kadar bellek kaplıyor?


9

Diskteki büyük bir png sadece birkaç megabayt alabilir, ancak gpu'da aynı png'nin çok daha fazla yer kaplayan sıkıştırılmamış bir biçimde saklandığını hayal ediyorum. Bu doğru mu? Doğruysa, ne kadar alan var?

Yanıtlar:


16

JPG ve PNG dosyaları neredeyse her zaman diskte bellekten daha küçük olacaktır; ham RGB verilerini elde etmek için anında açılmaları gerekir, böylece yükleme için daha fazla işlem gücü ve daha sonra daha fazla RAM gerekir. Pek çok modern motor, diskte olduğu gibi aynı formatı diskte depolamayı seçerek, dokunun bellek gereksinimleriyle aynı boyutta (ancak bir PNG veya JPG'den daha büyük) dosyalara yol açar. RGB / RGBA ve S3TC / DXTn / BCn en yaygın kullanılan formatlardır, çünkü herhangi bir işlem yapılmadan doğrudan belleğe okunurlar (DXT dokuları önceden sıkıştırılır).

Yani, bunlar farklı ortak doku formatları için boyutlardır:

  • L (parlaklık, örneğin gri tonlama): genişlik * yükseklik * 1 bayt.
  • LA (parlaklık ve alfa, yazı tipleri için ortak): genişlik * yükseklik * 2 bayt.
  • RGB (renkli, alfa yok): genişlik * yükseklik * 3 bayt.
  • RGBA (alfa renk): genişlik * yükseklik * 4 bayt.
  • DXT1 / BC1 (renkli, ikili alfa): (genişlik * yükseklik * 4 bayt) / 8 (8: 1 sıkıştırma oranı).
  • DXT3 / BC2 (renkli, keskin alfa) / DXT5 / BC3 (renkli, degrade alfa): (genişlik * yükseklik * 4 bayt) / 4 (4: 1 sıkıştırma oranı).

Mipmap'lı bir görüntü kullanırsanız , doku 4/3 bellek gerektirir. Ek olarak, doku genişliği ve yüksekliği, eski veya daha az yetenekli donanımın ikisinin gücü olacak şekilde dahili olarak yuvarlanabilir ve çok sınırlı bir donanımda da kare olmaya zorlanabilir.

DXT hakkında daha fazla bilgi: kayıplı bir sıkıştırma; bu, doku sıkıştırılırken bazı renk verilerinin kaybedildiği anlamına gelir. Bunun doku üzerinde olumsuz bir etkisi vardır, keskin sınırları bozar ve degradeler üzerinde "bloklar" oluşturur; ancak faydaları dezavantajlardan çok daha iyidir (DXT'de korkunç derecede kötü görünen bir dokuya sahipseniz, sadece sıkıştırılmamış tutun; diğeri boyut kaybını telafi edecektir). Ayrıca, pikseller sabit boyutlu bloklarla sıkıştırıldığından, doku genişliği ve yüksekliği dördün katı olmalıdır.


Bu, ilk cümleniz dışında doğrudur - dokudaki disk formatı yüksek oranda sıkıştırılmış herhangi bir format olabilir ve bu nedenle, bellek formatlarının doğrudan serileştirilmesi olan disk formatları hariç, VRAM'daki diskle aynı alanı almaz.

Tabii ki yapabilir, ancak Unreal Engine, Source, vb. İle oluşturulan oyunlarda kullanılan varlıkları kontrol ederler. Genellikle diskte sıkıştırılmazlar, çünkü günümüzde kaynakları sıkıştırılmamış bırakmak için yeterli disk alanı var; ve kaydedilen alan, her bir yükteki dosyaları açmak için gereken ekstra RAM ve CPU süresini oluşturmaz.
r2d2rigo

1
Sanırım bunun motordan motora değiştiğini göreceksin. Daha büyük motorların birçoğu - özellikle konsollarda çalışanlar - aynı veya bellek formatına yakın bir disk formatı kullanır. Ancak PNG veya JPEG varlıklarıyla yalnızca PC'de sunulan oyunları bulmak oldukça kolaydır. Zaten zamanınıza hükmedecek bir yük için diske gitmeniz gerekiyorsa. Ayrıca, Mike disk formatı olarak PNG ve JPEG'den özellikle bahsetmektedir.

RGB formatlarının normalde GPU'larda mevcut olmaması dışında çoğunlukla doğrudur; bkz. opengl.org/wiki/Common_Mistakes#Texture_upload_and_pixel_reads
Maximus Minimus

9

Açıkçası: Biçime bağlıdır.

256 x 256 piksel kare bir doku alalım. Bir alfa kanalı ( ColorXNA'da) ile sıkıştırılmamış 32 bit ise , 256 KB ( 256*256*4bayt) alır .

16-bit formatlar (ör . :)Bgr565 Açıkçası yarım boyutta olacaktır - 128KB .

Sonra sıkıştırılmış formatlara girersiniz. XNA'da DXT1, DXT3 ve DXT5 ( S3 Sıkıştırma olarak da bilinir ) vardır. Bu kayıplı bir sıkıştırma biçimidir. Aynı zamanda blok tabanlı bir formattır - yani örnekleme yapabileceğiniz anlamına gelir (çünkü bir pikselin hangi bloğun içinde olduğunu biliyorsunuz). Ayrıca daha hızlıdır, çünkü daha az bant genişliği kullanırsınız.

DXT1'in sıkıştırma oranı 8: 1'dir ve DXT3 ve DXT5 için 4: 1'dir.

Yani 256x256 bir DXT1 resimdir 32KB . Ve DXT3 veya DXT5 olduğu 64KB .

Ve sonra mipmaplama var . Bu etkinleştirilirse, grafik belleğinde öncekinin her iki yarısında bir dizi görüntü oluşturur. 256x256 resmimiz için: 128x128, 64x64, 32x32, 16x16, 8x8, 4x4, 2x2, 1x1. Mipmap ile bir doku orijinalin boyutunun yaklaşık % 133'ü kadardır .


4

Çoğu GPU yalnızca çok belirli bir sıkıştırma biçimini okuyabilir. Örneğin. BC *, DXT *, png gibi formatlar değil. Yani evet, çoğunlukla .png'nin video belleğinde diskten daha fazla yer kaplayacağı doğrudur.

Dokular hem video belleğinde hem de sistem belleğinde sıkıştırılmış veya sıkıştırılmamış olarak saklanabilir.

Sıkıştırılmamış dokular için genel kural, video belleğinde sistem belleğinde sıkıştırılmamış formdakiyle aynı miktarda yer almasıdır.

DXT1 sıkıştırılmış dokular için. GPU, dokunuzdaki her 4x4 karo için 8 bayt depolar. Sıkıştırılmamış veriler (RGB kanalı başına 8 bitlik) normalde 4x4x3 = 48 bayt olur, bu da 6: 1 sıkıştırma oranıdır. DXT3 / DXT5 sıkıştırılmış dokular için GPU, dokunuzdaki her 4x4 karo için 16 bayt depolar. Bu biraz daha düşük sıkıştırma oranı 3: 1'dir.

Hem sıkıştırılmamış hem de sıkıştırılmış dokulara sahip bazı uyarılar vardır:

  • Çoğu bellek, sabit bir boyutta (boyutu GPU'lar arasında değişen) sayfalara ayrılır. Örneğin. 4KB ve genellikle bu alt gişe ayrılmaz ve diğer gpu verileri ile paylaşılmaz. Yani. doku ayak iziniz sayfa boyutundan küçükse, vid mem'daki ayak izi genellikle sayfa boyutu olur.

  • Bazı gpusların çok özel hizalama gereksinimleri vardır. Geçmişte, bazı GPU'ların dokuların 2 boyutlu bir güç olması şartı vardı. Dokudan örnekleme yaparken erişim yerini iyileştirmek için genellikle swizzled temsilini desteklemek için gerekliydi (bkz. Morton Siparişi: http://en.wikipedia.org/wiki/Z-order_(curve )). Bu, bu gereksinimleri korumak için garip boyutlardaki dokuların doldurulacağı anlamına gelir (tipik olarak bu dolgu, sürücü tarafından işlenir). Morton düzeni modern gpus'ta zorunlu olarak kullanılmasa da, gpu'nun spesifik gereksinimlerini desteklemek için hala şişkinlik olabilir.

  • Herhangi bir zamanda, özellikle üzerlerinde atma kilitleri kullanıyorsanız, dokunuzda birden fazla sunum olabilir. Bu, gösterimler artık gpu tarafından kullanılmayana kadar bellek kullanımınızı engelleyebilir (bu genellikle CPU oluşturma işleminin birkaç karesidir)

  • Mipmap oluşturma özelliğini etkinleştirirseniz, ek mipler ortalama baz mip seviyesinin yaklaşık üçte birini tüketir. YMMV yukarıdaki uyarılara dayanmaktadır.


0

AFAIK, PNG, JPG veya BMP ise bağımsız olarak genişlik * yükseklik * BPP resimlerinden oluşur. DDS veya diğer sıkıştırılabilir formatların nasıl düzenlendiğini bilmiyorum.

Mip eşleme video belleği ihtiyacını artıracaktır.

Bu konudaki bilgim biraz modası geçmiş olabilir. 3D'yi bir süre önce terk ettim.


2
Görüntüler ayrıca bir satırın sonu ile sonraki piksel satırının başlangıcı arasındaki bayt miktarı olan bir adım (veya adım) içerir. Başka kimse bundan bahsetmedi, bu yüzden yanılmış olabilirim.
CiscoIPPhone

1
Genellikle "adım" bayt cinsinden bir tarama çizgisinin uzunluğunu belirtir (Freetype ve SDL'de olduğu gibi) ve "adım", pikseller veya tarama çizgileri olabilen (OpenGL ve Python'un 3. dilim argümanında olduğu gibi) öğeler arasındaki boşluğu belirtir. Her iki değer de görüntü işleme için gereklidir, ancak "genellikle" adım = genişlik * bytes_per_pixel ve stride = 0 Terimler genellikle gevşek ve karışık olarak kullanılır, bu nedenle seçtiğiniz kitaplık için API belgelerini kontrol etmek en iyisidir.
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.