为什么SCNRenderer在绘制到OpenGL上下文时会如此不同步/滞后?

时间:2017-06-29 23:09:31

标签: ios opengl-es scenekit

我有一个SceneKit SCNRenderer,我用它来将一些对象绘制到现有的OpenGL应用程序中。

renderer = SCNRenderer( context: EAGLContext.current(), options: nil )

在更新其相机变换后,我从每个帧的glkView方法调用它:

override func glkView(_ view: GLKView, drawIn rect: CGRect) {
    // render my OpenGL stuff
    ...
    // Render the SceneKit
    cameraNode.transform = SCNMatrix4Invert(SCNMatrix4FromGLKMatrix4(matrices.mvMatrix))
    cameraNode.camera!.projectionTransform = SCNMatrix4FromGLKMatrix4(matrices.cameraMatrix)
    SCNTransaction.flush() // <= This solved the problem!
    renderer.render(atTime: 0)

我的OpenGL应用程序自动呈现60fps,如果我呈现如上所述的SceneKit,它也会流畅呈现。但是当我把它们结合起来时,发生的事情就是SceneKit似乎落后于渲染可能是1 fps。在下面的screencap(简化为gif)中,OpenGL正在绘制平面,它完美地跟踪我的手指,但是SceneKit绘制的方框落后了。如果我注释掉平面绘图代码,那么框就会完美地跟踪。

我担心答案是将其反转并在SceneKit运行循环中执行我的OpenGL绘图。希望还有其他一些道路。

enter image description here

更新:我无法发布动画gif,但这里是link

更新2:根据Toyos的建议添加场景flush()调用解决了这个问题。

1 个答案:

答案 0 :(得分:2)

我不确定你在渲染什么线程,但是为了防止在使用[SCNTransaction flush]渲染之前刷新场景图形修改。