我有一个游戏,我注入一个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();
}
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现在看起来像这样:
rtDesc.Format = D3DFMT_R32F
rtDesc.width = 1920
rtDesc.height = 1200
rtDesc.Format = D3DFMT_R32F
rtDesc.width = 1920
rtDesc.height = 1200
然后下一帧一切都很好,下一帧又是“1280070990”。
为什么表现如此? 有两种不同的渲染器吗?
另外,如果我开始注射并使用“dumb_buffer(..)”进行帧抓取,游戏中的帧率会下降并且游戏抖动。
这里还有两个截图:
luna-arts.de/others/misc/1.jpg
luna-arts.de/others/misc/2.jpg
看起来每个第二帧/运行都会创建一个1x1 Surface。
GetRenderTarget(..)和GetDesc(..)的返回值为 D3D_OK
游戏(VBS2)支持SLI图形卡,这个1x1 Surface是否可能像第二张图形卡的占位符?我现在正用一张图形卡进行操作。
设备始终相同,但renderTarget的地址在屏幕截图中看到的两个地址之间切换。所以看起来有两个renderTargets。
带有“if(...)”的代码正在运行,但帧速率下降且游戏抖动。我有什么想法可以解决这个问题吗?
在这个游戏的旧版本中一切正常。
此外,只要我在游戏菜单中只有一个renderTarget,一切正常,但只要我开始一个Level,就会出现第二个renderTarget。
非常感谢
关心丹尼斯