2

具体的な質問があります。

ウィンドウのサイズを変更して解像度を変更した後、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() によって破棄されません。

4

1 に答える 1

1

私はそれを理解しました!同じ問題が発生している場合:

1 つのシェーダ パスで作成されたテクスチャを使用し、それをシェーダに割り当てて 2 番目のパスで使用する場合は、使用した後 (前Device.Present()) にテクスチャを に設定してくださいnull。そのようです:

terrainEffect.SetTexture(hRTTexture, null);

hRTTextureテクスチャのハンドラーです。シェーダーはテクスチャをロックしているようで、シェーダーがこのロックを持っている場合、SlimDX はそのようなテクスチャ (および関連するサーフェス) を破棄できません。

これが誰かに役立つことを願っています。

于 2013-01-05T01:43:04.823 に答える