除了使用NSTimer,在iPhone上创建游戏循环还有什么更好的方法?

除了使用NSTimer,在iPhone上创建游戏循环还有什么更好的方法?,iphone,objective-c,cocoa,Iphone,Objective C,Cocoa,我正在iPhone上编写一个游戏。我目前正在使用NSTimer触发游戏更新/渲染。问题是(在分析之后),我似乎在更新/渲染之间损失了很多时间,这似乎主要与我插入NSTimer的时间间隔有关 所以我的问题是,使用NSTimer的最佳替代方案是什么 请为每个答案选择一个选项。我不知道iPhone的具体情况,但我仍然可以提供帮助: 不要简单地在循环结束时插入固定的延迟,而是使用以下方法: 确定一个刷新间隔,这个间隔要比通过主循环的单次刷新间隔大 在循环开始时,获取可用分辨率的当前时间戳并存储它 在循

我正在iPhone上编写一个游戏。我目前正在使用NSTimer触发游戏更新/渲染。问题是(在分析之后),我似乎在更新/渲染之间损失了很多时间,这似乎主要与我插入NSTimer的时间间隔有关

所以我的问题是,使用NSTimer的最佳替代方案是什么


请为每个答案选择一个选项。

我不知道iPhone的具体情况,但我仍然可以提供帮助: 不要简单地在循环结束时插入固定的延迟,而是使用以下方法:

  • 确定一个刷新间隔,这个间隔要比通过主循环的单次刷新间隔大
  • 在循环开始时,获取可用分辨率的当前时间戳并存储它
  • 在循环结束时,获取另一个时间戳,并确定自上一个时间戳以来经过的时间(在循环之前对此进行初始化)
  • 理想帧时间与该帧已用时间之差的睡眠/延迟
  • 在下一帧,您甚至可以尝试通过与上一循环开始时的时间戳进行比较来补偿睡眠间隔中的不准确。存储差异,并在循环结束时将其从睡眠间隔中加/减(睡眠/延迟可能太长或太短)

您可能希望有一个警报机制,让您知道您的计时是否太紧(即,如果在所有补偿之后您的睡眠时间小于0,这将意味着您花费的处理时间超过了帧速率允许的时间)。结果就是你的游戏速度变慢了。对于额外的点,如果检测到这种情况,您可能需要在一段时间内简化渲染,直到您再次拥有足够的空闲容量。

如果线程可以获得更好的性能,请尝试以下操作:

- (void) gameLoop
{
    while (running)
    {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        [self renderFrame];
        [pool release];
    }
}

- (void) startLoop
{
    running = YES;
#ifdef THREADED_ANIMATION
    [NSThread detachNewThreadSelector:@selector(gameLoop)
    toTarget:self withObject:nil];
#else
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0f/60
    target:self selector:@selector(renderFrame) userInfo:nil repeats:YES];
#endif
}

- (void) stopLoop
{
    [timer invalidate];
    running = NO;
}

renderFrame
方法中,准备帧缓冲区,绘制帧并在屏幕上显示帧缓冲区。(顺便说一句,关于各种类型的游戏循环及其优缺点都有很多介绍。)

使用CADisplayLink,您可以在XCODE中提供的OpenGL ES模板项目中找到方法(从这个模板开始创建一个项目,看看EagleView类,这个例子是基于OpenGL的,但是你只能在其他类型的游戏中使用CADisplayLink

-1。UIView不是线程安全的,所以你需要做很多其他的事情才能使它工作。UIGraphics从4.0开始就只有线程安全。@tc:你是对的,但是poster没有提到他使用的图形层。因为我们谈论的是游戏,所以我假设OpenGL,这样的循环可以毫无问题地工作。@zoul:
THREADED\u动画
替代方案也适用于早期版本吗?我想我没有读到。你是说早期的iOS版本吗?是的,我在g中使用过类似的代码ames大约2.x或3.x。你看过iPhone开发者的例子吗?我想有一些例子(比如触摸战斗机或CrashLanding)这可能很有启发性。我在互联网上看过很多例子并研究了一些替代方案。所以我已经知道了一些替代方案。我真正想要的是其他人认为最好的替代方案是什么?我正在做一个非常短的项目,所以节省下来的任何调查时间都将是一个很大的帮助。