2010-12-13 1 views
1

私のコードを発行し、次のようになる -ベジェパスなでるパフォーマンスが

[[NSColor whiteColor] set]; 
// `path' is a bezier path with more than 1000 points in it 
[path setLineWidth:2]; 
[path setLineJoinStyle:NSRoundLineJoinStyle]; 
[path stroke]; 
// some other stuff... 

は楽器の時間プロファイリングツールを実行するには、私のアプリは、時間最後の行[path stroke]を行うための93.5パーセントを費やしている、とQuartzデバッガが告げる私に語りました私のアプリは10fps以下でしか動かない(別のビューはその上の位置を変えても常に更新を引き起こしている)。

ベジェパスを描画するパフォーマンスを向上させる方法を探していますが、1000ポイントを超えるパスは> 60fpsで非常に高速に描画されることがありますが、極端な場合にはポイントがあまりにも遠すぎる(または濃すぎる?)と、パフォーマンスが実際には低迷します。

私はこれについて何ができるのか分かりません。私は、ビットマップの担当者としてビューをキャッシュすると便利だと思うが、それは本当にライブのサイズ変更に役立つことはできません。

編集:[path setLineWidth:2];という行をコメントアウトするのは確かに役立ちますが、パスは実際にはあまりにも薄すぎます。

答えて

6

メソッドのsetFlatness:を使用して曲線の平坦度を調整することができます。値を大きくするほどレンダリングのスピードは速くなりますが、精度は低下します。たとえば、ライブのサイズ変更中に高い値を使用する必要があります。

2

描画ごとにパスを作成しますか?図面から描画に変更されますか?それは変化するように聞こえる。同じパスを何度も描画するとキャッシングが発生する可能性があるので、キャッシュを作成して変更があるまで保持してください。それは助けるかもしれません。

APIレベルを1つまたは2つ下にドロップすることもできます。おそらくCALayerオブジェクトはあなたが望むことをするかもしれません。言い換えれば、あなたは本当にポイントを結ぶために湾曲する必要がある1000点の線を持っていますか?線分を描画するには、CALayerオブジェクトを束ねることができます。

これらのプロセッサの計算は高速です。あなたは、おそらく、1000から約200程度の数を減らすために、不要な点を投げ捨てる数学ルーチンを書くこともできます。数学は近くにある点などを取り除こうとします。

私の賭けは視覚的に違いのない点を投げる計算です。フラットネスのことも興味深いように聞こえる - それは完全にフラットに行くことによってラインセグメントをしているかもしれない。

+0

CALayerオブジェクトを使用していただきありがとうございます。私はライブのサイズが変わるまでキャッシュのパスを行いますが、CPUは実際に数学をするのが速いですが、パスのストロークがコンピュータにストロークを引き起こしています。 – koo

3

私がAppleのQuartz 2Dチームにこれについて尋ねたとき、多くのポイントを持つパスを描くパフォーマンスの最大の要因は、パスが交差する回数です。交差点を適切にアンチエイリアスするための多くの作業があります。あなたはそれの上 上の位置を変更し、別のビューは常に更新

を引き起こしている

を言うとき

+1

セグメントは実際には交差していません(パスはデータのグラフを表しています)。 – koo

+0

レンダリングされたセグメントのエッジが互いに接触する場合、ラスタライザは依然としてその作業を行う必要があります。 – NSResponder

0

は、あなたは何を意味するのですか?

ビューを60fpsで再描画しないことを意味しますか?それで、それはあなたが60fpsを見ていない理由です。

それは私のアプリが 支出93である私に指示

インスツルメンツ。時間の5%

何かをしている、それはあなたのアプリが消費したCPUサイクルの93.5%を意味する「すべて利用可能な」という意味ではありません。すなわち、全く時間がないことがあります。最適化する必要があると判断するだけでは不十分です。私はあなたがする必要はない、または巨大なベジエを撫でていることは犬が遅くないと言っているわけではありません。それだけではあまり意味がありません。

関連する問題