将UIView布局同步到OpenGL帧

时间:2013-02-25 21:49:42

标签: ios layout opengl-es uiview

我们正在开发一个游戏,其中包含UIViews在OpenGL ES视图上显示的2d元素(具体来说,我们正在使用GLKit的GLKView)并且在保持位置完全同步方面存在问题。< / p>

在父视图的layoutSubviews中,我们将世界中的3D位置投影到屏幕上,并将其用作游戏中多个UIView“标记”的位置。整个游戏仅响应用户移动相机而更新,并且每次移动时相机都会显示视图setNeedsLayout

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

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

更新:很奇怪,在layoutIfNeeded之后立即致电setNeedsLayout会使问题更糟!可能是2帧或更多帧。真的不明白!

2 个答案:

答案 0 :(得分:0)

什么触发你对LayoutSubviews的调用?

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

一般来说,对于你正在做的事情,我的目标是将你的布局作为GLK更新的副作用 - 即不要等待layoutSubviews改变你的位置。

(如果您使用的是OpenGL,那么整个“布局”系统对您来说并没有多大用处:GLK正在自己的可变帧率小世界中运行,并且您希望将其作为您的参考点)< / p>

答案 1 :(得分:0)

如果不使用OpenGL绘制视频帧(在相同的上下文中绘制,以便始终确保一帧包含相同的视频和动画时间),则无法正确执行此操作。你做的其他事情,帧率补偿,滞后预测,只取决于机会,并且总是有点不同步。

我不熟悉UIView但是如果有任何方法让它播放音频并将帧复制到纹理,那就这样做吧。音频中的滞后更容易补偿,人类更不容易注意到视频。