4

ユーザーに表示したい時系列データのポイントが何十万もあります。私の現在の解決策は、サードパーティのライブラリを使用してそのデータを PNG にレンダリングし、その PNG をロードしNSImageてスクロール ビューに表示することです。これは、次の点を除いてうまく機能します。

  1. 幅が 32k ピクセルを超える NSImages が正しく表示されない
  2. データをすばやく簡単に拡大できるようにしたい
  3. ディスクへの読み書きはばかげている

NSBezierPath私の現在の試みは、 s を aに直接描画することNSViewです。一度に限られたポイントのサブセットしか描画しない場合でも、ビューは美しくレンダリングされますが、非常に遅くなります。また、スクロールするたびに再描画する必要がありますが、これも遅いです。

私は比較的ココアの初心者として、これを行うためのより良い方法を見逃していると確信しています. それを行う「正しい」方法は何ですか?

4

6 に答える 6

2

データセットはどの程度動的ですか?

かなり静的で、「ズーム」したい場合は、データをスケーリングされたサブセットに統合することを検討する必要があります。

人為的な例: 100,000 pts がある場合 (X 軸に沿って進むとします)、明らかに、1000 ピクセルの画像では、必然的に、その 100,000 のうちの 1000 pts をプロットすることになります。

したがって、高度な設定 (1000 pts、10000 pts、100000pts の生データ) でそれを行い、表示している「ズーム」レベルに基づいて適切なセットから選択することができます。

ポイントが重なったときに選択する値については、最小値、最大値、中央値、平均値などを指定できます。

于 2009-01-30T21:35:35.023 に答える
2

これについては、CATiledLayer (Leopard のみ) を検討します。タイル レイヤーに大量のものを描画し、必要に応じて領域を表示させることができます。あなたのケースでは、CATiledLayer を NSView のバッキングとして設定し、すべてのベジエ パスをそのレイヤーに描画してから、スクロールしてズームインおよびズームアウトすることもできます。コア アニメーション レイヤーは OpenGL テクスチャのように処理されるため、これにより非常に優れたパフォーマンスが得られるはずです。ベクター描画はレイヤーにキャッシュされ、標準の NSView のようにスクロールしても再描画されません。

たとえば、Bill Dudney は、CATiledLayer を使用して大量の PDF ファイルを表示する方法に関するサンプル コードを投稿しています。

于 2009-01-30T21:25:08.257 に答える
2

ドキュメントには、NSBezierPath のパフォーマンスに関するセクションがあります。

于 2009-01-29T21:45:15.207 に答える
2

多くのベジエ パスを描画している場合は、おそらく OpenGL が適しています。Apple のドキュメントから始めるのがよいでしょう。ココア ウィンドウで基本的な OpenGL レンダリング コンテキストを実装するためのサンプル コードがあります。

これにより、困難な描画タスクの負荷がグラフィック プロセッサに移され、アプリを自由にスクロールできるようになります。

このページには、ベジェ曲線を描画するためのサンプル OpenGL コードがあります。

于 2009-01-29T22:26:01.677 に答える
0

CorePlotなど、そのようなものを効率的に処理するフレームワークの使用を検討してください

于 2012-10-01T09:02:11.560 に答える