一位朋友刚问了我这个有趣的问题,我对此没有答案。
他正在制作游戏,有时他会遇到帧速率的滞后。好像10帧或更多帧被丢弃。
运行循环功能由CADisplayLink调用。
有没有办法以编程方式判断帧速率是否滞后?我只是测量运行循环函数中的时间,然后检查它是否比预期的要大。如果是,请记住存在滞后。
可以在旅途中测试各种设备。如果不连接到Xcode,你将如何跟踪它呢?
答案 0 :(得分:6)
正确的方法是使用delta(lastTime和now之间的差异),如下所示:
CFTimeInterval time;
time = CACurrentMediaTime();
if (lastTime == 0) {
delta = 0.0;
} else {
delta = time - lastTime;
}
lastTime = time;
但是他应该在游戏中使用这个delta更多的东西,帧率总是一个变化无常的东西,所以任何时间敏感都应该被delta所抵消。
假设您要更新具有速度的对象的位置,它应该是这样的:
objectXPos.pos = delta/targetDelta*objectXSpeed;
目标Delta将是完美的帧率,比如60 fps会给你一个目标Delta 1/60 = 0.0167
这样游戏就不会受到性能较差的影响。
你也应该实施一种灾难模式,比如血腥的东西会停止一秒或更长时间,你可以选择不更新游戏逻辑,在这种情况下,它比用户神奇地发生的一切都要好。这部分取决于游戏的类型,第二部分可能是矫枉过正,可能0.033秒已经太多(帧速率的一半)
答案 1 :(得分:2)
简单。每帧渲染增加一个整数帧计数变量。每隔一秒或每十秒设置一次重复的NSTimer。在计时器回调中,计算帧计数器在1或10秒内前进了多少,并在隐藏的调试视图中显示最小/最大/平均值,或者将其附加到可以使用文档共享获取的日志文件。