Direkter Zugriff auf Surface-Speicher (Direct3D 9)

Sie können direkt auf den Oberflächenspeicher zugreifen, indem Sie die IDirect3DSurface9::LockRect-Methode verwenden. Wenn Sie diese Methode aufrufen, ist der pRect-Parameter ein Zeiger auf eine RECT-Struktur , die das Rechteck auf der Oberfläche beschreibt, auf das direkt zugegriffen werden soll. Um anzufordern, dass die gesamte Oberfläche gesperrt wird, legen Sie pRect auf NULL fest. Außerdem können Sie ein RECT angeben, das nur einen Teil der Oberfläche abdeckt. Wenn keine zwei Rechtecke überlappen, können zwei Threads oder Prozesse gleichzeitig mehrere Rechtecke in einer Oberfläche sperren. Beachten Sie, dass ein Multisamplebackpuffer nicht gesperrt werden kann.

Die IDirect3DSurface9::LockRect-Methode füllt eine D3DLOCKED_RECT-Struktur mit allen Informationen, um ordnungsgemäß auf den Arbeitsspeicher der Oberfläche zuzugreifen. Die Struktur enthält Informationen zur Tonhöhe und verfügt über einen Zeiger auf die gesperrten Bits. Wenn Sie den Zugriff auf den Surface-Speicher abgeschlossen haben, rufen Sie die IDirect3DSurface9::UnlockRect-Methode auf, um sie zu entsperren.

Während Sie eine Oberfläche gesperrt haben, können Sie den Inhalt direkt bearbeiten. In der folgenden Liste werden einige Tipps beschrieben, um häufige Probleme beim direkten Rendern von Oberflächenspeicher zu vermeiden.

  • Gehen Sie niemals von einer konstanten Anzeigehöhe aus. Überprüfen Sie immer die Von der IDirect3DSurface9::LockRect-Methode zurückgegebenen Pitchinformationen. Diese Tonhöhe kann aus verschiedenen Gründen variieren, einschließlich der Position des Oberflächenspeichers, der Anzeige Karte Typs oder sogar der Version des Direct3D-Treibers. Weitere Informationen finden Sie unter Breite und Tonhöhe (Direct3D 9).
  • Stellen Sie sicher, dass Sie auf entsperrte Oberflächen kopieren. Direct3D-Kopiermethoden schlagen fehl, wenn sie auf einer gesperrten Oberfläche aufgerufen werden.
  • Schränken Sie die Aktivität Ihrer Anwendung ein, während eine Oberfläche gesperrt ist.
  • Kopieren Sie Daten immer auf den Anzeigespeicher ausgerichtet. Windows 98 verwendet den Seitenfehlerhandler Vflatd.386, um einen virtuellen Flatframepuffer für Anzeigekarten mit bankgeschaltetem Speicher zu implementieren. Der Handler ermöglicht es diesen Anzeigegeräten, Direct3D einen linearen Framepuffer zu präsentieren. Das Kopieren von Daten, die nicht in den Anzeigespeicher ausgerichtet sind, kann dazu führen, dass das System Vorgänge angehalten, wenn sich die Kopie über Speicherbanken erstreckt.
  • Eine Oberfläche ist möglicherweise nicht gesperrt, wenn sie zu einer Ressource gehört, die dem D3DPOOL_DEFAULT Speicherpool zugewiesen ist, es sei denn, es handelt sich um eine dynamische Textur oder eine Oberfläche, die mit IDirect3DDevice9::CreateOffscreenPlainSurface erstellt wurde. Zurückpufferoberflächen, auf die mit den Methoden IDirect3DDevice9::GetBackBuffer und IDirect3DSwapChain9::GetBackBuffer zugegriffen werden kann, können nur gesperrt werden, wenn die Swapchain mit dem Flags-Member von D3DPRESENT_PARAMETERS erstellt wurde, um D3DPRESENTFLAG_LOCKABLE_BACKBUFFER einzuschließen.

Direct3D-Oberflächen