使用 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