【问题标题】:Synchronize UIView layout to OpenGL frames将 UIView 布局同步到 OpenGL 帧
【发布时间】:2013-02-11 04:45:49
【问题描述】:

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

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

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

有什么方法可以挂钩视图的 layoutSubviews 以便它同步到 3d 视图更新?

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

【问题讨论】:

    标签: ios layout opengl-es uiview


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      我对@9​​87654321@ 不熟悉,但如果有任何方法可以让它播放音频并将帧复制到纹理中,请执行此操作。与视频相比,音频中的延迟更容易补偿,并且人类不太明显。

      【讨论】:

        猜你喜欢
        • 2014-02-10
        • 1970-01-01
        • 1970-01-01
        • 2012-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-14
        相关资源
        最近更新 更多