我有一个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绘图。希望还有其他一些道路。
更新:我无法发布动画gif,但这里是link。
更新2:根据Toyos的建议添加场景flush()调用解决了这个问题。
答案 0 :(得分:2)
我不确定你在渲染什么线程,但是为了防止在使用[SCNTransaction flush]渲染之前刷新场景图形修改。