2013-02-25 35 views
10

我们正在开发一个游戏,在OpenGL ES视图(具体而言,我们使用的是GLKit的GLKView)上显示带有UIViews的2D元素,并且在保持位置完全同步时出现问题。将UIView布局同步到OpenGL帧

在父视图的layoutSubviews中,我们将世界上的三维位置投影到屏幕上,并将这些位置作为游戏中几个UIView“标记”的位置。整个游戏只会响应用户移动相机而更新,并且相机会在每次移动时通知setNeedsLayout

Everthing的工作正常,除了标记似乎大致1帧与3d渲染不同步。我粗略地说,因为(1)这是一个估计! (2)我想知道是否有潜在的多线程问题:不是GLKView同步到一个特殊的屏幕刷新回调或什么?

是否有某种方法挂钩视图的layoutSubviews,以便它同步到3d视图更新?

更新:古怪,setNeedsLayout后立即调用layoutIfNeeded使问题更糟糕!可能有2个或更多的帧。真的不明白!

回答

0

什么触发了您对LayoutSubviews的调用?

这一切都取决于您的呼叫触发的RunLoop与触发GLK更新呼叫的位置。

在一般情况下,你在做什么,我的目标是尽你的布局为GLK更新的副作用 - 即不等待layoutSubviews改变你的位置。 (如果你使用的是OpenGL,那么整个“布局”系统对你来说没有多大用处:GLK运行在它自己的可变帧速率的小世界中,并且你想让它成为你的参考点)

0

这是不可能正确地做无图纸使用OpenGL的视频(在相同的情况下绘制,让您始终确保一个帧包含视频和动画的同时)的帧。你所做的每一件事,帧速率补偿,滞后预测,只取决于机会,并且总会有点不同步。

我对UIView不熟悉,但是如果有任何方法让它播放音频并将帧复制到纹理,请执行此操作。音频中的滞后要比在视频中更容易补偿,而且人们更不容易察觉。