iPhone上的OpenGL ES:基于计时器的绘画问题,抖动

时间:2009-12-03 13:36:21

标签: iphone opengl-es timer paint

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

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

我正在测试3G(而不是3GS)设备,8GB。

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

起初我怀疑我的绘制循环是在某些锁定上抓取的(那里没有很多,因为GL在主线程上渲染东西(这是必要的AFAIK),就像传入事件处理一样)但是有些记录更精细的粒度揭示了,在一个绘制代码执行周期中,大量时间超过一些基本上几乎没有做任何事情的代码,当然也不是GL操作。

所以看起来有点像我的GL绘图线程(即主线程),有时候没有充分的理由需要更长的时间。我在我的应用程序中有通信,我禁用了通信,看看是不是问题 - 但我仍然看到我的绘画执行时间有一些“尖峰”,每次都在做相同的绘画。

看起来好像另一个线程正在切换到中间代码代码,多年来,在返回到我的绘画代码之前,在occaison上。

有关如何进一步分析正在发生的事情的任何想法?我知道NSTimers不是很完美而且不是保证频率,但这里的主要问题是我的实际绘制周期有时只需要永远,大概是因为其他一些线程被切换到....

1 个答案:

答案 0 :(得分:0)

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

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

- 大卫