【发布时间】: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() 调用解决了问题。
【问题讨论】: