使用多个 SCNRenderer 时,动画和 SCNTransactions 有时会延迟

Animations and SCNTransactions sometimes delay while using multiple SCNRenderers

我正在使用 3 个 SCNRenderer 从 3 个不同的角度渲染同一个游戏场景。这是一款第三人称射击游戏。前一天,我发现当所有渲染器都在工作时,主角的行走动画消失了,但我仍然可以控制他移动。然后我找到了这个thread。通过使用 CFAbsoluteTimeGetCurrent() 设置渲染函数的 atTime,动画确实出现了。但是,当英雄是运行2个动画时,比如边走边开火,渲染结果只显示了其中的1个。

我确实通过节省 SCNView 的渲染函数给出的时间解决了这个问题,然后将它应用于每个渲染器的渲染函数。这是我的解决方案示例:

var globeTime:TimeInterval = 0  

//the SCNView's render function:  
func renderer(_ aRenderer: SCNSceneRenderer,   
              updateAtTime time: TimeInterval) {   
     globeTime = time  
     //...  
}  

//each renderer's render function:  
renderer.render(atTime: globeTime,   
                viewport: viewport,   
                commandBuffer: commandBuffer,   
                passDescriptor: renderPassDescriptor)  

我成功地让那些渲染器渲染了正确的东西。然而,奇怪的事情开始发生。有时,当动画或 SCNTransaction 开始时,什么也没有发生。所有的动画和 SCNTransactions 都只是暂停在它们的初始状态。但是游戏仍然是运行,这意味着我仍然可以在没有任何动画的情况下控制我的英雄移动和跳跃。几秒钟后,暂停的动画和 SCNTransactions 开始。

我不知道是什么原因造成的。我检查了那些模型的 isPaused 属性 以及 SCNView 和 SCNRenderer 的 isPlaying 和循环 属性。尽管如此,我还是不明白为什么。谁能帮帮我?

看来我找到了答案。在我创建优化以停止渲染器在我不需要它们时进行渲染之前。但是,似乎当渲染器工作时,游戏运行得更快。所以我想通过打开和关闭那些渲染器,场景的时间变得不稳定,这可能会影响动画的时间线。

无论如何,让这些渲染器一直工作就可以解决问题。