私はキャンバスにポリゴンを追加し、ディスパッチャーが各ポリゴンの位置をランダムに更新するベンチマークテストを作成しました。私は30fps以下のfpsを測定するまでこれを行いました。私は何かに気づいた、ベンチマークdoesntはGPUを使用するようだ。私はrendercapability 2を持っていますが、avalon.graphics registretを使ってハードウェアアクセラレーションを動かすと同じ結果になります。私にとってこれは、rendercapability 2と良いGPUがあっても、キャンバスコンテナを持つItemsControlのソフトウェアレンダリングとPolygonsを子として持つobservablecollectionを選択しているようです。 (30fps以下になる前に3500ポリゴンが追加されます)。私がここで理解していないものはありますか?グラフィックスハードウェアを利用するには、他の形状やレンダリングループを使用する必要がありますか?ハードウェアアクセラレーションを強制する
0
A
答えて
0
プロファイラで確認する必要がありますが、オーバーヘッドの大部分は、実際のラスタライズ(ハードウェアが役立つ部分)ではなくベクトルグラフィックスバッファを満たすコードにあると思われます。ポリゴンを移動しようとせずに新しいポリゴンを追加し続けると、ラスタライズのオーバーヘッドが改善されます。
つまり、ItemsControlを使用して別の問題が発生している可能性があります。コンテナがCanvasであっても、PolygonオブジェクトはCanvasに直接追加されません。 ItemsControlは代わりに各Polygonをホストするコンテナオブジェクトを作成し、そのコンテナオブジェクトをCanvasに追加します。つまり、測定/配置/レンダーパスに参加するオブジェクトの別のレイヤーがあります。
さらに、Polygonクラスは実際には比較的重いクラスのUIControlです。特に、マウスのイベント、フォーカス、および一般的なDependencyObjectインフラストラクチャ全体に関わる膨大なインフラストラクチャを持つUIの対話性が可能になります。これは、多数の要素のレンダリングを実行するための良い選択ではありません。
これを行うには、独自のUIElement/FrameworkElement派生関数を作成し、すべてのポリゴンのレンダリングをOnRenderオーバーライドで実行することをお勧めします。これにより、上記のすべての重機をバイパスして、DrawingContextに直接描画することができます。 View/ViewModelパターンを使用することはできますが、XAMLではなくコードでViewクラスを実装することになります。
関連する問題
- 1. Android:アプリケーションで強制的にハードウェアアクセラレーションを使用していますか?
- 2. Webkit:3D CSSプロパティを使用しない2D変換用のCSS強制ハードウェアアクセラレーション
- 3. XAML強制ログアウト(ページ移動を強制)
- 4. コンパイル時に狭い暗黙の強制を強制する
- 5. HTMLリンクを強制的に強制する方法は?
- 6. 強制的にOpenGLコアプロファイルを強制する
- 7. 強制的にgitでファイルにプルを強制するには?
- 8. jbossポータルサーバで強制的にユーザセッション(ログアウト)を強制終了する
- 9. リレーでフェッチを強制的に強制する方法
- 10. アスペクト比を強制的に強制する方法 - css
- 11. Git rebaseを強制する
- 12. iOS - フルスクリーンビデオを強制する
- 13. ArrayIndexOutOfBoundExceptionを強制する?
- 14. ブルートフォースジャンプゲームを強制する
- 15. Twigロケールを強制する
- 16. トランザクションを強制する
- 17. 強制的な値の強制伝播
- 18. 強制
- 19. 強制
- 20. boost :: program_options - 強制フラグを強制できますか?
- 21. ロギングコアを強制的にシャットダウンに強制しますか?
- 22. JavaScriptを強制的に実行するEventListenerを強制しますか?
- 23. 強制的に専用グラフィックスカードを使用するマシンを強制しますか?
- 24. コールバックを強制的に処理するよう強制しますか?
- 25. GMが強制的にspacer.gifを含むTDを強制的に16pxにする
- 26. 強制的にDataGridViewを強制的に列と行を生成する
- 27. 強制リンク - JavaScriptを
- 28. アクティブモーダルビューを強制的
- 29. 強制MySQLシャットダウン
- 30. Libgdx強制ガベージコレクタ
ああ私は見る!ありがとう、私はこれをさらに調査します。とにかくitemscollectionを持って、各要素に追加される余分なコンテナをスキップすることは知っていますか?ポリゴン自体を追加したいだけです。 wpf-controlsを使わないでもっと明示的に追加する方法 – davidjons
これは本当に改良されたものです。私のプリミティブなオブジェクトはもっと速くレンダリングされるようになりました。私がWPFレンダリングパイプラインで持っているもう一つの問題は、私がObservableCollectionにAddRangeを使うと同時にたくさんのオブジェクトを追加したときですが、追加時と追加時に大きなフリーズ・ラグが残っていますあなたはこれを経験しましたか?私のオブジェクトはすべてポリゴンではなく、線、ポリゴン、テキストなどからなるより複雑なオブジェクトです。 – davidjons
デフォルトのObservableCollectionはAddRangeをうまく処理しません。 VS SDKには[BulkObservableCollection](https://msdn.microsoft.com/en-us/library/dd867973.aspx)がありますが、標準BCLの一部ではありません。最も単純なオプションは、ObservableCollectionを使用するのではなく、コレクション全体を置き換えて、コレクションプロパティで変更されたプロパティを上げることです。 ObservableCollectionは比較的小さなコレクションに最適です。 –