Wie viel Speicher benötigt eine Textur auf der GPU?


9

Ein großes PNG auf der Festplatte nimmt möglicherweise nur ein paar Megabyte ein, aber ich stelle mir vor, dass auf der GPU dasselbe PNG in einem unkomprimierten Format gespeichert ist, das viel mehr Speicherplatz beansprucht. Ist das wahr? Wenn es stimmt, wie viel Platz?

Antworten:


16

JPG- und PNG-Dateien sind auf der Festplatte fast immer kleiner als im Speicher. Sie müssen im laufenden Betrieb dekomprimiert werden, um RGB-Rohdaten zu erfassen. Daher ist mehr Verarbeitungsleistung für das Laden und anschließend mehr RAM erforderlich. So viele moderne Engines speichern das gleiche Format auf der Festplatte wie im Speicher, was zu Dateien führt, die die gleiche Größe wie der Speicherbedarf der Textur haben (aber auch größer als ein PNG oder JPG). RGB / RGBA und S3TC / DXTn / BCn sind die am häufigsten verwendeten Formate, da sie ohne Verarbeitung direkt in den Speicher eingelesen werden (DXT-Texturen werden vorkomprimiert).

Dies sind also die Größen für verschiedene gängige Texturformate:

  • L (Luminanz, zB Graustufen): Breite * Höhe * 1 Byte.
  • LA (Luminanz und Alpha, üblich für Schriftarten): Breite * Höhe * 2 Bytes.
  • RGB (Farbe, kein Alpha): Breite * Höhe * 3 Bytes.
  • RGBA (Farbe mit Alpha): Breite * Höhe * 4 Bytes.
  • DXT1 / BC1 (Farbe, binäres Alpha): (Breite * Höhe * 4 Byte) / 8 (8: 1 Komprimierungsverhältnis).
  • DXT3 / BC2 (Farbe, scharfes Alpha) / DXT5 / BC3 (Farbe, Farbverlauf Alpha): (Breite * Höhe * 4 Bytes) / 4 (4: 1 Komprimierungsverhältnis).

Wenn Sie ein Bild mit Mipmaps verwenden , benötigt die Textur 4/3 so viel Speicher. Zusätzlich können die Texturbreite und -höhe intern auf eine Zweierpotenz auf alter oder weniger leistungsfähiger Hardware aufgerundet werden, und auf einer sehr begrenzten Hardware, die ebenfalls gezwungen ist, ein Quadrat zu sein.

Weitere Informationen zu DXT: Es handelt sich um eine verlustbehaftete Komprimierung. Dies bedeutet, dass beim Komprimieren der Textur einige Farbdaten verloren gehen. Dies wirkt sich negativ auf Ihre Textur aus, verzerrt scharfe Ränder und erzeugt "Blöcke" auf Verläufen. Die Vorteile sind jedoch weitaus besser als die Nachteile (wenn Sie eine Textur haben, die in DXT schrecklich schlecht aussieht, lassen Sie sie einfach unkomprimiert; die anderen machen den Größenverlust wieder wett). Da die Pixel durch Blöcke fester Größe komprimiert werden, müssen Texturbreite und -höhe ein Vielfaches von vier sein.


Dies ist bis auf Ihren ersten Satz korrekt. Das Format der Textur auf der Festplatte kann ein beliebiges stark komprimiertes Format sein. Daher wird auf der Festplatte nicht derselbe Speicherplatz wie im VRAM belegt, außer bei Festplattenformaten, bei denen es sich um direkte Serialisierungen der Speicherformate handelt.

Natürlich kann es das, aber überprüfen Sie die Assets, die in Spielen verwendet werden, die mit Unreal Engine, Source usw. erstellt wurden. Sie werden normalerweise nicht auf der Festplatte komprimiert, da heutzutage mehr als genug Speicherplatz vorhanden ist, um Ressourcen unkomprimiert zu lassen. und der eingesparte Speicherplatz gleicht nicht die zusätzliche RAM- und CPU-Zeit aus, die zum Dekomprimieren der Dateien bei jedem Laden erforderlich ist.
r2d2rigo

1
Ich denke, Sie werden feststellen, dass dies von Motor zu Motor unterschiedlich ist. Viele der größeren Engines - insbesondere diejenigen, die auf Konsolen arbeiten - verwenden ein Festplattenformat, das mit dem Speicherformat identisch oder diesem nahe kommt. Es ist jedoch ziemlich einfach, Spiele nur für PCs zu finden, die mit PNG- oder JPEG-Assets ausgeliefert werden. Wenn Sie für eine Last auf die Festplatte gehen müssen, wird dies Ihre Zeit ohnehin dominieren. Außerdem erwähnt Mike speziell PNG und JPEG als Festplattenformat.

Meistens korrekt, außer dass RGB-Formate auf GPUs normalerweise nicht vorhanden sind. siehe: opengl.org/wiki/Common_Mistakes#Texture_upload_and_pixel_reads
Maximus Minimus

9

Offensichtlich: Es kommt auf das Format an.

Nehmen wir eine quadratische Textur von 256 x 256 Pixel. Wenn es unkomprimiert 32-Bit mit einem Alpha-Kanal ( Colorin XNA) ist, benötigt es 256 KB ( 256*256*4Bytes).

16-Bit-Formate (zB :)Bgr565 sind offensichtlich halb so groß - 128 KB .

