Bitmapblockkomprimierung

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

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 in komprimierter Form gespeichert, aber wenn sie von Win2D geladen werden, werden sie in eine Bitmap in einem Format wie z. B. DirectXPixelFormat::B8G8R8A8UIntNormalized dekomprimiert, das 32 Bit (4 Byte) pro Pixel verwendet. 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 der 4×4-Bitmap Größe der Bitmap 256x256 Alpha
BC1Unorm 8 Bytes 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, BC2Unorm und BC3Unorm unterscheiden sich hauptsächlich darin, 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 .

Einschrä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 an einem Unterrechteck einer blockkomprimierten Textur (mit GetPixelBytes(), SetPixelBytes(Byte[]), CopyPixelsFromBitmap(CanvasBitmap, Int32, Int32)) erfordert, dass das Unterrechteck an 4-Pixel-Grenzen ausgerichtet ist.
  • Win2D erfordert prämultipliziertes Alpha bei der 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 jede DDS-Datei, die ein BC1Unorm-, BC2Unorm- oder BC3Unorm-Bild enthält, und geht davon aus, dass sie mit prämultipliziertem Alpha erstellt wurde.

Wenn Sie ein C++-Projekt erstellen, können Sie das Bild mithilfe der Bildinhaltspipeline konvertieren, wie in der dokumentation Visual Studio beschrieben.

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

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