Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NSTimer滞后-iPhone SDK_Iphone_Objective C_Nstimer_Lag - Fatal编程技术网

NSTimer滞后-iPhone SDK

NSTimer滞后-iPhone SDK,iphone,objective-c,nstimer,lag,Iphone,Objective C,Nstimer,Lag,我做了一个游戏,在整个代码中使用了很多定时器。然而,计时器必须在如此短的时间内处理许多任务,这导致了我的游戏出现延迟的问题。例如,我的计时器以(0.05)的间隔运行,它需要绘制和更新屏幕上的许多图像。我有没有办法分配工作流程,使程序运行更顺畅 谢谢 Kevin我会使用NSThread而不是NSTimer。在这方面,我使用NSThread取得了更大的成功,因为它运行在独立线程上,而不是从主ui线程启动。在线程的循环中,将其休眠1/20(0.05)秒。因为线程没有在UI线程上运行,所以它的所有任务都

我做了一个游戏,在整个代码中使用了很多定时器。然而,计时器必须在如此短的时间内处理许多任务,这导致了我的游戏出现延迟的问题。例如,我的计时器以(0.05)的间隔运行,它需要绘制和更新屏幕上的许多图像。我有没有办法分配工作流程,使程序运行更顺畅

谢谢


Kevin

我会使用
NSThread
而不是
NSTimer
。在这方面,我使用NSThread取得了更大的成功,因为它运行在独立线程上,而不是从主ui线程启动。在线程的循环中,将其休眠1/20(0.05)秒。因为线程没有在UI线程上运行,所以它的所有任务都不应该减慢UI的速度。但是,由于它没有在UI上运行,您必须调用
performSelectorOnMainThread
才能从该后台线程更新UI。我锁定了我的更新方法(一个简单的布尔值),如果上次的ui更新没有发生,就跳过这个。然后,如果我的处理时间用完了,我就在这里和那里放一两帧。在我重新绘制之前,我还做了很多检查,看看是否有任何东西确实发生了变化。

简单的解决方案:抛弃NSTimer

将重绘代码移动到单个方法,然后使用
CADisplayLink
。使用
NSTimer
方法的问题在于,对于屏幕而言,所有内容都被重新绘制得太快或太慢。通过使用CADisplayLink,您可以将重画代码与屏幕刷新率同步。然后,您所需要做的就是修改代码,以便它能够处理在特定时间没有被调用的情况

是的,检查以确保您不需要像Aran Mulholland上面所说的那样重新绘制。只要确保支票不会花重画那么长的时间

记住优化你的代码。很多使用IVAR访问对象,但使用整个属性(self.myObject=)设置对象