Antworten:
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:
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.
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 ( Color
in XNA) ist, benötigt es 256 KB ( 256*256*4
Bytes).
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.
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.
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.