直接访问 Surface 内存 (Direct3D 9)

可以使用 IDirect3DSurface9::LockRect 方法直接访问 Surface 内存。 调用此方法时,pRect 参数是指向 RECT 结构的指针,该结构描述要直接访问的图面上的矩形。 若要请求锁定整个图面,请将 pRect 设置为 NULL。 此外,还可以指定仅覆盖图面一部分的 RECT 。 如果两个矩形没有重叠,则两个线程或进程可以同时锁定图面中的多个矩形。 请注意,无法锁定多重采样后台缓冲区。

IDirect3DSurface9::LockRect 方法使用所有信息填充D3DLOCKED_RECT结构,以便正确访问表面内存。 结构包含有关音调的信息,并具有指向锁定位的指针。 完成访问 Surface 内存后,请调用 IDirect3DSurface9::UnlockRect 方法来解锁它。

锁定图面时,可以直接操作内容。 以下列表介绍了一些用于避免直接呈现表面内存的常见问题的提示。

  • 永远不要假设有恒定的显示间距。 始终检查 IDirect3DSurface9::LockRect 方法返回的音调信息。 此音调可能会因多种原因而有所不同,包括表面内存的位置、显示器卡类型,甚至 Direct3D 驱动程序的版本。 有关详细信息,请参阅 宽度与间距 (Direct3D 9)
  • 确保复制到未锁定的图面。 如果在锁定的图面上调用 Direct3D 复制方法,则会失败。
  • 在锁定图面时限制应用程序的活动。
  • 始终复制与显示内存对齐的数据。 Windows 98 使用页面错误处理程序 Vflatd.386 为具有银行切换内存的显示卡实现虚拟平面帧缓冲区。 处理程序允许这些显示设备向 Direct3D 呈现线性帧缓冲区。 如果复制数据跨内存库,则复制未对齐以显示内存可能会导致系统挂起操作。
  • 如果图面属于分配给D3DPOOL_DEFAULT内存池的资源,则它可能不会锁定,除非它是动态纹理或使用 IDirect3DDevice9::CreateOffscreenPlainSurface 创建的图面。 仅当使用 IDirect3DDevice9::GetBackBufferIDirect3DSwapChain9::GetBackBuffer 方法访问的后台缓冲区图面,仅当使用 D3DPRESENT_PARAMETERS 的 Flags 成员创建交换链以包含D3DPRESENTFLAG_LOCKABLE_BACKBUFFER时,才能锁定。

Direct3D Surfaces