【问题标题】:Why is SCNRenderer so out of sync / laggy when drawing into an OpenGL context?为什么在绘制到 OpenGL 上下文时 SCNRenderer 如此不同步/滞后?
【发布时间】:2017-12-03 19:33:29
【问题描述】:

我有一个 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 绘图。希望有其他途径。

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

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

【问题讨论】:

    标签: ios opengl-es scenekit


    【解决方案1】:

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

    【讨论】:

    • 天哪,成功了!你是救生员! :) 在我的渲染调用之前添加一个SCNTransaction.flush() 似乎已经解决了这个问题。我不完全确定在变换更改之后还是在初始场景构建之后是否有必要,但将它放在我的渲染调用之前似乎没问题。
    猜你喜欢
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多