【问题标题】:quickly showing and hiding CALayer's appears to be slow快速显示和隐藏 CALayer 的似乎很慢
【发布时间】:2013-03-28 21:23:42
【问题描述】:

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

这可行,但它明显慢于我之前在drawRect 中使用UIImagedrawAtPoint: 方法的方法。

我想要一个闪光灯般的外观,没有过渡。这就是为什么我使用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];

【问题讨论】:

标签: ios core-animation calayer


【解决方案1】:

尝试在 CATransaction 块中执行上述代码并像这样设置动画持续时间:

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

您可能还需要像这样禁用转换:

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

我相信 CALayers 在您设置其内容时有一个默认的“动画”。

【讨论】:

    猜你喜欢
    • 2011-05-12
    • 1970-01-01
    • 2010-10-25
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 2015-02-16
    相关资源
    最近更新 更多