10

我们正在开发一款在 OpenGL ES 视图上显示 2d 元素的游戏UIViews(具体来说,我们使用的是 GLKit GLKView),并且在保持位置完全同步时遇到了问题。

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

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

有没有办法挂钩视图的 layoutSubviews 以便它同步到 3d 视图更新?

更新layoutIfNeeded:奇怪的是,之后立即打电话setNeedsLayout会使问题变得更糟!可能会输出 2 帧或更多帧。真是搞不懂啊!

4

2 回答 2

0

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

这完全取决于在 RunLoop 中触发调用的位置与触发 GLK 更新调用的位置。

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

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

于 2013-04-01T12:36:08.467 回答
0

如果不使用 OpenGL 绘制视频帧(在相同的上下文中绘制,以便您始终确定一帧包含相同时间的视频和动画),这是不可能正确完成的。你所做的一切,帧率补偿,延迟预测,只取决于机会,并且总是有点不同步。

我不熟悉,UIView但如果有任何方法可以让它播放音频并将帧复制到纹理,那就这样做。与视频相比,音频中的延迟更容易补偿,并且人类不太明显。

于 2014-05-28T08:57:36.387 回答