首页 > 解决方案 > 如何在不使用 LockRect 的情况下获取像素数据?(性能问题)

问题描述

我正在使用某人在 StackOverflow 上发布的这些功能,但性能太差了..

不使用此功能(不捕获像素)FPS显示超过6k,但使用此功能,FPS仅显示60!

那么有没有什么快速的方法可以在显存和系统内存之间进行复制呢?

请问有人吗?

HRESULT capture(IDirect3DDevice9* m_d3ddev, void* buffer, int& width, int& height, D3DFORMAT format)
{
    IDirect3DSurface9 *renderTarget = NULL;
    IDirect3DSurface9 *destTarget = NULL;
    HRESULT hr = m_d3ddev->GetRenderTarget(0, &renderTarget);
    hr = m_d3ddev->CreateOffscreenPlainSurface(width, height, format, D3DPOOL_SYSTEMMEM, &destTarget, NULL);
    if (FAILED(hr))
    {
        printf("Failed  CreateOffscreenPlainSurface!");
    }
    hr = m_d3ddev->GetRenderTargetData(renderTarget, destTarget);
    if (FAILED(hr))
    {
        printf("Failed  GetRenderTargetData!");
    }

    D3DLOCKED_RECT lr;
    ZeroMemory(&lr, sizeof(D3DLOCKED_RECT));
    hr = destTarget->LockRect(&lr, 0, D3DLOCK_READONLY);
    if (FAILED(hr))
    {
        printf("Cannot lock rect!");
    }

    if (lr.pBits)
    {
        memcpy(buffer, lr.pBits, width * height * 4);
    }

    hr = destTarget->UnlockRect();
    if (FAILED(hr))
    {
        printf("Cannot unlock rect!");
    }
    renderTarget->Release();
    destTarget->Release();
    return hr;
}

标签: c++directx-9

解决方案


推荐阅读