1

実行速度に小さな問題があります。ロード時に、少なくとも 1000 ポイントを含む CGMutablePath を生成します。画面上でこのパスをスクロールしたいので、次のようなコードを使用します。

-(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 ピクセル)、または画面に表示されている部分だけですか? これを最適化するにはどうすればよいですか?

4

2 に答える 2

1

多くのことを試した後(巨大な1000ポイントのパスを小さな10ポイントのパスに分割するなど)、単純な頂点配列を使用して、すべてをopenGLに移植しました。すべてを移植するのに約4時間かかりました(パスのスケーリング、スクロールなど)。今では、平均22 fpsで、ピークが28であるときに、常に60fpsの完全なアニメーションが表示されます。 CoreGraphics。

于 2009-08-04T19:42:07.013 に答える
1

1,000 ポイントまたは 10,000 ポイントのパスを 1 秒あたり 60 回描画すると、アプリケーションの速度が実際に遅くなります。パスが静的な場合は、UIView 内で 1 回だけ描画して、UIView のレイヤー内にキャッシュし、レイヤーをアニメーション化することを検討する必要があります。アニメーション化する必要がある場合は、パス プロパティにアニメーションを適用するだけでベジエ パスをアニメーション化する機能を提供する新しい CAShapeLayer を見ることができます。

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

于 2009-07-30T12:09:38.797 に答える