1

XNA/WinFormsに基づく既存のタイルマップエディターをWPFに移行する作業を行っています。私はWPFにかなり慣れていませんが、ほとんどの概念を理解するのはそれほど難しくありません。(Viewbox)から派生したOnRenderメソッドによって提供されるDrawingContextのDrawImageメソッドを使用して、マップを描画するために、ViewboxをScrollViewerに埋め込みます。問題は、かなり大量のタイルが画面に表示されている場合(私のマシンでは> 1000)、XNA/WinFormバージョンとほぼ同じパフォーマンスを達成できないことです。ズームとパンを実装しましたが、ズームアウトしすぎたり、画面に大量のタイルが表示されているときにパンしたりすると、ユーザーエクスペリエンスを損なう大きなラグが発生します。私はいくつかの明白な最適化対策を講じました(ソースビットマップのフリーズ、見えないタイルのカリング、ビットマップスケーリングモードのLowQualityへの設定、キャッシュキャッシュのヒントを提供します)が、問題を解決していないようです。問題は明らかに、WPFがDrawingContextを使用してテクスチャクワッドの描画を処理する方法にあります。

問題を再現するために必要なすべてのコードを含むサンプルアプリケーションを提供しました:SampleGridDrawingExample

マウスの中ボタンを押したまま、マウスを動かしてパンします。ウィンドウのサイズが大きくなるにつれて、それはますます目立つようになります(明らかに、より多くのタイルがレンダリングされているためです)。

妥当なパフォーマンスで大量のテクスチャクワッドを描画するために、WPF内でDrawingContextよりも高速な方法はありますか?XNA / WinFormsを使用すると、妥当なラグで複数のレイヤーに最大50000のタイルを描画できますが、現在のアプローチを使用するWPFでは、1000を超えると顕著なラグが発生します(> 10000はアプリケーションをクロールします)。

4

3 に答える 3

1

WPFはハードウェアアクセラレーションを使用しますが、非常に非効率的です。すべてに対してドローコールが多すぎます。その3Dレンダリング機能は、ヘビーデューティーレンダリング(数万の個別要素の描画など)ではなく、ユーザーインターフェイスを強化することを目的としています。コードを最適化できる可能性はありますが、XNAが提供するパフォーマンスのレベルにはほど遠いことは確かです。

より良いオプションは、WPFでエディターを構築することですが、レンダラーをXNAに保持し、エディター内でホストします。

于 2012-05-30T20:27:27.817 に答える
0

私はあなたのサンプルをダウンロードしましたが、私にとっては問題なく動作し、大きなパフォーマンスの遅れはありません. ただし、パフォーマンスを監視すると、マウスが移動するたびに実行する計算に何らかのボトルネックがあるようです。添付のスクリーンショットを参照してください。これは、マウスを頻繁に動かしたとき (画像の左半分) とあまり動かさなかったとき (右半分) の CPU 使用率を示しています。

CPU使用率

遅くするのはレンダリングではなく、イベント ハンドラ内の他のコードだと思います。確認するために、RenderOptions.ProcessRenderMode = System.Windows.Interop.RenderMode.SoftwareOnly;私のマシンでまったく同じように動作するように設定しました (良い CPU、適度な GPU)。Memleakの問題についてもこれを確認しましたが、それに関しては問題ないようです-私の64ビットウィンドウでは、メモリ使用量が64メガバイトを超えることはなく、ガベージコレクションが時々リソースを効果的に解放します.

以前のソリューションについて言及しています。そのソリューションのどの部分が XNA に基づいていましたか? XNA はハードウェア アクセラレーションに依存しています (デフォルトでは WPF もそうです)。 一方、WinForms は純粋に CPU アクセラレーションです。CPU と GPU のどちらが古い魔法を実行しますか?

于 2012-05-29T06:38:53.950 に答える
0

現在のところ、WPF だけでは XNA のパフォーマンスに近づくことはできないようです。しかし、XNA 統合に関する Nick Gravelyns の投稿を見て、そこにリストされている方法を使用することに決めました。パフォーマンスは、私が開発しているアプリケーションにとって許容できるものだからです。サンプルに少し変更を加えてストレス テストを行った後、製品コードに十分な安定性を持たせることができました。XNA->WPF の統合に関心のある方は、この投稿をご覧になることを強くお勧めします。

于 2012-05-31T20:20:45.720 に答える