我们正在开发一个游戏,其中包含UIViews
在OpenGL ES视图上显示的2d元素(具体来说,我们正在使用GLKit的GLKView
)并且在保持位置完全同步方面存在问题。< / p>
在父视图的layoutSubviews
中,我们将世界中的3D位置投影到屏幕上,并将其用作游戏中多个UIView
“标记”的位置。整个游戏仅响应用户移动相机而更新,并且每次移动时相机都会显示视图setNeedsLayout
。
Everthing的工作正常,但标记似乎与3d渲染大约1帧不同步。我粗略地说,因为(1)这是一个估计! (2)我想知道是否存在多线程问题:不GLKView
同步到特殊的屏幕刷新回调还是什么?
是否有某种方法可以挂钩视图的layoutSubviews,以便将其同步到3d视图更新?
更新:很奇怪,在layoutIfNeeded
之后立即致电setNeedsLayout
会使问题更糟!可能是2帧或更多帧。真的不明白!
答案 0 :(得分:0)
什么触发你对LayoutSubviews的调用?
这一切都取决于RunLoop中您的呼叫被触发的位置与触发GLK更新呼叫的位置。
一般来说,对于你正在做的事情,我的目标是将你的布局作为GLK更新的副作用 - 即不要等待layoutSubviews改变你的位置。
(如果您使用的是OpenGL,那么整个“布局”系统对您来说并没有多大用处:GLK正在自己的可变帧率小世界中运行,并且您希望将其作为您的参考点)< / p>
答案 1 :(得分:0)
如果不使用OpenGL绘制视频帧(在相同的上下文中绘制,以便始终确保一帧包含相同的视频和动画时间),则无法正确执行此操作。你做的其他事情,帧率补偿,滞后预测,只取决于机会,并且总是有点不同步。
我不熟悉UIView
但是如果有任何方法让它播放音频并将帧复制到纹理,那就这样做吧。音频中的滞后更容易补偿,人类更不容易注意到视频。