WPF ウィンドウ内にキャンバスがあり、膨大な数の形状 (約 10 万以上の形状) を描画したいと考えています。このようなもの:
<Window>
<Canvas>
<!--<Shape1/>
<Shape2/>
... and so on ... -->
</Canvas>
</Window>
図形を描画するには、次のような仕事をするメソッドがあります:
public void DrawShape()
{
// Create the shape
ShapeT MyShape = new ShapeT();
// Set shape's properties (like Width, Fill, ...)
// Add shape as MyCanvas children.
MyCanvas.Children.Add(MyShape);
}
次に、たとえば 40,000 個の図形を描画するには、次のようにします。
for (uint i = 0; i < 0x9C40; ++i)
DrawShape();
問題は次のとおりです。
すべての図が描画されなくなるまで、つまりループが完了するまで、図は描画されず、ウィンドウは常に応答しません。
ループが完了した後でも、ビデオに図形が描画されるまでに数秒かかり、ウィンドウがフリーズし続けます。
Dispatcherを使用しようとしました:
Dispatcher.BeginInvoke(DispatcherPriority.Background, new MyDrawDelegate(DrawShape));
新しいスレッドを作成しようとしました:
Thread DrawThread = new Thread(new ThreadStart(DrawShape));
DrawThread.SetApartmentState(ApartmentState.STA);
DrawThread.Priority = ThreadPriority.Lowest;
DrawThread.Start();
しかし、変化はありませんでした。これらの問題を解決するにはどうすればよいですか?
PS: パフォーマンス上の理由から、ShapeオブジェクトではなくVisualを使用して図形を描画します。