我有一个SKView和MTKView在同一个应用程序中运行,到目前为止一切都很顺利。
唯一的问题是这两个视图的视觉整合很差。它们只是并排放置。但我想在SKView内部使用纯Metal渲染,并与其中的一些SKNode一起移动。这是SKView内部快速显示的一种方式。
在Metal方面,运行了相当多的计算和渲染工作。SKView应该为重型计算提供良好的UI和极简但非常快速的纯金属部分渲染。
我已经考虑过使用SceneKit,叠加一个SpriteKit场景,因为SCNRenderer提供了一种使用renderAtTime渲染自己的MTLCommandBuffer和MTLRenderPassDescriptor的可能性。
我实现了以下SCNSceneRendererDelegate方法并调用了我的自定义渲染函数,该函数正在准备commandBuffer。
func renderer(renderer: SCNSceneRenderer, didRenderScene scene: SCNScene, atTime time: NSTimeInterval) {
nodeArray.render()
}
当commandBuffer准备好后,我调用SCNRenderer的renderAtTime方法。试错显示,在调用renderAtTime之后,必须提交命令缓冲区。如果我在此之前这样做,应用程序会崩溃。如果根本不这样做,应用程序会冻结。
func bufferFinished(renderer:SCNRenderer, commandBuffer: MTLCommandBuffer, renderPassDescriptor: MTLRenderPassDescriptor){
let current=CFAbsoluteTimeGetCurrent()
renderer.renderAtTime(current, viewport: gameView.bounds, commandBuffer: commandBuffer, passDescriptor: renderPassDescriptor)
commandBuffer.commit()
}
如果我这样做,应用程序正在运行,但没有显示任何额外的金属上下文。我认为由于金属部分整个事情有点复杂。
是否有任何简单的示例,可以在SceneKit视图或更好的SpriteKit视图中呈现纯金属?