私は、directxdllを挿入して画像を取得するゲームを持っています。それが私が画像ビットをつかむ方法です:
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
2番目のフレームでは、rtDescは次のようになります。
rtDesc.Format = 1280070990
rtDesc.width = 1
rtDesc.height = 1
その後、次のフレームはすべて正常になり、次のフレームは再び「1280070990」になります。
なぜこのように動作するのか、何か提案はありますか?2つの異なるレンダラーがありますか?
また、「dumb_buffer(..)」でインジェクションとフレームグラブを開始すると、ゲームのフレームレートが低下し、ゲームがジャダーします。
こちらも2つのスクリーンショットです。
luna-arts.de/others/misc/1.jpg
luna-arts.de/others/misc/2.jpg
1x1のサーフェスが作成された1秒ごとのフレーム/実行のように見えます。
GetRenderTarget(..)およびGetDesc(..)の戻り値はD3D_OKです。
ゲーム(VBS2)はSLIグラフィックカードをサポートしていますが、この1x1サーフェスが2番目のグラフィックカードのプレースホルダーのようなものである可能性はありますか?私は今、1枚のグラフィックカードで仕事をしています。
デバイスは常に同じですが、renderTargetのアドレスは、スクリーンショットに表示されている2つのアドレス間で切り替わります。したがって、2つのrenderTargetがあるように見えます。
「if(...)」のコードは機能していますが、フレームレートが低下し、ゲームが混乱します。この問題を解決する方法はありますか?
このゲームの古いバージョンでは、すべてが正常に機能しました。
また、ゲームのメニューにいる限り、renderTargetは1つだけで、すべてが正常に機能しますが、レベルを開始するとすぐに2番目のrenderTargetが表示されます。
どうもありがとう
よろしくデニス