2017-06-29 3 views
1

私はいくつかのオブジェクトを既存の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の描画を行うことになるのでしょうか?他の道があると思っています。

enter image description here

UPDATE:私はアニメーションGIFを投稿しますが、ここでlinkだことはできません。

更新2:Toyosが提案したシーンflush()呼び出しを追加すると、問題が解決しました。

答えて

2

レンダリング中のスレッドではわかりませんが、[SCNTransaction flush]を使ってレンダリングする前にシーングラフの変更をフラッシュする必要がある場合に備えて、わかります。

+0

OMGがトリックをしました!あなたは命の恩人です! :)私のレンダーコールの前に 'SCNTransaction.flush()'を追加すると、問題が解決したようです。トランスフォームの変更後、または最初のシーンのビルド直後にレンダリングコールがうまくいくように見えるようにする必要があるかどうかは完全にはわかりません。 –

関連する問題