Freigeben über


Blockkomprimierung

Ab Windows 8.1 unterstützt Direct2D mehrere blockkomprimierte Pixelformate. Darüber hinaus enthält Windows 8.1 einen neuen WINDOWS Imaging Component (WIC)-DDS-Codec, um das Laden und Speichern von komprimierten Blockbildern im DDS-Dateiformat zu ermöglichen. Die Blockkomprimierung ist ein Verfahren zum Verringern des Grafikspeichers, der von Bitmapinhalten verbraucht wird. Durch die Verwendung der Blockkomprimierung kann Ihre App den Arbeitsspeicherverbrauch und die Ladezeiten für dieselben Auflösungsbilder reduzieren. Oder Ihre App kann bilder mit mehr oder höherer Auflösung verwenden und gleichzeitig den gleichen GPU-Speicherbedarf verbrauchen.

Blockkomprimierung wird seit langem von Direct3D-Anwendungen verwendet, und mit Windows 8.1 stehen auch Mainstream- und Direct2D-Anwendungsentwicklern zur Verfügung.

In diesem Thema wird beschrieben, wie die Blockkomprimierung funktioniert und wie sie in WIC und Direct2D verwendet wird.

Informationen zur Blockkomprimierung

Block compression (BC) bezieht sich auf eine Klasse von Komprimierungstechniken zum Verringern der Texturgrößen. Direct3D 11 unterstützt je nach Featureebene bis zu 7 verschiedene BC-Formate. In Windows 8.1 Bietet Direct2D Unterstützung für die Formate BC1, BC2 und BC3, die auf allen Featureebenen verfügbar sind.

Funktionsweise der Blockkomprimierung

Die komprimierten Blockformate verwenden alle dieselbe grundlegende Technik, um den von Farbdaten verbrauchten Platz zu reduzieren. In diesem Abschnitt wird der einfachste Algorithmus (BC1) zusammengefasst. Eine ausführlichere Erläuterung finden Sie unter Blockkomprimierung.

Zunächst wird das Bild in Blöcke von 4 x 4 Pixel unterteilt. Jeder Block wird separat komprimiert.

Anmerkung

Dies bedeutet, dass die Breite und Höhe eines Bilds jeweils ein Vielfaches von 4 Pixeln sein muss, damit es komprimiert werden kann.

 

Dieses Beispielbild zeigt einen 4x4-Pixelblock innerhalb eines Bilds.

ein Beispielbild zeigt einen 4x4-Pixelblock innerhalb eines Bilds.

Als Nächstes werden innerhalb eines 4 x 4-Blocks zwei "Bezugsfarben" ausgewählt und als zwei 16-Bit-Werte codiert (5 Bit rot, 6 Bit grün, 5 Bit Blau). Die Auswahl dieser Farben wirkt sich erheblich auf die Bildqualität aus und ist nichttrivial. Zwei Zwischenfarben werden durch lineare Interpolation zwischen den beiden Bezugsfarben im RGB-Farbraum berechnet. Dies erzeugt insgesamt 4 verschiedene Farben; jeder Farbe wird ein Zwei-Bit-Indexwert zugewiesen. Beachten Sie jedoch, dass nur die beiden Endpunktfarben gespeichert werden müssen, da die Interpolation behoben ist.

In dieser Abbildung werden die Farben 0 und 3 als "Bezugsfarben" für den Block ausgewählt, während farben 1 und 2 mit linearer Interpolation berechnet werden.

Diagramm, das die Berechnung von vier Farbwerten zeigt, um den Block darzustellen.

Schließlich wird jedes Pixel im Block einer der vier zuvor berechneten Farben zugeordnet, und jedes Pixel wird mit dem Zwei-Bit-Indexwert codiert.

Die Gesamtmenge der Daten, die für die Darstellung dieser 16 Pixel verwendet werden, lautet:

16 bits [to define a reference color] * 2 + 2 bits * 16 [number of pixels] = 64 bits

Dies führt zu einer durchschnittlichen Dichte von 4 Bit pro Pixel. Im Vergleich dazu verbraucht das gängige DXGI_FORMAT_B8G8R8A8_UNORM Pixelformat 32 Bit pro Pixel.

Dieses Diagramm zeigt, dass jedes Pixel als 2-Bit-Index codiert ist. Der gesamte Block wird in 64 Bit codiert.

4 Farbwerte berechnen, um den Block darzustellen.

Es gibt Variationen zur Unterstützung von Alphadaten und unterschiedlicher Anzahl von Farbkanälen. BC6H und BC7 verwenden erheblich unterschiedliche Algorithmen, um hdr-Inhalte (High Dynamic Range) zu unterstützen und die Bildqualität zu erhöhen.

