1

大量のテクスチャ セットを RenderTexture2D に事前レンダリングしていますが、これが問題です。

XNA でのレンダリングの問題

チャンクのレンダリング中にランダムに、各セル (上部と側面) のテクスチャが破損して消えるようです。奇妙なことに、次のチャンクがレンダリングされると戻ってくるので、フレームごとに発生しているようです。

なぜこれが起こるのか誰か知っていますか (そしてランダムに見えます;白い長方形は側面のテクスチャが壊れている場所であり、そこからテクスチャに透明なだけが含まれていることがわかります)?

編集:立方体の側面は Texture2D に保存されていますが、チャンク レンダリングの途中で消えてしまい、次のレンダリングに戻ります。したがって、再初期化せずに Texture2D にあるグラフィックが消えて戻ってくる理由がわかりません (それが奇妙な部分です)。

4

2 に答える 2

1

RenderTexture2D は一時的なメモリ コンストラクトにすぎず、非常に迅速かつ定期的にフラッシュされます。これは、メモリを節約するために再利用され、スピードアップの程度が低いためです。そのため、テクスチャを保存する非常に一時的な場所としてのみ扱う必要があります。より長く保存される適切な Texture2D にシフトする必要があります。簡単なことをするだけです:

Texture2D YourPic = (RenderTexture2D)SomeRenderedPic;

しません。これは、ポインタをレンダリングされたイメージのメモリ空間に渡すだけです。グラフィックカードがそれを破棄すると、それは消えてしまいます。あなたがしたいことは、次のようなものです:

Color[] MyColorArray = new Color[SomeRenderedPic.Width * SomeRenderedPic.Height];
SomeRendeerPic.GetData<Color>(MyColorArray);
Texture2D YourPic = new Texture2D(
        GraphicsDevice,
        SomeRenderedPic.Width,
        SomeRenderedPic.Height);
YourPic.SetData<Color>(MyColorArray);

そのコードを正しく作成した場合、ポインタではなくデータを新しいテクスチャに格納する必要があります。これにより、新しいテクスチャは、レンダー ターゲット スペースと同じようにフラッシュされない独自のメモリ スペースになります。

この方法にはマイナス面があります。XNA のフル リフレッシュ レートでは実行できません。(1 秒あたり 60 フレームのようなもの... たぶん 30 フレームだと思います... 忘れてしまいました。) いずれにせよ、非常に一定のリフレッシュが必要な場合、これは十分な速度ではない可能性があります。ただし、実際にはあまり変化しない静的テクスチャを作成している場合は、これでうまくいく可能性があります。

私はその場で夜遅くにこれを書いているので、うまくいけばこれは理にかなっています. これが機能しない場合は、お詫び申し上げます。必要に応じて、jareth_gk@hotmail.com までご連絡ください。あなたの質問に答えることができれば、喜んでお答えします。

それ以外の場合は、幸運を祈り、創意工夫してください。解決策があると確信しています。

×ジェレミーM.

于 2012-08-14T07:29:46.133 に答える
0

この問題を確実に解決したとは言えませんが、タスクを複数のサイクルにスレッド化または分割したことが原因のようです。RenderTarget2D に関しては、その時点で既に行っていたので問題ありませんでした。

于 2012-11-28T08:30:49.430 に答える