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

don*_*ile 2 performance opengl-es ios opengl-es-2.0

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

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

运行循环函数由CADisplayLink调用.

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

可以在旅途中在各种设备上进行测试.如果没有连接到Xcode,你将如何跟踪它?

led*_*d42 6

正确的方法是使用delta(lastTime和now之间的差异),如下所示:

    CFTimeInterval time;
    time = CACurrentMediaTime();
    if (lastTime == 0) {
        delta = 0.0;
    } else {
        delta = time - lastTime;
    }
    lastTime = time;
Run Code Online (Sandbox Code Playgroud)

但是他应该在游戏中使用这个增量更多的东西,帧速率总是一个变幻无常的东西,所以任何时间敏感都应该被三角洲所抵消.

假设您要更新具有速度的对象的位置,它应该是这样的:

objectXPos.pos = delta/targetDelta*objectXSpeed;
Run Code Online (Sandbox Code Playgroud)

目标Delta将是完美的帧速率,比如60 fps会给你一个目标Delta 1/60 = 0.0167

这种方式游戏不会受到性能较差的影响.

你还应该实现一种灾难模式,比如血腥的东西停止了一秒或更长时间,你可以选择不更新游戏逻辑,在这种情况下,它比用户神奇地发生的一切更好.这部分取决于游戏的类型,第二部分可能是矫枉过正,也许0.033秒已经太多了(帧速率的一半)