23

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

所以我的问题是使用 NSTimer 的最佳选择是什么?

请每个答案另一种选择。

4

3 回答 3

18

您可以使用线程获得更好的性能,请尝试以下操作:

- (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方法中,您准备帧缓冲区、绘制帧并在屏幕上显示帧缓冲区。(PS 有一篇很棒的文章介绍了各种类型的游戏循环及其优缺点。)

于 2008-10-22T08:35:14.303 回答
4

我不特别了解 iPhone,但我仍然可以提供帮助:不要简单地在循环结束时插入固定延迟,而是使用以下命令:

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

您可能希望有一个警报机制,让您知道您的时间是否太紧(即,如果您在所有补偿后的睡眠时间小于 0,这意味着您需要更多的时间来处理您的帧速率允许)。效果将是您的游戏速度变慢。对于额外的点,如果您检测到这种情况发生,您可能希望简化渲染一段时间,直到您再次有足够的备用容量。

于 2008-10-22T07:58:51.163 回答
0

使用CADisplayLink,你可以在XCODE中提供的OpenGL ES模板项目中找到如何(从这个模板开始创建一个项目,看看EAGLView类,这个例子是基于open GL的,但是你只能将CADisplayLink用于其他一种游戏

于 2010-11-29T13:14:04.623 回答