共用方式為


直接存取 Surface 記憶體 (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 的 Flags 成員創建,並且包括 D3DPRESENTFLAG_LOCKABLE_BACKBUFFER 時,這些緩衝區才能被鎖定。

Direct3D Surfaces