【问题标题】:how to get a back buffer copy inside the video memory?如何在视频内存中获取后台缓冲区副本?
【发布时间】:2015-06-04 15:41:45
【问题描述】:

现在我可以通过

获得名为 pBackBuffer 的后备缓冲区指针
m_pDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, 
    IREF_GETPPTR(pBackBuffer,IDirect3DSurface9));

然后在系统内存中创建一个名为 pSurfTemp 的表面

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

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

我想复制显存里面的数据,怎么办?

【问题讨论】:

    标签: directx direct3d directx-9


    【解决方案1】:

    如果我理解正确,你会想要CreateOffscreenPlainSurface()D3DPOOL_DEFAULT 标志,所以驱动程序会自动选择合适的内存位置。但它从不保证它永远是显卡的板载内存。

    顺便说一句,premature optimization is the root of all evil。 =)

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

    【讨论】:

    • 是的...我试过了。由于GetRenderTargetData 无法获取使用D3DPOOL_DEFAULT 创建的Surface,因此我使用了LoadSurfaceFromSurface。但它甚至更慢。不知道为什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多