Dann gelangen Sie zu den komprimierten Formaten. In XNA haben Sie DXT1, DXT3 und DXT5 (auch als S3-Komprimierung bekannt ). Dies ist ein verlustbehaftetes Komprimierungsformat. Es ist auch ein blockbasiertes Format - was bedeutet, dass Sie davon abtasten können (weil Sie wissen, in welchem ​​Block sich ein Pixel befindet). Es ist auch schneller, weil Sie weniger Bandbreite verbrauchen.

Das Komprimierungsverhältnis von DXT1 beträgt 8: 1 und für DXT3 und DXT5 4: 1.

So ein DXT1 Bild von 256x256 ist 32KB . Und DXT3 oder DXT5 ist 64 KB groß .

Und dann gibt es Mipmapping . Wenn dies aktiviert ist, wird eine Reihe von Bildern im Grafikspeicher erstellt, die jeweils halb so groß sind wie die vorherigen. Also für unser 256x256-Bild: 128x128, 64x64, 32x32, 16x16, 8x8, 4x4, 2x2, 1x1. Eine Textur mit Mipmapping ist ungefähr 133% so groß wie das Original.


4

Die meisten GPUs können nur ein bestimmtes Komprimierungsformat lesen. z.B. BC *, DXT *, keine Formate wie png. Ja, es ist zum größten Teil richtig, dass eine PNG mehr Speicherplatz im Videospeicher benötigt als auf der Festplatte.

Texturen können komprimiert oder unkomprimiert sowohl im Videospeicher als auch im Systemspeicher gespeichert werden.

Bei unkomprimierten Texturen gilt als Faustregel, dass im Videospeicher genauso viel Speicherplatz benötigt wird wie in unkomprimierter Form im Systemspeicher.

Für DXT1-komprimierte Texturen. Die GPU speichert 8 Bytes für jede 4x4-Kachel in Ihrer Textur. Die unkomprimierten Daten (mit 8 Bit pro RGB-Kanal) betragen normalerweise 4 x 4 x 3 = 48 Byte, was einem Komprimierungsverhältnis von 6: 1 entspricht. Bei komprimierten DXT3 / DXT5-Texturen speichert die GPU 16 Byte für jede 4x4-Kachel in Ihrer Textur. Das ist ein etwas niedrigeres Kompressionsverhältnis von 3: 1.

Es gibt einige Einschränkungen bei unkomprimierten und komprimierten Texturen:

  • Der größte Teil des Speichers wird auf Seiten (deren Größe zwischen den GPUs variiert) mit fester Größe zugewiesen. z.B. 4 KB und oft wird das nicht untergeordnet und mit anderen GPU-Daten geteilt. Dh. Wenn Ihr Textur-Footprint kleiner als die Seitengröße ist, entspricht der Footprint in vid mem häufig immer noch der Seitengröße.

  • Einige GPUS haben sehr spezielle Ausrichtungsanforderungen. In der Vergangenheit hatten einige GPUs die Anforderung, dass Texturen eine Potenz von 2 haben müssen. Dies war häufig erforderlich, um eine überarbeitete Darstellung zu unterstützen (siehe Morton Ordering: http://en.wikipedia.org/wiki/Z-order_(curve )), um die Zugriffslokalität beim Abtasten aus der Textur zu verbessern. Dies bedeutete, dass Texturen ungerader Größe aufgefüllt wurden, um diese Anforderungen zu erhalten (normalerweise wird diese Auffüllung vom Fahrer übernommen). Während die Morton-Reihenfolge im modernen GPUS nicht unbedingt verwendet wird, kann es dennoch zu Blähungen kommen, um die spezifischen Anforderungen der GPU zu erfüllen.

  • Zu jedem Zeitpunkt können mehrere Darstellungen Ihrer Textur im Speicher vorhanden sein, insbesondere wenn Sie Verwerfungssperren verwenden. Dies kann Ihre Speichernutzung aufblähen lassen, bis die GPU keine Repräsentationen mehr verwendet (was normalerweise einige Frames hinter dem CPU-Rendering liegt).

  • Wenn Sie das Mipmapping aktivieren, verbrauchen die zusätzlichen Mips durchschnittlich etwa ein Drittel des Basis-Mip-Levels. YMMV basierend auf den oben genannten Einschränkungen.


0

AFAIK ist die Bildbreite * Höhe * BPP, unabhängig davon, ob es sich um PNG, JPG oder BMP handelt. Ich weiß nicht, wie DDS oder andere komprimierbare Formate angeordnet sind.

Mip-Mapping erhöht den Bedarf an Videospeicher auf.

Mein Wissen in diesem Thema ist möglicherweise etwas veraltet. Ich habe 3D vor einiger Zeit aufgegeben.


2
Bilder haben auch eine Tonhöhe (oder einen Schritt), dh die Anzahl der Bytes zwischen dem Ende einer Zeile und dem Beginn der nächsten Pixelzeile. Niemand sonst hat dies erwähnt, so dass ich mich irren könnte.
CiscoIPPhone

1
Normalerweise bezieht sich "Tonhöhe" auf die Länge einer Scanlinie in Bytes (wie in Freetype und SDL), und "Schritt" bezieht sich auf den Abstand zwischen Elementen, bei denen es sich um Pixel oder Scanlinien handeln kann (wie in OpenGL und Pythons 3. Slice-Argument). Beide Werte sind für die Bildverarbeitung erforderlich, aber "normalerweise" Tonhöhe = Breite * Bytes_Per_Pixel und Schritt = 0. Die Begriffe werden häufig lose und verwirrt verwendet. Überprüfen Sie daher am besten die API-Dokumente für die Bibliothek Ihrer Wahl.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.