Freigeben über


Bitmapblockkomprimierung

CanvasBitmap unterstützt komprimierte Blockbitmaps. Diese können aus einer DDS-Datei geladen oder mit CreateFromBytes(ICanvasResourceCreator,Byte[], Int32, Int32, DirectXPixelFormat).

Blockkomprimierte Bitmaps eignen sich hervorragend für bitmapintensive Anwendungen (z. B. Spiele), da sie weniger Arbeitsspeicher belegen und effizienter gezeichnet werden können. Eine komprimierte Blockbitmap verwendet bis zu 1/8 des Speichers einer nicht komprimierten Bitmap. Daher muss die GPU beim Zeichnen der Bitmap auf viel weniger Arbeitsspeicher zugreifen, was zu einer schnelleren Zeichnung führt.

Informationen zur Blockkomprimierung

Die Blockkomprimierung unterscheidet sich von der Komprimierung, die von PNG- oder JPG-Dateien verwendet wird. Komprimierte Dateiformate werden komprimiert gespeichert, aber wenn sie von Win2D geladen werden, werden sie in eine Bitmap mit einem Format wie z DirectXPixelFormat::B8G8R8A8UIntNormalized. B. 32 Bit (4 Bytes) pro Pixel dekomprimiert. Eine Bitmap von 256 x 256 würde also 256 * 256 * 4 = 262,144 Bytes beanspruchen.

Eine komprimierte Blockbitmap verwendet 8 oder 16 Bytes (je nach Format – mehr zu diesem späteren Zeitpunkt), um einen Block von 4 x 4 Pixeln zu speichern. In diesem Fall würde eine 256x256-Bitmap also 256 * 256 * 256 / (4 * 4) * 8 = 32.768 Bytes oder 256 * 256 / (4 * 4) * 16 = 65,536 Bytes aufnehmen. Das ist bis zu 8 Mal kleiner! Da die Blockkomprimierung direkt von der GPU-Hardware unterstützt wird, kann die Bitmap im Arbeitsspeicher komprimiert und direkt aus dem komprimierten Format gezeichnet werden, ohne es vollständig entkomprimieren zu müssen.

Win2D unterstützt drei komprimierte Blockformate. In der folgenden Tabelle werden diese Formate zusammen mit einem nicht komprimierten Format für den Vergleich beschrieben.

DirectXPixelFormat Größe von 4x4 Bitmap Größe von 256 x 256 Bitmap Alpha
BC1Unorm 8 Byte 32.768 Bytes 1 Bit
BC2Unorm 16 Bytes 65.536 Byte 4 Bit
BC3Unorm 16 Bytes 65.536 Byte ~8 Bit (komprimiert)
B8G8R8A8UintNormalized 64 Bytes 262.144 Bytes 8 Bit

BC1Unorm, und BC3Unorm unterscheiden sie sich hauptsächlich darin, BC2Unorm wie sie Alpha unterstützen. BC1 unterstützt nur 1-Bit-Alpha. BC2 unterstützt jedes Pixel im Block mit einem eindeutigen 4-Bit-Alphawert. BC3 komprimiert die Alphawerte.

Weitere Informationen zur Funktionsweise der Blockkomprimierung finden Sie in der Dokumentation zur Direct2D-Blockkomprimierung und der Direct3D-Blockkomprimierung .

Beschränkungen

  • Alle blockkomprimierten Texturen müssen eine Breite und Höhe aufweisen, die ein Vielfaches von 4 ist. Dies liegt daran, dass die Blockkomprimierung auf Blöcken von 4 x 4 Pixeln funktioniert.
  • Jeder Vorgang auf einem Unterrechteck einer komprimierten Blocktextur (mit GetPixelBytes(), SetPixelBytes(Byte[])mit , CopyPixelsFromBitmap(CanvasBitmap, Int32, Int32)) erfordert, dass das Unterrechteck 4 Pixel ausgerichtet ist.
  • Win2D erfordert prämultipliziertes Alpha bei Verwendung von blockkomprimierten Formaten.

Erstellen von DDS-Dateien

Blockkomprimierte Bilder können in DDS-Dateien gespeichert werden. Obwohl diese von Plug-Ins für Anwendungen wie Photoshop oder Paint.NET generiert werden können, müssen Sie darauf achten, dass die resultierende Datei mit prämultiplizierten Alpha gespeichert wird. Win2D lädt alle DDS-Dateien, die ein BC1Unormoder BC3Unorm BC2Unorm ein Bild enthalten, und gehen davon aus, dass sie mit prämultipliziertem Alpha erstellt wird.

Wenn Sie ein C++-Projekt erstellen, können Sie das Bild mithilfe der Bildinhaltspipeline konvertieren, wie auf MSDN beschrieben.

Alternativ können texconv.exe Sie von https://github.com/Microsoft/DirectXTex. texconv.exe kann mithilfe der DirectXTex_Desktop_2015.sln Lösung erstellt werden. Mit dem folgenden Befehl wird "smoke.png" in ein BC3Unorm mit prämultipliziertem Alpha konvertiert:

texconv -pmalpha -m 1 -f BC3_UNORM smoke.png