私はいくつかのオブジェクトを既存のOpenGLアプリケーションに描画するために使用しているSceneKit SCNRendererを持っています。私は、フレームごとにglkViewメソッドから呼び出すOpenGLコンテキストに描画するときにSCNRendererが同期しない/遅くなるのはなぜですか?
renderer = SCNRenderer(context: EAGLContext.current(), options: nil)
は、そのカメラを更新した後に変換:
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はおそらく1fpsのレンダリングに遅れているようです。次のscreencap(gifに縮小)では、飛行機がOpenGLによって描画されており、指を完全に追跡していますが、SceneKitによって描画されたボックスは遅れています。私が平面描画コードをコメントアウトすると、ボックスは完全に追跡されます。
私は、これを逆転させて、SceneKitの実行ループの中に私のOpenGLの描画を行うことになるのでしょうか?他の道があると思っています。
UPDATE:私はアニメーションGIFを投稿しますが、ここでlinkだことはできません。
更新2:Toyosが提案したシーンflush()呼び出しを追加すると、問題が解決しました。
OMGがトリックをしました!あなたは命の恩人です! :)私のレンダーコールの前に 'SCNTransaction.flush()'を追加すると、問題が解決したようです。トランスフォームの変更後、または最初のシーンのビルド直後にレンダリングコールがうまくいくように見えるようにする必要があるかどうかは完全にはわかりません。 –