0

在我的原型应用程序中,大约有 100 个 CALayer,它们位于不同但固定的位置,并具有与内容相同的小图像。现在唯一需要做的是hidden反复且非常快速地切换属性。

这可行,但它明显慢于我之前使用UIImage'drawAtPoint:方法 in的方法drawRect

我想要一个闪光灯般的外观,没有过渡。这就是我使用hidden而不是使用的原因opacity,但是,它看起来好像有一个淡入淡出,这告诉我它很慢。使用drawAtPoint:- 方法看起来不错,但它对 CPU 的负担很重。

出于这个原因,我使用 CALayer 重写了它,现在我很困惑为什么它这么慢。

你能给我建议如何调查这个吗?使用 Instruments,我没有获得任何见解。它告诉我它以 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 回答