Directx 如何在视频内存中获取备份缓冲区副本?

Directx 如何在视频内存中获取备份缓冲区副本?,directx,direct3d,directx-9,Directx,Direct3d,Directx 9,现在我可以通过 m_pDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, IREF_GETPPTR(pBackBuffer,IDirect3DSurface9)); 然后在系统内存中通过 m_pDevice->CreateOffscreenPlainSurface( g_Proc.m_Stats.m_SizeWnd.cx, g_Proc.m_Stats.m_SizeWnd.cy, s_bbFormat

现在我可以通过

m_pDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, 
    IREF_GETPPTR(pBackBuffer,IDirect3DSurface9));
然后在系统内存中通过

m_pDevice->CreateOffscreenPlainSurface(
    g_Proc.m_Stats.m_SizeWnd.cx, g_Proc.m_Stats.m_SizeWnd.cy, 
    s_bbFormat, D3DPOOL_SYSTEMMEM, 
    IREF_GETPPTR(pSurfTemp,IDirect3DSurface9), NULL );
然后我通过

m_pDevice->GetRenderTargetData(pBackBuffer, pSurfTemp);
数据似乎是这样变化的:videoMemory->systemMemory

由于下一步是再次操作视频内存中的数据,它将把数据从系统内存复制回视频内存。它浪费时间


我想复制视频内存中的数据,我该怎么做?

如果我理解正确,您将需要使用标志,这样驱动程序将自动选择合适的内存位置。但它从未保证它永远是显卡的车载存储器

顺便说一下,。=)


编辑:另一个选项是将API从DirectX 9(已过时)切换到DirectX 11,这允许更精确的资源操作。此外,OpenGL也介于两者之间。两者都是一个巨大的代码重写。

如果我理解正确,您将希望使用标志,所以驱动程序将自动选择适当的内存位置。但它从未保证它永远是显卡的车载存储器

顺便说一下,。=)


编辑:另一个选项是将API从DirectX 9(已过时)切换到DirectX 11,这允许更精确的资源操作。此外,OpenGL也介于两者之间。两者都是一个巨大的代码重写。

是的……我已经试过了。由于无法获取使用创建的曲面,因此我改用LoadSurfaceFromSurface。但速度更慢。不知道为什么。是的……我试过了。由于无法获取使用创建的曲面,因此我改用LoadSurfaceFromSurface。但速度更慢。不知道为什么。