DirectDraw Surface (DDS)-Dateiformat

Blockkomprimierte Daten werden in der Regel in DirectDraw Surface (DDS) Dateien gespeichert. Möglicherweise sind Sie mit DDS-Dateien vertraut, wenn Sie ein Direct3D-Entwickler sind. Beachten Sie, dass Direct2D nur bestimmte DDS-Features unterstützt; weitere Informationen finden Sie unter DDS Requirements.

Vorteile der Blockkomprimierung

Blockkomprimierte Formate unterscheiden sich von gängigen Bildkomprimierungsformaten wie JPEG in diesem BC-Format werden von modernen GPUs nativ unterstützt. Dies bedeutet, dass Sie ein blockkomprimiertes Bild direkt auf die GPU laden können, ohne Dassdecodierung oder Dekomprimierung. BC-Formate verbrauchen durchschnittlich von 4 bis 8 Bit pro Pixel; Im Vergleich zu einer typischen nicht komprimierten 32-Bit pro Pixel-BGRA-Bitmap führt dies zu Speichereinsparungen von 75% bis 87,5%. Da es keinen Decodierungsschritt gibt, wird die Zeit zum Laden eines BC-Bilds im Vergleich zu Formaten wie JPEG erheblich reduziert.

Verwendung der Blockkomprimierung

Sie sollten die Verwendung von blockkomprimierten Bildern in Ihrer App anstelle anderer Formate wie JPEG in Betracht ziehen, wenn Sie den Speicherverbrauch von Bitmaps verringern oder die Decodierungs- und Ladezeiten reduzieren möchten.

Blockkomprimierung ist jedoch nicht für alle Fälle geeignet und erfordert einige Nachteile. Erstens gehen die Blockkomprimierungsalgorithmen verloren. Blockkomprimierung funktioniert gut mit natürlichen fotografischen Inhalten, kann aber unerwünschte visuelle Artefakte in Bilder mit scharfen, hohen Kontrastgrenzen wie computergenerierte Screenshots einführen. Sie sollten sicherstellen, dass die komprimierten Block-Bildressourcen eine akzeptable Bildqualität aufweisen, bevor Sie sie verwenden.

Zweitens verbrauchen blockkomprimierte DDS-Dateien in der Regel mehr Speicherplatz auf dem Datenträger als vergleichbare JPEG-Bilder. Dies erhöht wiederum die Paketgröße und die Netzwerkbandbreitenanforderungen Ihrer App.

Verwenden der Blockkomprimierung

In diesem Abschnitt wird erläutert, wie Sie komprimierte Objekte in einer Direct2D-App generieren und verwenden.

Überblick

Blockkomprimierte DDS-Dateien sind ein laufzeitoptimiertes Format, was bedeutet, dass sie speziell für eine gute Leistung zur App-Laufzeit optimiert sind. Es wird empfohlen, die vorhandene Objekterstellungs- und Bearbeitungspipeline weiterhin zu verwenden und nur in ein komprimiertes Blockformat zu konvertieren, wenn Sie sie in Ihr Anwendungsprojekt oder zur Erstellungszeit importieren.

DDS-Anforderungen

Das DDS-Dateiformat wurde entwickelt, um eine vielzahl von Features zu unterstützen, die in Direct3D verwendet werden. Direct2D verwendet nur eine Teilmenge dieser Features. Daher müssen Sie beim Erstellen von DDS-Bildern für die Verwendung mit Direct2D die folgenden Einschränkungen berücksichtigen:

  • Es sind nur die folgenden DXGI_FORMAT Werte zulässig:
    • DXGI_FORMAT_BC1_UNORM
    • DXGI_FORMAT_BC2_UNORM
    • DXGI_FORMAT_BC3_UNORM
  • Prämultiplizierte Alphadaten müssen verwendet werden. Dazu gehören ältere DDS-Dateien mit Formaten, die prämultipliziertes Alpha (DXT1, DXT2, DXT4) sowie DDS-Dateien explizit definieren, die die DDS_HEADER_DX10 Struktur mit den werten DDS_ALPHA_MODE_OPAQUE und DDS_ALPHA_MODE_PREMULTIPLIED verwenden.
  • Die X- und Y-Abmessungen müssen Vielfache von 4 Pixeln sein.
  • Volumentexturen, Cubemaps, Mipmaps oder Texturarrays sind nicht zulässig. Sie sollten nur Einzelframe-Quellbilder verwenden.

Generieren von blockkomprimierten Ressourcen

