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

Why is SCNRenderer so out of sync / laggy when drawing into an OpenGL context?

我有一个 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。在下面的屏幕截图(缩减为 gif)中,平面是由 OpenGL 绘制的,它完美地跟踪了我的手指,但是 SceneKit 绘制的框落后了很多。如果我注释掉平面绘图代码,盒子就会完美地跟踪。

恐怕答案是将其反转并在 SceneKit 运行 循环内进行我的 OpenGL 绘图。希望还有其他路径。

更新:我无法 post 动画 gif,但这是 link

更新 2:按照 Toyos 的建议添加场景 flush() 调用解决了问题。

我不确定您在哪个线程中渲染,但以防万一您应该在使用 [SCNTransaction flush] 渲染之前刷新场景图修改。