什么是核心动画的字节对齐(缓存行对齐)?为什么这很重要?

2023-12-22

我以非惰性方式在滚动视图上加载图像,因此不会出现卡顿行为。代码有效,FPS 接近 60。

但是,我不明白什么是核心动画的字节对齐(或缓存行对齐)?

如上所述here https://github.com/path/FastImageCache#byte-alignment and here https://stackoverflow.com/questions/15935074/why-is-my-images-bytes-per-row-more-than-its-bytes-per-pixel-times-its-width这是一件重要的事情。但是,我注意到只要我执行提到的步骤here https://stackoverflow.com/questions/5266272/non-lazy-image-loading-in-ios,字节对齐与否并不重要。

有人知道它到底是什么吗?


当 CPU 将某些内容从内存复制到 CPU 缓存时,它是以块的形式进行的。这些块是缓存线,它们具有固定的大小。当数据存储在 CPU 缓存中时,它是以行的形式存储的。使数据适合目标架构的缓存行大小对于性能非常重要,因为它会影响数据局部性。

ARMv7 使用 32 字节高速缓存行(如 PowerPC)。 A9 处理器使用 64 字节高速缓存行。因此,您将看到渲染为 64 字节边界上且尺寸为 64 字节倍数的矩形的最大好处。

另一方面,图形加速器确实更喜欢处理维度为 2 的平方幂的图像数据。这与缓存行或字节对齐没有任何关系。这是另一件可能对性能产生重大影响的事情。

在您链接到的特定情况下,调用 Apple API(核心动画、QT 等)。代表调用者执行此类优化。对于 CoreAnimation,调用者向其提供正在针对硬件进行优化的数据。根据 Path 在您链接到的文档中所写的内容,他们建议提供不必优化的核心动画数据(在本例中,优化并制作副本)以避免优化步骤。

因此,如果您的图像尺寸是 64 字节的倍数,并且每个尺寸是 2 的平方次幂,那么您就可以开始了;)将该图像渲染到屏幕上 64 字节边界上的区域也很好,但对于除了游戏这样的全屏应用程序之外的任何东西来说并不总是现实的。

也就是说,使用仪器。构建您的应用程序,使用 Instruments 和代表性工作负载对其进行分析(UIAutomation 非常适合此操作)。如果您发现滚动性能问题,Instruments 将为您提供将瓶颈归零所需的一切。

我可以诚实地说,我见过的所有滚动性能问题都没有涉及字节对齐或缓存行。相反,它是其他形式的核心动画滥用(不使用光栅化和缓存),或者在主线程上做了太多其他工作,等等。

有关字节对齐对性能影响的指导在Quartz 2D 编程指南 https://developer.apple.com/library/ios/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_context/dq_context.html#//apple_ref/doc/uid/TP30001066-CH203-CJBHBFFE

这是 Core Animation 在进行复制时优化图像的格式。如果您已经拥有 Core Animation 想要的格式的数据,它将跳过可能昂贵的优化步骤。

如果您想了解有关 iOS 图形管道如何工作的更多信息,请参阅:

WWDC 2012 第 238 场会议“iOS 应用程序性能:图形和动画” https://developer.apple.com/videos/wwdc/2012/

WWDC 2012 第 235 场会议“iOS 应用程序性能:响应能力” https://developer.apple.com/videos/wwdc/2012/

WWDC 2011 第 121 场“理解 UIKit 渲染” https://developer.apple.com/videos/wwdc/2011/

