an0*_*an0 12 core-animation ios
Core Animation中的混合和屏幕外渲染都很昂贵.
可以在Instruments的Core Animation乐器中看到它们,带有调试选项:

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