2009-07-30 40 views
1

私は小さなランスピードの問題があります。ロード時に、少なくとも1000ポイントを含むCGMutablePathを生成します。私は、画面上でこのパスをスクロールしたいので、私はこの種のコードを使用します。CGContextの最適化

-(void) drawRect:(CGRect)rect { 

    /* 
    Here, I have a timer calling drawRect 60 times per second. 
    There's also code for the scale and currentTime, based on 
    an MP3 playback (AVAudioPlayer); 
    */ 

    CGContextRef ref = UIGraphicsGetCurrentContext(); 
    CGContextClearRect(ref, [self frame]); 

    CGContextSaveGState(ref); 
    CGContextTranslateCTM(ref, s.width/2+currentTime, 1); 
    CGContextScaleCTM(ref, scale, 1); 
    CGContextAddPath(ref, myGraphPath); 
    CGContextSetRGBFillColor(ref, .1, .1, .1, .8); 
    CGContextFillPath(ref); 
    CGContextRestoreGState(ref); 
} 

問題はない非常に多く、それは少し遅いということですが、私は、グラフィックの全体の多くを追加する必要があるとして、コード... デバイスが全体のパスを描いているかどうか(一度スケールが適用されると、パスは約10.000ピクセル幅です)、または画面上に表示される部分だけが表示されますか?これを最適化するために私は何ができますか?

答えて

1

私の巨大な1000ポイントのパスをより小さい10ポイントのパスに分割するなど)、私は単純な頂点配列を使用してすべてをOpenGLに移植しました。 すべてを移植するには約4時間かかりました(パスの拡大、スクロールなど)、現在は常に60fpsのフルアニメーションを取得しています。 CoreGraphics

+0

私はあなたがそれを理解してうれしいですが、多分それがうまく動作しないようにするためにCGでできることはたくさんあります。 – Sneakyness

1

1,000ポイントまたは10,000ポイントのパスを1秒間に60回描画すると、アプリケーションを停止する可能性があります。パスが静的な場合は、UIViewのレイヤー内にキャッシュされ、レイヤーをアニメーション化するように、UIView内で一度だけ描画するだけです。アニメーションが必要な場合は、パスプロパティにアニメーションを適用するだけでBezierパスをアニメートする新しいCAShapeLayerを見ることができます。

しかし、10,000ピクセルはiPhoneの最大テクスチャサイズ(2048 x 2048)よりも広いので、標準のビューやレイヤーではそれを表示するのに問題があり、小さな塊に分割する必要がありますまたはCATiledLayerを使用して画面にレンダリングします。

+0

パスのポイント座標は静的ですが、スケールファクタに応じてx軸に沿ってパスをスクロールする必要があります。世代の直後にレイヤーにシェイプを描画してスケールすると、ぼやけてしまいます(ところで、最大スケーリング係数は1000程度です)。描画する前にパスをレイヤーに合わせると、s.width分のピクセルしか描画されません。このサイズのレイヤーを作成しても、多くの改善はありません。/ CAShapeLayerをチェックしようとしましたが、まだ聞こえませんでした。 私の最後の賭けは、OpenGLを使用しようとしていますが、この多角形では本当に便利であるかどうかはわかりません。 – melka