2010-12-02 6 views
1

NSViewのすべてのdrawRect(約300x300ピクセルボックス)でNSBezierPathを使用して4000〜10000セグメントを描画しようとしています。これは非常に重いリソースであり、描画に多くの時間がかかっています(比較的長い時間)。NSBezierPathを使用した高速描画少なくとも4000セグメントの描画

誰かがこれに代わるものを提案できますか?一度に1つのNSBezierPathを1000個のセグメントに使用しようとしましたが、それでも資源が重すぎます。

私は可能な代替案を探しています。私はOpenGLがより速くなると確信していますが、私が必要とすることをするために新しいプラットフォームを学ばなければならないかどうかはわかりません。私は提案に開放されています。

+1

300 x 300 = 90000と10000セグメントには20000のエンドポイントがあります。各セグメントが非常に短く、例えば4ピクセルと仮定すると、使用されるピクセルは40000ピクセルも追加されます。したがって、あなたの描画面の50%以上が塗りつぶされている可能性があります。非常に混乱しているようです。あなたはそれらの数字について確かですか?私が間違っている? –

+0

あなたの2番目のパラグラフからは、それらの4000+パスは1つのシェイプのコピー/インスタンスと見なすことができます。そして、セグメント(またはそれらのサブセット)の出現はすべて互いに異なっていますか? (方向、サイズ、視覚的な外観など)さらに:それらは重なりますか?はいの場合:zオーダーは問題ですか? – Regexident

+0

zオーダーは重要ですが、セグメントは1つの図形のコピーではありません。小さな線分(ランダムな4〜10ピクセルの長さ)です。それらは色と方向が異なり、ビューを通してスクロールされます。基本的には、右から左にスクロールして、多くのセグメントを持つグラフです(したがって、多くのセグメントで多くの再描画が行われます)。 – David

答えて

4

ない答え、ちょうどテスト結果

私はMathematicaを使っ簡単な実験を行いました。この実験では、最適化やGPU、インタープリター言語などを使用していなかったので、あなたの時間に対する絶対的な上限が与えられます。だから私は、1桁以上は達成可能だと思います。

結果:Mathematicaが何を評価しませんので、

b = Table[ 
    {Hue[RandomReal[]], 
    [email protected][{0, 300}, {4, 2}]}, {10000}]; 

10.000ベジェ曲線のリストを生成するには、非常に速いです。

今のレンダリング:

h1 = AbsoluteTime[]; [email protected][b]; h2 = AbsoluteTime[]; Print[h2 - h1]; 

Time spent 11.8 secs 

結果:

alt text

PS:意図は私たちの考え方についてのタイミングの基準を設定することです。

+0

* poke!* Haha。私はあなたの答えを見直しました。私は本当に結果に悲しんでいました。私はまだここにいるよ。アップデートとして、NSBezierPathオブジェクトの作成が最大のリソース豚であることが判明しました。また、「ストローク」メッセージを呼び出すと、大きなサイクルが排除されます。 この問題は、1)NSBezierPathのインスタンスを1つだけインスタンス化すること、および2)moveTo/lineToがすべて配置された後に1回だけストロークメッセージを呼び出すことによって解決されました。これは無限の倍率で処理を高速化します(1%を払う、または取る)。私の本では絶対に大丈夫ですが、10秒の線分を描くには0.003秒しかかかりません。 – David

+0

ありがとうございます。また、Mathematicaが長くかかる理由は、それが通訳言語であるためです。それは本当にあまり時間を取るべきではありません。または、一度に1つのセグメントを描画しています(非常に多く消費しています)。 – David

+0

@Davidあなたが問題を解決したと聞いてうれしい! Mathematicaがそれほど長い時間を費やした理由は、パフォーマンス測定については言及していないので、目的を達成するために、何も最適化せずに、最も単純な方法でレビューのベースライン時間を設定することでした。 –

関連する問題