直接存取 Surface Memory (Direct3D 9)

您可以使用 IDirect3DSurface9::LockRect 方法直接存取表面記憶體。 當您呼叫此方法時,pRect 參數是 RECT 結構的指標,描述直接存取介面上的矩形。 若要要求將整個表面鎖定,請將 pRect 設定為 Null。 此外,您也可以指定只涵蓋部分表面的 RECT 。 如果沒有兩個矩形重迭,兩個執行緒或進程可以同時鎖定介面中的多個矩形。 請注意,無法鎖定多重取樣備份緩衝區。

IDirect3DSurface9::LockRect方法會填入D3DLOCKED_RECT結構,並填入所有資訊,以正確存取表面記憶體。 結構包含音調的相關資訊,而且具有鎖定位的指標。 當您完成存取表面記憶體時,請呼叫 IDirect3DSurface9::UnlockRect 方法來解除鎖定它。

當表面鎖定時,您可以直接操作內容。 下列清單描述一些避免直接轉譯表面記憶體常見問題的秘訣。

  • 絕對不要假設常數顯示間距。 一律檢查 IDirect3DSurface9::LockRect 方法傳回的音調資訊。 此音調可能會因為許多原因而有所不同,包括表面記憶體的位置、顯示卡類型,或甚至是 Direct3D 驅動程式的版本。 如需詳細資訊,請參閱 Width 與 Pitch (Direct3D 9)
  • 請確定您複製到解除鎖定的介面。 如果在鎖定的介面上呼叫 Direct3D 複製方法,將會失敗。
  • 在表面鎖定時限制應用程式的活動。
  • 一律複製對齊的資料以顯示記憶體。 Windows 98 使用分頁錯誤處理常式 Vflatd.386 來實作虛擬平面框架緩衝區,以用於具有銀行切換記憶體的卡片。 處理常式可讓這些顯示裝置向 Direct3D 呈現線性框架緩衝區。 複製未對齊的資料以顯示記憶體可能會導致系統在複製跨越記憶體銀行時暫停作業。
  • 如果介面屬於指派給D3DPOOL_DEFAULT記憶體集區的資源,除非它是動態紋理,或是使用 IDirect3DDevice9::CreateOffscreenPlainSurface建立的介面,否則它可能無法鎖定。 使用 IDirect3DDevice9::GetBackBufferIDirect3DSwapChain9::GetBackBuffer 方法存取的背景緩衝區介面,只有在交換鏈結是使用 D3DPRESENT_PARAMETERS 旗標成員建立,才能鎖定 D3DPRESENTFLAG_LOCKABLE_BACKBUFFER

Direct3D 表面