我有 IDirect3DSurface9,默认池,YUV 格式。如何有效地从中获取位图位?目前我:
- 创建渲染目标:
device->CreateRenderTarget(surf_desc.Width, surf_desc.Height, D3DFMT_A8R8G8B8, D3DMULTISAMPLE_NONE, 0, TRUE, &render_target, NULL)
- 将 YUV 转换为 RGB32:(
device->StretchRect(videomem_surf, NULL, render_target_, NULL, D3DTEXF_NONE)
完整的矩形,无拉伸)
- 在系统内存中创建普通的屏幕外表面
device->CreateOffscreenPlainSurface(surf_desc.Width, surf_desc.Height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &sysmem_offscreen_surf, NULL)
- 将数据从视频内存复制到系统内存:
device->GetRenderTargetData(render_target, sysmem_offscreen_surface)
- GetDC 从屏幕外表面,创建兼容 DC 和兼容位图,BitBlt 从屏幕外表面 DC 到兼容 DC,并通过 GetDIBits() 将位图位复制到我的缓冲区
这看起来有点开销,因为有很多复制:从原始表面到渲染目标,然后到屏幕外表面,然后到兼容位图,最后到我的缓冲区。如何改进?
谢谢