Wie geht die GPU mit Textur und VRAM um?


18

Es ist eigentlich eine Reihe von miteinander verbundenen Fragen:

  1. Werden komprimierte Texturen (dxt5 / dxt1 usw.) während des Renderns der Pipeline jemals vollständig dekomprimiert?

  2. Wenn die Antwort auf die erste Frage zutrifft, wie wird dann der Speicher für mehrere große unkomprimierte Texturen verwaltet?

  3. Unterscheidet sich der Framebuffer von VRAM in einer modernen GPU?

Antworten:


29

GPU-komprimierte Texturformate wie DXT / BC / ETC können direkt aus ihrer komprimierten Form gelesen werden. Sie müssen nicht in einen unformatierten RGBA-Puffer entpackt werden.

Das funktioniert so, dass jeder Texelblock (häufig 4x4) eine feste Anzahl von Bits belegt - wir wissen also genau, wie weit der Puffer entfernt ist, um nach einem bestimmten Texel zu suchen - und diese Blöcke können dekomprimiert werden, ohne die gesamte Umgebung zu lesen / vorhergehende Texturinformation. GPUs enthalten spezielle Hardware, die nur die angeforderten Texelblöcke nach Bedarf dekomprimiert, um Textur-Sampling-Anforderungen Ihrer Shader zu erfüllen.

Dies steht im Gegensatz zu Formaten wie jpg und png, bei denen die Menge an Speicherplatz, die jedes Texel belegt, über das Bild variieren kann (detaillierte Bereiche, die mehr Daten belegen, vorhersehbare Bereiche, die weniger belegen). Um also ein bestimmtes Texel zu finden, muss es dekomprimiert werden das ganze Bild oder zumindest große / verteilte Teile davon. Da sie jedoch vorhersagbare Bereiche einer Textur selektiv komprimieren können, neigen sie dazu, Bilder auf kleinere Größen zu komprimieren, um sie auf einer Disc zu speichern oder über ein Netzwerk zu übertragen, als dies bei GPU-freundlichen Formaten der Fall ist. Unterschiedliche Strategien für unterschiedliche Zwecke.


Im Allgemeinen sollte das Stellen mehrerer Fragen über mehrere Posts erfolgen, aber da dies eine ziemlich kurze Antwort ist, werde ich auch Punkt 3 treffen:

" Framebuffer " ist nur ein Teil des Videospeichers, den wir zum Speichern des zusammengesetzten Bildes verwenden, das wir auf dem Bildschirm präsentieren möchten. Beachten Sie die Details in der Antwort von JarkkoL, wo wir diesen Puffer auf einer speziellen Hardware möglicherweise in einem bestimmten Teil unseres verfügbaren Videospeichers lokalisieren , der für die Bandbreitenanforderungen von Renderzielen optimiert ist.


Dieser Link zu den Komprimierungsalgorithmen ist äußerst hilfreich und ausführlich. Nizza zu finden!
Coburn

7

Die Beantwortung Ihrer Fragen hängt wirklich von der Plattform ab. Im Allgemeinen werden BC-Formate im Speicher in komprimierter Form gespeichert, und die Dekomprimierung wird im Flug von GPU-Textureinheiten durchgeführt. Es gibt jedoch Ausnahmen. Es ist nämlich bekannt, dass Xbox 360 vollständige 4 × 4-Pixel-BC-Blöcke zum Cache dekomprimiert, bevor TU die Daten abruft, wodurch die Cache-Nutzung erhöht wird. Ich kenne keine Plattform, die die gesamte Textur beim Laden in einen RAM-Speicher dekomprimieren würde, bezweifle dies jedoch aufgrund der zusätzlichen Speicher- und Bandbreitennutzung.

Dasselbe gilt für Framebuffer - es hängt von der Plattform ab. Auf Xbox 360 verfügten Sie über 10 MB dedizierten EDRAM mit hoher Bandbreite, den Sie für Renderziele verwenden mussten. Auf Xbox One verfügen Sie weiterhin über 32 MB speziellen ESRAM, der aufgrund der hohen Bandbreite für Renderziele bevorzugt wird (und anders als auf Xbox 360 auch abgerufen werden kann). Die Renderziele können sich jedoch auch im regulären DDR3-Speicher befinden.

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.