質問

小さな実行速度の問題があります。ロード時に、少なくとも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ピクセルになるのか)、画面に表示される部分だけなのか疑問に思いました。これを最適化するにはどうすればよいですか?

役に立ちましたか?

解決 2

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

他のヒント

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top