什么是Core Animation的字节对齐(缓存行对齐)?为什么它很重要?

4
我正在以非懒加载的方式在滚动视图上加载图像,以避免出现卡顿行为。代码运行良好,FPS接近60。
但是,我不明白核心动画的字节对齐(或缓存行对齐)是什么?
此处此处所提到的,这是一件重要的事情。然而,我注意到只要按照这里所述的步骤进行操作,字节对齐与否并不真正重要。
有人知道它究竟是什么吗?
1个回答

9
当CPU将某些内容从内存复制到CPU缓存时,它会分块进行。这些块是缓存行,其大小固定。当数据存储在CPU缓存中时,它以行的形式存储。使您的数据适合目标架构的缓存行大小可能很重要,因为它会影响数据局部性。
ARMv7使用32字节的缓存行(与PowerPC相同)。A9处理器使用64字节的缓存行。因此,通过渲染到在64字节边界上且尺寸是64字节的倍数的矩形中,可以获得最大的好处。
另一方面,图形加速器更喜欢使用维度为平方的2的幂次方的图像数据。这与缓存行或字节对齐无关。这也是可能对性能产生很大影响的另一点。
在您链接到的特定情况中,被调用的苹果API(Core Animation、QT等)正在代表调用者执行这些种优化。在CoreAnimation的情况下,调用者正在提供优化过的硬件数据。根据您链接到的文档中Path所写的内容,他们建议为了避免优化步骤,向Core Animation提供不需要优化(在这种情况下,优化和复制)的数据。

因此,如果您的图像在每个维度上都是二的幂次方的平方,并且尺寸是64字节的倍数,那么就可以使用 ;) 将该图像渲染到屏幕区域上,该区域处于64字节边界是好的,但对于除游戏之外的全屏应用程序来说并不总是现实的。

话虽如此,使用Instruments。构建您的应用程序,使用Instruments和代表性工作负载进行分析(UIAutomation非常适合此类任务)。如果发现滚动性能问题,Instruments将为您提供一切所需,以便锁定瓶颈所在位置。

我可以诚实地说,我看到的所有滚动性能问题都没有涉及字节对齐或缓存行。相反,它们是其他形式的Core Animation滥用(未使用光栅化和缓存)或在主线程上执行过多其他工作等。

有关字节对齐对性能影响的指导,请参阅Quartz 2D Programming Guide

这是Core Animation在复制时优化图像所采用的格式。如果您已经将数据存储在Core Animation想要的格式中,它将跳过可能昂贵的优化步骤。
如果您想了解更多关于iOS图形管道如何工作的信息,请参见: WWDC 2012 Session 238 "iOS应用程序性能:图形和动画" WWDC 2012 Session 235 "iOS应用程序性能:响应性" WWDC 2011 Session 121 "理解UIKit渲染" iOS设备兼容性参考:OpenGL ES图形

非常好的讨论。此主题还有多个优秀的WWDC视频。 - matt
@matt 你有链接吗? - Mike D
寻找任何WWDC视频,其中包含“performance”(性能)一词 - 包括动画性能等。 - matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接