グリッド(1つのグリッド40x250と1つの250x250)の形で約70kの長方形を描画する必要があるアプリケーションを開発しています。一度にすべての長方形が画面に表示されるわけではありません。
http://msdn.microsoft.com/en-us/magazine/dd483292.aspxを読んだ後、DrawingVisual descantを使用して長方形の1つの列を作成する、単純なコントロール(FrameworkElementから継承、パーツは以下にリストされています)を作成しました。
// Removing items after collection change
private void RemoveItems(IList oldItems) {
foreach (var oldItem in oldItems) {
var visualChild = _visuals.FirstOrDefault(v => v.Data == oldItem);
if (visualChild != null) {
_visuals.Remove(visualChild);
RemoveVisualChild(visualChild);
}
_translateTransform.X -= 8;
}
}
// Adding items after collection change
private void AddItems(IList newItems) {
foreach (var newItem in newItems) {
var newArray = (byte[]) newItem;
var visual = CreateVisual(newArray);
_visuals.Add(visual);
AddVisualChild(visual);
_col++;
}
}
// Creating visual element
private StripeVisual CreateVisual(byte[] data) {
var result = new StripeVisual {
Data = data,
Transform = _translateTransform
};
using (var dc = result.RenderOpen()) {
for (int i = 0; i < data.Length; i++) {
dc.DrawRectangle(_brushes[data[i]], _strokePen, new Rect(_col * 8, i * 20, 8, 20));
}
}
return result;
}
すべてのブラシは凍結されており(Brushes
クラスのメンバー)、_strokePen
凍結されています。新しい縦縞が200msごとにコレクションに追加されます。
プログラムは3台のコンピューターで実行されました:
- ノートブック:i7-2670QM、GeForce GT 540M / Intel HD Graphics 3000、4GB RAM、Win7 x64、DirectX11、
- PC:Core2Duo E7400、Radeon HD 4800、3GB RAM、Win7 x64、DirectX11、
- PC:i3 3,07GHz、Inter HDグラフィックス、3.3GB RAM、Win7 x86、DirectX11。
問題は、私の最初のコンピュータープログラムがスムーズに実行され、CPUに大きな影響を与えないことです(使用率は1〜10%)。2番目と3番目のコンピューターの両方で、プログラムのパフォーマンスは許容できません。約30x100グリッドでは、プロセッサーの最大50%を使用し、すべての実行が非常に遅くなります。グリッドのごく一部しか表示されていない場合でも、プログラムの実行は遅くなります。
プログラムがソフトウェアレンダリングを使用しているように見えますが(レンダリングスレッドはプロセッサの50%を使用しています)、RenderCapability.Tier >> 16
2を返し、にRenderOption.ProcessRenderMode
設定されていDefault
ます。[HKCU/Software/Microsoft/Avalon.Graphics]
また、ハードウェアアクセラレーションを無効にするキーはありません。
このアプリケーションをスムーズにリストされたコンピューターで実行することは可能ですか?このプログラムのパフォーマンスを最大化するために他に何ができますか?
アップデート
設定DrawingVisual.CacheMode = new BitmapCache();
は大いに役立ちました。CPU <=> GPU通信がボトルネックだったということですか?