2016-04-07 14 views
0

私はキャンバスにポリゴンを追加し、ディスパッチャーが各ポリゴンの位置をランダムに更新するベンチマークテストを作成しました。私は30fps以下のfpsを測定するまでこれを行いました。私は何かに気づいた、ベンチマークdoesntはGPUを使用するようだ。私はrendercapability 2を持っていますが、avalon.graphics registretを使ってハードウェアアクセラレーションを動かすと同じ結果になります。私にとってこれは、rendercapability 2と良いGPUがあっても、キャンバスコンテナを持つItemsControlのソフトウェアレンダリングとPolygonsを子として持つobservablecollectionを選択しているようです。 (30fps以下になる前に3500ポリゴンが追加されます)。私がここで理解していないものはありますか?グラフィックスハードウェアを利用するには、他の形状やレンダリングループを使用する必要がありますか?ハードウェアアクセラレーションを強制する

答えて

0

プロファイラで確認する必要がありますが、オーバーヘッドの大部分は、実際のラスタライズ(ハードウェアが役立つ部分)ではなくベクトルグラフィックスバッファを満たすコードにあると思われます。ポリゴンを移動しようとせずに新しいポリゴンを追加し続けると、ラスタライズのオーバーヘッドが改善されます。

つまり、ItemsControlを使用して別の問題が発生している可能性があります。コンテナがCanvasであっても、PolygonオブジェクトはCanvasに直接追加されません。 ItemsControlは代わりに各Polygonをホストするコンテナオブジェクトを作成し、そのコンテナオブジェクトをCanvasに追加します。つまり、測定/配置/レンダーパスに参加するオブジェクトの別のレイヤーがあります。

さらに、Polygonクラスは実際には比較的重いクラスのUIControlです。特に、マウスのイベント、フォーカス、および一般的なDependencyObjectインフラストラクチャ全体に関わる膨大なインフラストラクチャを持つUIの対話性が可能になります。これは、多数の要素のレンダリングを実行するための良い選択ではありません。

これを行うには、独自のUIElement/FrameworkElement派生関数を作成し、すべてのポリゴンのレンダリングをOnRenderオーバーライドで実行することをお勧めします。これにより、上記のすべての重機をバイパスして、DrawingContextに直接描画することができます。 View/ViewModelパターンを使用することはできますが、XAMLではなくコードでViewクラスを実装することになります。

+0

ああ私は見る!ありがとう、私はこれをさらに調査します。とにかくitemscollectionを持って、各要素に追加される余分なコンテナをスキップすることは知っていますか?ポリゴン自体を追加したいだけです。 wpf-controlsを使わないでもっと明示的に追加する方法 – davidjons

+0

これは本当に改良されたものです。私のプリミティブなオブジェクトはもっと速くレンダリングされるようになりました。私がWPFレンダリングパイプラインで持っているもう一つの問題は、私がObservableCollectionにAddRangeを使うと同時にたくさんのオブジェクトを追加したときですが、追加時と追加時に大きなフリーズ・ラグが残っていますあなたはこれを経験しましたか?私のオブジェクトはすべてポリゴンではなく、線、ポリゴン、テキストなどからなるより複雑なオブジェクトです。 – davidjons

+0

デフォルトのObservableCollectionはAddRangeをうまく処理しません。 VS SDKには[BulkObservableCollection](https://msdn.microsoft.com/en-us/library/dd867973.aspx)がありますが、標準BCLの一部ではありません。最も単純なオプションは、ObservableCollectionを使用するのではなく、コレクション全体を置き換えて、コレクションプロパティで変更されたプロパティを上げることです。 ObservableCollectionは比較的小さなコレクションに最適です。 –

関連する問題