gpt4 book ai didi

iphone - 具有用于渲染和游戏逻辑的独立计时器的游戏循环

转载 作者:可可西里 更新时间:2023-11-01 03:56:24 25 4
gpt4 key购买 nike

我想将游戏逻辑和渲染分成两个不同的循环,因为我不想让 fps 控制游戏速度。我试图通过为渲染创建一个 CADisplayLink 并为游戏逻辑创建一个 NSTimer 来实现这一点。但是随后发生了一件奇怪的事情:

有时(15 个应用程序运行中有 1 个)游戏以非常低的 fps(大约 5-10)运行,但其余时间完全流畅。如果我删除游戏逻辑的 NSTimer 并将两个循环结合起来,fps 会一直很高,但这显然不是一个可接受的解决方案。所以看起来有时两个计时器会“互相延迟”或类似的事情,但我并不完全理解运行循环的内部工作。

下面是我如何创建计时器和显示链接:

NSTimer *gameTimer = [[NSTimer alloc] initWithFireDate:[NSDate date] interval:1.0 / 60.0 target:self selector:@selector(gameTimerFired:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:gameTimer forMode:NSDefaultRunLoopMode];
[gameTimer release];

CADisplayLink *aDisplayLink = [[UIScreen mainScreen] displayLinkWithTarget:self selector:@selector(drawFrame)];
[aDisplayLink setFrameInterval:animationFrameInterval];
[aDisplayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
self.displayLink = aDisplayLink;

您能告诉我帧率问题的原因以及解决方法吗?

或者您能推荐任何其他解决方案来分离渲染和游戏逻辑循环吗?

最佳答案

您可以使用 gameTimer 或 CADisplayLink 通过一个循环来完成此操作,方法是测量自上一个循环以来耗时并使用它来增强您的游戏逻辑。

所以..

NSDate *oldTime = [[NSDate date] retain];

-(void)updateGame {
NSDate *curTime = [NSDate date];
NSTimeInterval timePassed_ms = [curTime timeIntervalSinceDate:oldTime] * 1000.0;

[oldTime release];
oldTime = curTime;
[oldTime retain];

//use the timePassed_ms to augment your game logic. IE: Moving a ship
[ship moveLength:ship.velocity * timePassed_ms/1000.0];
}

这通常是我处理这类事情的方式。我通常喜欢在我的游戏对象中构建更新函数。所以更新飞船实际上看起来像这样:

[ship update:timePassed_mc];

关于iphone - 具有用于渲染和游戏逻辑的独立计时器的游戏循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7920835/

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