私は1つのアプリケーションでSKViewとMTKViewを実行しており、これまでのところうまく機能しています。SceneKitまたはSpriteKitと一緒に純粋なMetal-APIを使用
唯一のことは、両方のビューが視覚的に統合されていないことです。彼らはちょうど並んでいます。しかし、SKView内の純粋な金属レンダリングをSKNodeの内部で動かしたいと思っています。これは、SKView内部の高速表示の一種です。
かなりの計算とレンダリングのものを実行している金属面で。 SKViewは、純粋な金属部品の重い計算と最小限ではあるが非常に速いレンダリングのための素晴らしいUIを提供する必要があります。
SCNRendererがrenderAtTimeで独自のMTLCommandBufferとMTLRenderPassDescriptorをレンダリングする可能性を提供しているので、私は既にSpriteKitシーンのオーバーレイでSceneKitを使用することを考えました。
私は次の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を同時に使用することはできません。彼らは別の目的の2つの別々の技術です。 –
Nah。 UIKitと同様に、Sprite KitとScene Kitの目的は、どちらもMetalの目的の部分的なサブセットです。 Sprite KitとScene KitはMetalベースのライブラリとして理にかなっていますが、現在はゲームエンジンに似ていますが、クロスプラットフォームにならないと意味がありません。 – Jessy
これを行う方法があります。たとえば、SCNRenderの場合:https://developer.apple.com/library/prerelease/ios/documentation/SceneKit/Reference/SCNRenderer_Class/index.html#//apple_ref/doc/uid/TP40012014-CLSCHSCNRenderer-DontLinkElementID_4 またはSCNSceneRenderer: https://developer.apple.com/library/prerelease/ios/documentation/SceneKit/Reference/SCNSceneRenderer_Protocol/#//apple_ref/doc/uid/TP40012016-CLSCHSCNSceneRenderer-DontLinkElementID_11 – Oliver