使用 CADisplayLink 的 iOS OpenGL ES 1.1 生涩动画(重启修复了一段时间)

Posted

技术标签:

【中文标题】使用 CADisplayLink 的 iOS OpenGL ES 1.1 生涩动画(重启修复了一段时间)【英文标题】:iOS OpenGL ES 1.1 jerky animation using CADisplayLink (reboot fixes for a while) 【发布时间】:2012-09-02 20:39:59 【问题描述】:

我正在使用 OpenGL ES 1.1 和 CADisplayLink 来制作 3d 场景的动画。如果 ios 设备最近重新启动,则动画很流畅,两次 displayLink.timestamp 调用之间的时间差相当均匀。但是在使用 iOS 设备几个小时或几天后,我的应用有时会运行几次,动画会变得不稳定,时间增量会上升,然后重置为较低的值,然后再次上升。

像这样:

2012-09-01 23:42:58.770 [2678:707] dt= 0.021139

2012-09-01 23:42:58.787 [2678:707] dt= 0.022183

2012-09-01 23:42:58.804 [2678:707] dt= 0.023223

2012-09-01 23:42:58.820 [2678:707] dt= 0.024270

2012-09-01 23:42:58.837 [2678:707] dt= 0.009679

2012-09-01 23:42:58.853 [2678:707] dt= 0.010750

2012-09-01 23:42:58.870 [2678:707] dt= 0.011766

2012-09-01 23:42:58.887 [2678:707] dt= 0.012806

2012-09-01 23:42:58.903 [2678:707] dt= 0.013847

2012-09-01 23:42:58.920 [2678:707] dt= 0.014890

2012-09-01 23:42:58.937 [2678:707] dt= 0.015933

2012-09-01 23:42:58.953 [2678:707] dt= 0.016976

2012-09-01 23:42:58.970 [2678:707] dt= 0.018011

2012-09-01 23:42:58.987 [2678:707] dt= 0.019055

2012-09-01 23:42:59.003 [2678:707] dt= 0.020097

2012-09-01 23:42:59.020 [2678:707] dt= 0.021143

2012-09-01 23:42:59.037 [2678:707] dt= 0.022181

2012-09-01 23:42:59.054 [2678:707] dt= 0.023222

2012-09-01 23:42:59.071 [2678:707] dt= 0.024288

2012-09-01 23:42:59.087 [2678:707] dt= 0.009624

2012-09-01 23:42:59.103 [2678:707] dt= 0.010728

2012-09-01 23:42:59.121 [2678:707] dt= 0.011763

2012-09-01 23:42:59.137 [2678:707] dt= 0.012808

2012-09-01 23:42:59.153 [2678:707] dt= 0.013847

2012-09-01 23:42:59.170 [2678:707] dt= 0.014891

2012-09-01 23:42:59.187 [2678:707] dt= 0.016002

2012-09-01 23:42:59.203 [2678:707] dt= 0.016979

2012-09-01 23:42:59.220 [2678:707] dt= 0.018016

2012-09-01 23:42:59.237 [2678:707] dt= 0.019042

2012-09-01 23:42:59.253 [2678:707] dt= 0.020099

2012-09-01 23:42:59.270 [2678:707] dt= 0.021138

2012-09-01 23:42:59.287 [2678:707] dt= 0.022185

2012-09-01 23:42:59.304 [2678:707] dt= 0.023222

2012-09-01 23:42:59.320 [2678:707] dt= 0.024265

2012-09-01 23:42:59.337 [2678:707] dt= 0.009681

2012-09-01 23:42:59.354 [2678:707] dt= 0.010736

然后,如果 iOS 设备重新启动,动画又会变得流畅。

当 UpdateAnimation() 函数中几乎没有与游戏相关的计算时,甚至在我的菜单屏幕上也会出现此问题。

我不明白发生了什么以及为什么重新启动总能在一段时间内解决此问题。

【问题讨论】:

如果您使用反向调用树对您的应用程序运行 Time Profiler,您是否看到任何明显的热点? @Brad-Larson,我使用反向调用树运行时间分析器,但我没有看到任何看起来像热点的东西。 【参考方案1】:

发现问题了!我正在使用 CADisplayLink 中的时间戳来计算帧之间的时间。时间戳是双精度的,但我(错误地)将它分配给浮点数。这导致精度损失,并导致不正确的帧时间计算。时间戳从用户重新启动设备时开始增长,最终变得如此之大,需要双精度才能用于准确计算帧之间的时间。

【讨论】:

以上是关于使用 CADisplayLink 的 iOS OpenGL ES 1.1 生涩动画(重启修复了一段时间)的主要内容,如果未能解决你的问题,请参考以下文章

iOS 动画篇 CADisplayLink与CoreGraphics实现动画

iOS CoreAnimation 逐帧动画 CADisplayLink

iOS CoreAnimation 逐帧动画 CADisplayLink

基于 CADisplayLink 的 FPS 指示器详解

iOS核心笔记——定时器

iOS刷帧动画