我制作了一个在整个代码中使用许多计时器的游戏。然而,计时器必须在如此短的时间内处理许多任务,这导致我的游戏出现延迟的问题。例如,我的计时器以 (0.05) 的间隔运行,它需要在屏幕上绘制和更新许多图像。有什么办法可以分配工作流程,使程序运行更顺畅?
谢谢
凯文
我制作了一个在整个代码中使用许多计时器的游戏。然而,计时器必须在如此短的时间内处理许多任务,这导致我的游戏出现延迟的问题。例如,我的计时器以 (0.05) 的间隔运行,它需要在屏幕上绘制和更新许多图像。有什么办法可以分配工作流程,使程序运行更顺畅?
谢谢
凯文
我会使用 anNSThread
而不是NSTimer
. 我使用 NSThread 在这方面取得了更大的成功,因为它在独立线程上运行并且不会从您的主 ui 线程中触发。在线程的循环中,将其睡眠 1/20(您的 0.05)秒。因为线程没有在 UI 线程上运行,所以它的所有任务都不应该减慢你的 UI。但是,因为它没有在 UI 上运行,您必须调用performSelectorOnMainThread
以从该后台线程更新 UI。我锁定了我的更新方法(一个简单的布尔值),如果最后一次 ui 更新没有发生,就跳过这个。然后,如果我的处理时间用完了,我只会在这里和那里丢一两帧。在我重画之前,我也做了很多检查,看看是否有任何实际变化。
简单的解决方案:抛弃 NSTimer。
将重绘代码移至单个方法,然后使用CADisplayLink
. 使用您的NSTimer
方法的问题是,对于屏幕而言,所有内容都被重绘得太快或太慢。通过使用 CADisplayLink,您可以将重绘代码与屏幕刷新率同步。然后,您需要做的就是修改您的代码,以便它可以处理在特定时间没有被调用的问题。
是的,检查以确保您不需要像 Aran Mulholland 上面所说的那样重绘。只要确保支票不会像重绘一样长。
并记住优化您的代码。很多。使用 ivars 访问对象,但使用整个属性 (self.myObject =) 来设置您的对象。