如何发现OpenGL ES帧率是否口吃 - 没有乐器?

时间:2011-11-29 01:57:20

标签: ios performance opengl-es opengl-es-2.0

一位朋友刚问了我这个有趣的问题,我对此没有答案。

他正在制作游戏,有时他会遇到帧速率的滞后。好像10帧或更多帧被丢弃。

运行循环功能由CADisplayLink调用。

有没有办法以编程方式判断帧速率是否滞后?我只是测量运行循环函数中的时间,然后检查它是否比预期的要大。如果是,请记住存在滞后。

可以在旅途中测试各种设备。如果不连接到Xcode,你将如何跟踪它呢?

2 个答案:

答案 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秒内前进了多少,并在隐藏的调试视图中显示最小/最大/平均值,或者将其附加到可以使用文档共享获取的日志文件。