1

希望那里有一些 GLKViewController 专家,因为我有一些问题 :)

只是对我的应用程序的快速描述。我有一个 UINavigationController 在其中推送不同的屏幕。

在某些时候,我进入了我的游戏屏幕,它是 UINavigationController 的子类。在这个屏幕中,viewDidLoad我手动创建了一个 EAGLContext、GLKView 并实例化了一个新的 GLKViewController(以处理我的更新和绘制调用)。

我将首选 fps 设置为 30。

问题是前 3-4 个更新调用带有正确的 DT,但是我有 2-3 帧,它们之间有 1 秒。我使用 测量 DT controller.timeSinceLastUpdate。所以我喜欢:

dt=0.33
dt=0.33
dt=0.33
dt=1.07
dt=1.05
dt=0.33
dt=0.33

在此之后,我只得到有效的 DT 时间。我不知道为什么这些帧有这种延迟。我测量了我在更新和绘制方法中花费的时间,距离 1 秒还差得很远。

另外,我没有加载任何纹理/创建任何几何图形。一切都是在加载时完成的,因为它是一个相当小的游戏。

此外,如果我弹出游戏屏幕控制器,然后推回游戏屏幕的另一个实例,这个新的 GLKViewController 只会大约每 1 秒调用一次我的更新方法。

有人在使用 GLKViewController 时遇到帧率问题吗?

谢谢,

4

2 回答 2

1

问题是您不知道设备在刷新之间还做了什么:)

您可能只花了 0.1 秒处理下一帧,但如果出现内存警告,那么您的应用程序的其他部分也需要时间来处理。我猜 gl 控制器会尽力保持首选帧速率,但如果在后台发生很多事情,那么它就无能为力了。

只要您确保您的代码尽可能快地渲染并且不会以与帧速率相同的方式飙升,那么它就不是您的渲染路径。从你的问题听起来你已经测试过了。

您可能想要做的另一件事是注意可能传递到您的应用程序的其他通知(即内存警告)。

最后,慢帧是否有规律——它们是否与正在加载的新图像或文件访问一致?你事先做了尽可能多的事吗?编辑 - 重读你的问题让我觉得你已经这样做了,对不起!

对不起,我不能再使用了:(

于 2011-10-28T17:18:54.397 回答
0

好的,所以我终于想通了。事实证明,它甚至与 GLKViewController 无关(惊喜!)。

它与我显示游戏屏幕视图控制器的方式有关,如下所示:

    GameAreaViewController* gameController = [[GameAreaViewController alloc] init];

    [UIView beginAnimations:@"animation" context:nil];
    [self.navigationController pushViewController: gameController animated:NO]; 
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.navigationController.view cache:NO]; 
    [UIView setAnimationDuration:0.7f];
    [UIView commitAnimations];        

    SAFE_DEL(gameController);

如果我使用 0.3f 的动画持续时间,那么我不会有任何延迟。在 0.5f 有时我会得到它,而在 0.7 我总是得到它。

于 2011-11-01T09:36:16.067 回答