0

我有一个游戏,我在其中注入了一个 directx dll 来抓取图像。这就是我抓取图像位的方式:

void dumb_buffer(LPDIRECT3DDEVICE9 pDevice){

    ret = pDevice->GetRenderTarget(0,&pRenderTarget);
    ret = pRenderTarget->GetDesc(&rtDesc);

    pDevice->CreateOffscreenPlainSurface(rtDesc.Width, rtDesc.Height,rtDesc.Format,   
                                            D3DPOOL_DEFAULT, &pDestTarget, NULL);


    pDevice->GetRenderTargetData(pRenderTarget,pDestTarget);

    if(pDestTarget != NULL){
       pDestTarget->LockRect(&rect,0, D3DLOCK_READONLY);
       bits = (unsigned char*)rect.pBits;
       pDestTarget->UnlockRect();
       pDestTarget->Release();
    }

    pRenderTarget->Release();
}

在第一帧中,一切正常,rtDesc 看起来像这样:

rtDesc.Format = D3DFMT_R32F
rtDesc.width = 1920
rtDesc.height = 1200 

在第二帧 rtDesc 现在看起来像这样:

rtDesc.Format = 1280070990
rtDesc.width = 1
rtDesc.height = 1 

然后下一帧一切都很好,下一帧又是“1280070990”。

有什么建议为什么它会这样?有两种不同的渲染器吗?

此外,如果我使用“dumb_buffer(..)”开始注入和帧抓取,游戏中的帧速率会下降并且游戏会抖动。

这里还有两张截图:

luna-arts.de/others/misc/1.jpg

luna-arts.de/others/misc/2.jpg

看起来每第二帧/运行都会创建一个 1x1 表面。

GetRenderTarget(..) 和 GetDesc(..) 的返回值为D3D_OK

游戏 (VBS2) 支持 SLI 显卡,这个 1x1 表面是否可能类似于第二张显卡的占位符?我现在正在使用一张显卡。

设备始终相同,但 renderTarget 的地址在屏幕截图中看到的两个地址之间切换。所以看起来有两个渲染目标。

带有“if(...)”的代码正在运行,但帧率下降并且游戏抖动。有什么想法可以解决这个问题吗?

在这个游戏的旧版本中,一切正常。

此外,只要我在游戏的菜单中,只有一个 renderTarget 并且一切正常,但是一旦我启动一个关卡,就会出现第二个 renderTarget。

多谢

问候丹尼斯

4

0 回答 0