为什么 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] 渲染之前刷新场景图修改。
我有一个 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] 渲染之前刷新场景图修改。