【发布时间】:2016-02-17 13:39:36
【问题描述】:
我有一个 SKView 和一个 MTKView 在一个应用程序中运行,到目前为止一切正常。
唯一的问题是,这两个视图在视觉上的整合很差。他们只是肩并肩。但我想让 SKView 内部的纯金属渲染与内部的一些 SKNode 一起移动。是SKView内部的一种快速显示。
在金属方面运行大量的计算和渲染工作。 SKView 应该为繁重的计算和纯金属部分的最小但非常快速的渲染提供一个很好的用户界面。
我已经考虑过使用带有 SpriteKit 场景叠加层的 SceneKit,因为 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 视图中更好?
【问题讨论】:
-
SceneKit 和 SpriteKit 在“幕后”使用金属渲染您的内容。如果你想使用纯金属,那么你不能同时使用 SpriteKit 和 Metal。它们是两种不同的技术,目的不同。
-
不。与 UIKit 一样,Sprite Kit 和 Scene Kit 的用途都是 Metal 用途的部分子集。 Sprite Kit 和 Scene Kit 作为基于 Metal 的库会更有意义,但目前它们更像游戏引擎,除非它们是跨平台的,否则没有意义。
-
有办法做到这一点。例如使用 SCNRender:developer.apple.com/library/prerelease/ios/documentation/… 或使用 SCNSceneRenderer:developer.apple.com/library/prerelease/ios/documentation/…
标签: swift sprite-kit scenekit metal