2009年5月5日火曜日

WPF: 描画の限界?? データの多い折れ線グラフ

WPF上で折れ線グラフを描画する場合、普通に考えるとPolylineを使うと思います。PointCollectionのインスタンスを渡すだけで、連続直線を描画してくれますので、折れ線グラフを描くにはもってこいです。

今作っているツールが折れ線グラフを描画するものなのですが、こいつがちょっと要求事項が難しく、サンプリング数3600点 x グラフ線20本というアホツールです。最近の高精細なディスプレイでも横ドット数が3600何てありませんから、サンプリング数3600点と言っている時点でちょっと無理があります。また「同時にグラフ20本も見ることはないよ」と思うかもしれませんが、まーこれがツールの諸元なので、大目に見てください。

問題は、この諸元でツールを作ると、全く使い物にならないくらい遅いということです。最初はグラフが変化したらアニメーションさせよう、なんて考えていましたが、論外です。表示するだけで数秒固まるんですから。描画対象のウィンドウが小さい時は比較的問題ないのですが、ウィンドウを最大化したときに破綻します。困ったなー :(

RenderOptionsをいじってアンチエイリアシングを解除したり、描画のキャッシュを有効にしたりしましたが、ダメでした。一念発起して、Polylineクラス(Shapeクラス)を捨てて、WriteableBitmapを使って自前で連続直線の描画をしてかなり改善はされたものの、アニメーションさせるには至りませんでした(アニメーション止めりゃいいのかw)。どうやらビットマップを画面に転送する過程が遅いようです。作成までは一瞬でした。

MSDNフォーラムに同じような質問がありましたが、結局「WPFの限界だよ」ということらしい。。。これを回避するには、D3DImageを使うしかもう手はなさそう。:s でもWPFでD3DImageを使う方法ってあんまり情報ないし。。。

川西さんのチュートリアルを参考に頑張るか。。。

以下がMSDN内の数少ないD3DImageの記事。これだけが頼みの綱です。しかし何でDirectXの初期化ってこんなに面倒なんだろう。使いやすいようにまとめておいて下さいよ。

0 件のコメント: