我有一个游戏,我在其中注入了一个 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。
多谢
问候丹尼斯