0

我在 iPhone 上有一个 OpenGL ES 1.1 项目,主要基于此处给出的空 OpenGL ES 应用程序:

http://iphonedevelopment.blogspot.com/2009/06/empty-opengl-es-application-project.html

我正在 8GB 的​​ 3G(不是 3GS)设备上进行测试。

我的应用程序中执行 openGL 操作的绘制循环在每次渲染屏幕时都会做很多事情。然而,在它在每个绘制周期都做同样的事情的情况下,我看到了可变的帧速率。我已经将触发绘制代码的 NSTimer 设置为每秒触发 30 次——即每 0.0333 秒。主要问题是,虽然我的实际绘制代码通常需要大约相同的时间来执行一个绘制(就墙时间而言),但它会有所不同,有时需要更长的时间,没有明显的原因。使用仔细的日志记录来报告它们发生时的最大时间间隔,我可以看到有时我的绘画需要长达 0.23 秒才能完成 - 这就像 4FPS,与 30FPS 相比,就像跳过 5 帧动画/用户交互,这是不是很可接受。

起初我怀疑我的绘制循环卡在了某个锁上(那里没有很多,因为 GL 在主线程上渲染东西(这是必要的 AFAIK),传入事件处理也是如此),但是一些日志记录的粒度更细透露,在一个绘制代码执行周期中,一段基本上几乎什么都不做的代码流逝了很长时间,当然也不是 GL 操作。

所以它看起来有点像我的 GL 绘图线程(即主线程)有时会无缘无故地花费更长的时间。我的应用程序中有通讯并且我禁用了通讯以查看这是否是问题 - 但我仍然在我的绘画执行时间看到一些“尖峰”,当它每次都在做同样的绘画时。

似乎另一个线程刚刚被切换到,中间油漆代码,很长一段时间,然后返回我的油漆代码,在occaison。

关于如何进一步分析发生了什么的任何想法?我知道 NSTimers 并不完美,也没有保证频率,但这里的主要问题是我的实际绘制周期有时只需要很长时间,大概是因为其他一些线程被切换到......

4

1 回答 1

0

请记住,您的应用程序似乎无缘无故地“挂起”,这与您的“主循环”无关。那是因为你在处理多项任务……特别是,像你的手机检查电子邮件这样简单的事情可能会导致这种问题。无论如何,在 iPhone 上的一个重要原因是,当您在不同的蜂窝站点移动时(例如,如果您在地铁或汽车上),您有时会遇到峰值……不管它做什么。

如果您使用的是 iPhone,请尝试飞行模式,看看问题是否会消失。

- 大卫

于 2009-12-08T06:41:33.837 回答