Core Animation中的混合和屏幕外渲染都很昂贵。
可以在Instruments的Core Animation乐器中看到它们,带有调试选项:
以下是我的案例:
在UIImageViews上显示50x50 PNG图像。我想用6点核心半径舍入图像。第一种方法是设置UIImageView.layer的cornerRadius和masksToBounds,这会导致屏幕外渲染。第二种方法是使PNG图像副本具有透明角落,这会导致混合(因为alpha通道)。
我已经尝试了两种,但我看不出显着的性能差异。但是,我仍然想知道哪个在理论和最佳实践中哪个更糟糕。
非常感谢!
答案 0 :(得分:8)
嗯,简短回答,混合必须以正确显示透明角像素的方式发生。但是,如果您希望生成的视图也以某种方式生成动画(并且记住,滚动是最常见的动画类型),这通常应该只是一个问题。此外,我能够重新创建" cornerRadius"当我的观点变得复杂时,会在旧设备(在我的情况下为iPhone 3G)上导致渲染错误。对于您确实需要高性能动画的情况,以下是我遵循的建议。
首先,如果你只需要圆角的单一曲线的资源(不同的刻度很好,只要所需的曲率是相同的),保存它们以避免额外计算" cornerRadius"在运行时。
其次,不要在任何您不需要的地方使用透明度(例如,当背景实际上是纯色时),并且始终为" opaque"指定正确的值。有助于系统更有效地计算图纸的属性。
第三,找到最小化透明视图大小的方法。例如,对于具有透明元素(例如圆角)的大边框视图,请考虑将视图分成3个(顶部,中部,底部)或7个(4个角,顶部中间,中间,底部中间)部分,保持透明部分尽可能小,并将矩形部分标记为不透明,背景为实色。
第四,在您在scrollViews中绘制大量文本的情况下(例如,高度自定义的UITableViewCell),请考虑使用" drawRect:"更有效地渲染这些部分的方法。继续使用图像元素的子视图,以便在预绘图(子视图)和"即时"之间的整体视图之间分割渲染时间。绘图(drawRect :)。显然,实验(滚动时每秒帧数)可能表明违反了这个"经验法则"可能是您特定观点的最佳选择。
最后,确保您有足够的时间使用分析工具(尤其是CoreAnimation)进行实验是关键。我发现使用您想要定位的最慢设备进行改进最容易,而且新设备的效果也很好。
答案 1 :(得分:4)
观看WWDC视频并使用Xcode和Instruments进行一些实验后,我可以说混合比屏幕外渲染更好。混合意味着系统需要一些额外的时间来计算透明层上像素的颜色。您拥有的透明层越多(这些图层的尺寸越大),那么混合会花费更多时间。
离屏渲染意味着系统将进行多次渲染迭代。在第一次迭代时,系统将进行渲染而不进行可视化,以便计算应该渲染的区域的边界和形状。在下一次迭代中,系统会定期渲染(取决于计算的形状),包括在需要时进行混合。
对于离屏渲染系统,也会创建一个单独的图形上下文,并在渲染后销毁它。
所以你应该避免使用屏幕外渲染,最好用混合替换它。