iOS 设备兼容性参考:OpenGL ES 图形 https://developer.apple.com/library/ios/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/OpenGLESPlatforms/OpenGLESPlatforms.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是核心动画的字节对齐(缓存行对齐)?为什么这很重要? 的相关文章

  • 如何在 EKRecurrenceRule 中设置一周中某一天的数组?

    我想在用户选择的特定日期每周添加事件 可以是一个或多个 也可以是一整天 我将用户选择的日期值存储在模型类变量中 但是 当我添加事件并选择日期时 假设今天是星期一 我选择星期二和星期三并保存 然后我查看周一和周三添加的 iPhone 日历 我
  • 通用类不会将委托调用转发给具体子类

    鉴于以下情况 protocol EntityType var displayString String get extension String EntityType var displayString String return self
  • 具有非零“内容”的 QTMovieLayer 的 iOS 替代品?

    背景 QTKit QuickTime Kit 是一个来自 10 3 天的 Mac 框架 在 10 5 中添加了一些层 例如QTMovieLayer QTMovieLayer 的好处之一是您可以使用常规访问电影内容content图层上的属性并
  • 我无法捕获 WKWebView 的屏幕截图

    我正在尝试捕获 WKWebView 的屏幕截图 但我的方法无法正常工作 它返回纯色 就好像图层树为空一样 而它似乎适用于其他视图 UIImage screenshot UIImage screenshot UIGraphicsBeginIm
  • 访问iOS 7隐藏的UITableViewCellScrollView?

    苹果改变了UITableViewCelliOS 7 中的层次结构 使用iOS 6 1 SDK
  • 错误 ITMS-9000 iTunes Connect

    我正在尝试上传一个phonegap build iOS应用程序到应用程序商店 我不断收到此错误 ERROR ITMS 9000 Missing Code Signing Entitlements No entitlements found
  • 在两个数字之间设置 UILabel 文本动画?

    我是 iPhone 和 Mac 编程新手 之前为 Windows 开发过 我有一个问题 我如何制作动画text的财产UILabel两个数字之间 例如从5 to 80以 Ease Out 风格 是否可以与CoreAnimation 我已经在谷
  • UIViewController 作为单例

    我在标签栏应用程序中有一个 UIViewController 我已经从 MainWindow nib 文件添加了控制器 即不是以编程方式 我的问题是如何使我的视图控制器成为单例 解决 Facebook 委托问题 您可能想让您的 Facebo
  • 多个 ViewController(containerView?childView?viewController 的实例?)

    我需要在另一个视图之上添加一个新视图 带有 ViewController 用户与这个新视图交互了一段时间 然后我想将其删除 在旧版本的 Xcode 中 我可以将其添加为子视图 我现在收到 EXC BAD ACCESS 错误 我不希望添加的视
  • 检测 UITableView 中的水平平移

    我正在使用 UIPanGestureRecognizer 来识别 UITableView 中的水平滑动 准确地说是在单元格上 尽管它已添加到表格本身 然而 这个手势识别器显然窃取了桌子上的触摸 我已经让 pangesturerecogniz
  • ObjC <-> Swift 桥接和工厂方法

    我想从 Swift 使用一些 Objective C 类 由于超出了这个问题范围的原因 我的班级init方法被标记为不可用 相反 有一个工厂方法 这是我的班级的简化形式 interface MyClass NSObject instance
  • 如何在可可中使用核心动画对 png 序列进行动画处理(非触摸)

    我想在 NSImageView 中对 png 序列进行动画处理 但我无法使其工作 它只是不想显示任何动画 有什么建议吗 这是我的代码 void imageAnimation NSMutableArray iconImages NSMutab
  • 将第 3 方库添加到 iPhone 应用程序时如何设置“标题搜索路径”的路径

    我想添加第 3 方库语音转文本 https github com todoroo iPhone Speech To Textto my Xcode项目 我只是拖xcodeproj文件在我的 iPhone 项目中 然后我按照目标依赖项 将二进
  • 防止 UITableView 滚动到某个点以下

    如何让 UITableView 允许在某个索引行上方滚动 但在低于某个点时阻止滚动 例如 如果我有第 1 行到第 100 行 其中在给定时间视图中仅出现 5 行 我希望允许用户在第 1 50 行之间滚动 但在第 50 行可见时阻止进一步向下
  • NSPredicate 使用 RLMResults 作为参数

    我试图通过使用 NSPredicate 进行过滤来获取两组 Realm 数据 并且是不同的对象 之间的差异 但存在一个我无法理解的错误 我的代码 RLMResults topStories KFXTopStory allObjects NS
  • ios - 使用 SIGPIPE 和 SIG_IGN 的信号函数

    我加入了一个旧项目 我发现了这条线 BOOL application UIApplication application didFinishLaunchingWithOptions NSDictionary launchOptions si
  • 我正在寻找 GCDAsyncUdpSocket 上的一些示例,但发现没有一个有效

    接收数据从未被调用过 我编写了这个由我的主线调用的 swift 类UI视图控制器向接收消息的服务器发送消息 但当服务器发回响应时 客户端永远不会收到它 因为 didReceiveData 从未被触发 我一直在谷歌上搜索并查看文档 它说客户端
  • 如何在 iOS 5 中使用 Embed Segue?

    iOS 6 引入了 Embed Segue 允许在 Storyboard 中使用自定义容器控制器 有没有办法在 iOS 5 上复制这个 这里的挑战是子视图控制器的视图通常要添加为父视图控制器的某些容器视图的子视图 因为你不能随机进行序列UI
  • iOS SWIFT - WebRTC 从前置摄像头更改为后置摄像头

    WebRTC 视频默认使用前置摄像头 效果很好 但是 我需要将其切换到后置摄像头 但我无法找到任何代码来执行此操作 我需要编辑哪一部分 是 localView 或 localVideoTrack 还是捕获器 斯威夫特3 0 对等连接只能有一
  • NSUserDefaults、Settings.bundle 和应用程序组

    我有一个有 2 个目标的应用程序 主应用程序和 Today 扩展 为了在这些目标之间共享设置 我打开了应用程序组功能 添加了一个组group myApp com然后使用NSUserDefaults在主应用程序和今日扩展中都是如此 var d

随机推荐