Breite im Vergleich zur Neigung (Direct3D 9)
Obwohl die Begriffe Breite und Neigung häufig informell verwendet werden, haben sie sehr wichtige und deutlich andere Bedeutungen. Daher sollten Sie die Bedeutungen für jeden verstehen und die Werte interpretieren, die Direct3D verwendet, um sie zu beschreiben.
Direct3D verwendet die D3DSURFACE_DESC Struktur, um Informationen zur Beschreibung einer Oberfläche zu enthalten. Unter anderem wird diese Struktur definiert, um Informationen über die Abmessungen einer Oberfläche sowie die Darstellung dieser Dimensionen im Arbeitsspeicher zu enthalten. Die Struktur verwendet die Elemente "Height" und "Width", um die logischen Dimensionen der Oberfläche zu beschreiben. Beide Elemente werden in Pixel gemessen. Daher sind die Werte für Höhe und Breite für eine 640 x 480 Oberfläche identisch, unabhängig davon, ob es sich um eine 8-Bit-Oberfläche oder eine 24-Bit-RGB-Oberfläche handelt.
Wenn Sie eine Oberfläche mithilfe der IDirect3DSurface9::LockRect-Methode sperren, füllt die Methode eine D3DLOCKED_RECT Struktur aus, die den Neigungswinkel der Oberfläche und einen Zeiger auf die gesperrten Bits enthält. Der Wert im Pitch-Element beschreibt den Speicherabstand der Oberfläche, auch als Stride bezeichnet. "Pitch" ist der Abstand zwischen zwei Speicheradressen, die den Anfang einer Bitmapzeile und den Anfang der nächsten Bitmapzeile darstellen. Da die Neigung in Byte und nicht in Pixeln gemessen wird, weist eine 640x480x8-Oberfläche einen sehr anderen Neigungswert als eine Oberfläche mit denselben Dimensionen, aber ein anderes Pixelformat auf. Darüber hinaus spiegelt der Pitch-Wert manchmal Bytes wider, die Direct3D als Cache reserviert hat. Daher ist es nicht sicher, anzunehmen, dass die Breite nur die Breite multipliziert mit der Anzahl der Bytes pro Pixel ist. Visualisieren Sie stattdessen den Unterschied zwischen Breite und Neigung, wie im folgenden Diagramm dargestellt.
In diesem Diagramm sind der Frontpuffer und der Hintergrundpuffer 640x480x8, und der Cache beträgt 384x480x8.
Achten Sie beim direkten Zugriff auf Oberflächen darauf, den für die Abmessungen der Oberfläche zugewiesenen Speicher zu behalten und nicht genügend Arbeitsspeicher für den Cache zu verwenden. Wenn Sie nur einen Teil einer Oberfläche sperren, müssen Sie außerdem innerhalb des Rechtecks bleiben, das Sie beim Sperren der Oberfläche angeben. Wenn Sie diese Richtlinien nicht einhalten, werden unvorhersehbare Ergebnisse erzielt. Verwenden Sie beim direkten Rendern im Oberflächenspeicher immer den von der IDirect3DSurface9::LockRect Methode zurückgegebenen Pitch. Gehen Sie nicht davon aus, dass ein Neigungswinkel ausschließlich auf dem Anzeigemodus basiert. Wenn Ihre Anwendung auf einigen Anzeigeadaptern funktioniert, aber auf anderen angezeigt wird, kann dies die Ursache des Problems sein.
Weitere Informationen finden Sie unter Zugreifen auf Surface Memory Direkt (Direct3D 9).
Verwandte Themen