具体的な質問があります。
ウィンドウのサイズを変更して解像度を変更した後、SlimDX9 デバイスをリセットしようとしています。すべてが Pool.Managed にあり、Fonts も Stateblocks もありません。すべてが機能しますが、テクスチャ + サーフェス + RenderToSurface の組み合わせです。後で後処理するために、シェーダーの renderTarget としてテクスチャが必要なので、バックバッファと同様にクライアント サイズに合わせてサイズ変更する必要があります。
私は次のようなコンボを作成します:
rtTexture = new Texture(this.Device, this.owner.ClientSize.Width, this.owner.ClientSize.Height, 1, Usage.RenderTarget, Format.A8R8G8B8, Pool.Default);
rtSurface = rtTexture.GetSurfaceLevel(0);
rtHelper = new RenderToSurface(this.Device, this.owner.ClientSize.Width, this.owner.ClientSize.Height, Format.A8R8G8B8, Format.D24S8);
ウィンドウのサイズが変更されると、私は
rtTexture.Dispose();
rtSurface.Dispose();
そして私は両方を試しました
rtHelper.OnLostDevice();
と
rtHelper.Dispose();
もちろん、Device.Reset(getParameters()) の後、リソースを再作成するか、rtHelper.OnResetDevice() を呼び出しますが、どちらも機能しませんでした。Dispose()s と OnDeviceLost() で可能なすべての組み合わせを試しました。
リセットに失敗し、通常の InvalidCall の後、このメッセージが表示されました
All user created D3DPOOL_DEFAULT surfaces must be freed before ResetEx can succeed. ResetEx Fails.
だから私はアプリケーションを PIX し、テクスチャもサーフェスも破棄されていないことを発見しました (破棄された列には「決して」ありません) .Dispose() がこれらのオブジェクトの両方で明示的に呼び出され、IsDisposed が true であるという事実にもかかわらずDevice.Reset()。
コンボを削除すると、リセットがうまくいきます。問題は、RenderToSurface リセットおよび/またはテクスチャ + サーフェスのどこかにあります。
RenderToSurface を次のように使用します。
rtHelper.BeginScene(rtSurface, new Viewport(0, 0, this.owner.ClientSize.Width, this.owner.ClientSize.Height));
{
Device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, FogColor, 1, 0);
terrainEffect.BeginPass(0);
RenderTiles();
terrainEffect.EndPass();
}
rtHelper.EndScene(Filter.None);
それは可能ですか?SlimDX のバグですか?私に何ができる?管理されていないリソースに何らかの方法でアクセスして、手動で破棄することはできますか?
助けてください、次に何をすべきかわかりません。これについての回答をいただければ幸いです。ありがとう。
編集: RenderToSurface を回避して Device.get/setRenderTarget() を使用しようとしましたが、問題が解決しません。サーフェスとテクスチャは、Device.Reset() の前に Dispose() によって破棄されません。