gpt4 book ai didi

iphone - Xcode/Objective-C : Why is NSTimer sometimes slow/choppy?

转载 作者:太空狗 更新时间:2023-10-30 03:59:26 24 4
gpt4 key购买 nike

我正在开发一款 iPhone 游戏,我有一个 NSTimer 可以为屏幕上的所有对象设置动画:

EverythingTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/30.0 target:self selector:@selector(moveEverything) userInfo:nil repeats:YES];

大多数时候它运行得非常顺利,但有时我会看到事情进展缓慢或起伏不定。我有分别停止和启动定时器的暂停和恢复功能。当我暂停然后取消暂停时,它似乎解决了断断续续的问题。

对于为什么会发生这种情况有什么想法吗?或者我该如何解决?

最佳答案

Any ideas to why this is happening?

简短的回答是,在您的情况下,您正在基于非同步推送模型执行操作(动画),并且您使用的机制不适合您正在执行的任务。

补充说明:

  • NSTimer 分辨率低。
  • 您的工作在主运行循环中执行。计时器可能不会在您期望的时候触发,因为在该线程上进行工作时可能会花费很多时间,这会阻止您的计时器触发。进程中的其他系统事件甚至线程会使这种变化更大。
  • 不同步的更新可能会导致大量不必要的工作或断断续续,因为您在回调中执行的更新是在更新发生后的某个时间发布的。这会增加更新时间准确性的更多变化。当更新不同步时,很容易导致丢帧或执行大量不必要的工作。在优化绘图之前,此成本可能并不明显。

NSTimer 文档(强调我的):

A timer is not a real-time mechanism; it fires only when one of the run loop modes to which the timer has been added is running and able to check if the timer’s firing time has passed. Because of the various input sources a typical run loop manages, the effective resolution of the time interval for a timer is limited to on the order of 50-100 milliseconds. If a timer’s firing time occurs during a long callout or while the run loop is in a mode that is not monitoring the timer, the timer does not fire until the next time the run loop checks the timer. Therefore, the actual time at which the timer fires potentially can be a significant period of time after the scheduled firing time.

如果您还准备优化绘图,解决此问题的最佳方法是使用 CADisplayLink,正如其他人提到的那样。 CADisplayLink 是 iOS 上的一个特殊“计时器”,它以屏幕刷新率的(有效)分度执行您的回调消息。这允许您将动画更新与屏幕更新同步。此回调在主线程上执行。注意:此功能在 OS X 上不太方便,其中可能存在多个显示器 (CVDisplayLink)。

因此,您可以从创建显示链接开始,并在其回调中执行处理动画和绘图相关任务的工作(例如,执行任何必要的 -setNeedsDisplayInRect: 更新)。确保您的工作非常快,并且您的渲染也很快——那么您应该能够实现高帧率。避免在此回调中进行缓慢的操作(例如文件 io 和网络请求)。

最后一点:我倾向于将我的定时器同步回调聚集到一个 Meta-Callback 中,而不是在运行循环中安装许多定时器(例如以不同的频率运行)。如果您的实现可以快速确定当前要执行哪些更新,那么这可以显着减少您安装的计时器数量(正好一个)。

关于iphone - Xcode/Objective-C : Why is NSTimer sometimes slow/choppy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18582662/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com