Es gibt eine Vielzahl von DDS-Erstellungstools zum Erstellen oder Konvertieren von blockkomprimierten DDS-Dateien. Beachten Sie, dass nicht alle Tools die Anforderungen für die Verwendung von DDS-Dateien mit Direct2D unterstützen, wie im vorherigen Abschnitt beschrieben.

Ab Visual Studio 2013 können Sie vorhandene visuelle Objekte wie JPEG und PNG als automatischen Teil des Buildprozesses in das richtige komprimierte DDS-Blockformat konvertieren. Dies wird mithilfe des benutzerdefinierten Buildschritts "Bildinhaltsaufgabe" erreicht.

Informationen zum Einrichten dieses Projekts finden Sie unter: How to: Export a Texture for Use with Direct2D or Javascipt Apps.

Direct2D-APIs

Direct2D wird in Windows 8.1 aktualisiert, um die folgenden Pixelformate zu unterstützen:

  • DXGI_FORMAT_BC1_UNORM
  • DXGI_FORMAT_BC2_UNORM
  • DXGI_FORMAT_BC3_UNORM

Für die vorstehenden Formate müssen Sie prämultipliziertes Alpha verwenden. Darüber hinaus gelten diese Formate nur für die Verwendung als Quelle, nicht für ein Ziel. Dies bedeutet z. B., dass Sie eine Direct2D-Bitmap mit BC1, aber keine Gerätekontexte erstellen können.

Die folgenden Methoden werden in Windows 8.1 aktualisiert, um BC-Formate zu unterstützen:

Beachten Sie, dass CreateBitmapFromWicBitmap-IWICBitmapSource- als Schnittstelle verwendet; In Windows 8.1 unterstützt WIC jedoch nicht das Abrufen von blockkomprimierten Daten aus IWICBitmapSource-, und es gibt kein WIC-Pixelformat, das DXGI_FORMAT_BC1_UNORM usw. entspricht. Stattdessen bestimmt CreateBitmapFromWicBitmap, ob die IWICBitmapSource- ein gültiger DDS-IWICBitmapFrameDecode ist und die komprimierten Blockdaten direkt lädt. Sie können entweder explizit das Pixelformat in der D2D1_BITMAP_PROPERTIES1 Struktur angeben oder Direct2D erlauben, das richtige Format automatisch zu bestimmen.

Windows Imaging Component APIs

Die Windows Imaging Component (WIC) fügt einen neuen DDS-Codec in Windows 8.1 hinzu. Darüber hinaus werden neue Schnittstellen hinzugefügt, die den Zugriff auf DDS-spezifische Daten unterstützen, einschließlich blockierter Pixeldaten:

Komprimierte WIC-Pixelformate blockieren

In Windows 8.1 gibt es keine neuen komprimierten WIC-Block-Pixelformate. Wenn Sie stattdessen einen IWICBitmapFrameDecode aus dem DDS-Decoder abrufen und CopyPixelsaufrufen, erhalten Sie standardmäßige nicht komprimierte Pixel wie WICPixelFormat32bppPBGRA. Sie können IWICDdsFrameDecode::CopyBlocks verwenden, um die komprimierten Rohblockdaten in Form eines Speicherpuffers aus einer DDS-Datei abzurufen.

Multiframe-DDS-Zugriff

Das DDS-Dateiformat ermöglicht die Speicherung mehrerer verwandter Bilder in einer einzelnen Datei. Eine DDS-Datei kann z. B. ein Cubemap-, Volumetextur- oder Texturarray enthalten, das alle Mipmappen enthalten kann. In Direct3D werden diese mehrere Bilder als Unterressourcen verfügbar gemacht. In WIC werden mehrere Bilder als Frames verfügbar gemacht (IWICBitmapFrameDecode und IWICBitmapFrameEncode).

WIC unterstützt nur den Begriff eines eindimensionalen Arrays von Frames, während DDS drei unabhängige Dimensionen unterstützt (obwohl nur zwei in einer Datei verwendet werden können). WIC bietet Komfortmethoden zur Unterstützung der Zuordnung zwischen einer DDS-Unterressource und einem WIC-Frame. Zum Decodieren können Sie IWICDdsDecoder::GetFrame den Arrayindex, die Mip-Ebene und den Segmentindex der Unterressource angeben und den richtigen WIC-Frame zurückgeben.

Für die Codierung berechnet IWICDdsEncoder::CreateNewFrame den resultierenden Arrayindex, die Mip-Ebene und den Segmentindex beim Erstellen eines neuen Frames. Sie müssen zuerst IWICDdsEncoder::SetParameters aufgerufen haben, um die DDS-spezifischen Dateiparameter zu definieren.

How to: Export a Texture for Use with Direct2D or Javascipt Apps

Referenz für DDS-

Blockkomprimierungs-