0

私のプロトタイプ アプリでは、約 100 個の CALayer が異なるが固定された位置にあり、コンテンツと同じ小さな画像があります。hiddenここで必要なのは、プロパティを繰り返し非常に迅速に切り替えることだけです。

UIImageこれは機能しますが、のdrawAtPoint:メソッドを使用した以前のアプローチよりも著しく遅くなりdrawRectます。

トランジションのない、ストロボのような外観が必要です。そのため、私はhiddenand notを使用していopacityますが、それでも、フェードがあるように見え、遅いことがわかります。drawAtPoint:-アプローチでは見栄えは良かったのですが、CPU に負荷がかかりました。

このため、CALayer を使用して書き直しましたが、なぜそんなに遅いのか不思議です。

これを調べる方法を教えてください。楽器では、私は何の洞察も得られませんでした。レンダリングは 59 ~ 60 FPS であることがわかりますが、明らかにかなり遅いです。

(タッチ)イベントとレイヤーの非表示または表示の間に遅延があるようです。


それが私がレイヤーを初期化する方法です:

layers[i] = [CALayer layer];
layers[i].frame = frameForLayer(i);
layers[i].contents = (__bridge id)image;
[layers[i] setContentsScale:scale];
layers[i].hidden = YES;
[[self layer] addSublayer:layers[i]];

awakeFromNib私のメインビューのすべて。
後で、hiddenプロパティのみが変更され、残りは残ります。


編集: の代わりにsomeLayer.hidden = NO、私は今書いています

[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue
                 forKey:kCATransactionDisableActions];
someLayer.hidden = NO;
[CATransaction commit];
4

1 に答える 1

2

上記のコードを CATransaction ブロックで実行してみて、アニメーションの長さを次のように設定します。

[CATransaction setValue:[NSNumber numberWithInt:0] forKey:kCATransactionAnimationDuration];

次のようにトランジションを無効にする必要がある場合もあります。

[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];

CALayers には、コンテンツを設定するときのデフォルトの「アニメーション」があると思います。

于 2013-03-28T21:41:09.240 に答える