2015-11-16 6 views
7

Ich habe ein SKView und ein MTKView in einer Anwendung laufen und alles funktioniert bisher gut.mit der reinen Metal-API zusammen mit SceneKit oder SpriteKit

Die einzige Sache ist, dass beide Ansichten schlecht visuell integriert sind. Sie sind nur nebeneinander. Aber ich würde gerne das reine Metall Rendering innerhalb des SKView mit einigen SKNodes bewegen. Es ist eine Art schnelle Anzeige innerhalb des SKView.

Auf der Metallseite ziemlich viele Rechen läuft und Sachen zu machen. Der SKView sollte ein nettes UI für die schweren Berechnungen und das minimale, aber sehr schnelle Rendering des reinen Metallteils bieten.

Ich habe bereits über die Verwendung von SceneKit mit einem Overlay einer SpriteKit-Szene nachgedacht, da SCNRenderer die Möglichkeit bietet, einen eigenen MTLCommandBuffer und MTLRenderPassDescriptor mit renderAtTime darzustellen.

I implementiert die folgende SCNSceneRendererDelegate Methode und meine eigene genannt Render-Funktion, die die commandBuffer vorbereitet.

func renderer(renderer: SCNSceneRenderer, didRenderScene scene: SCNScene, atTime time: NSTimeInterval) { 
    nodeArray.render() 
} 

Nach dem commandBuffer ist bereit, ich die renderAtTime Methode meiner SCNRenderer nennen. Versuch und Irrtum zeigten mir, dass der Befehlspuffer nach dem Aufruf von renderAtTime festgeschrieben werden muss. Wenn ich es vorher mache, stürzt die App ab. Wenn ich es überhaupt nicht mache, wird es die App einfrieren.

func bufferFinished(renderer:SCNRenderer, commandBuffer: MTLCommandBuffer, renderPassDescriptor: MTLRenderPassDescriptor){ 
    let current=CFAbsoluteTimeGetCurrent() 
    renderer.renderAtTime(current, viewport: gameView.bounds, commandBuffer: commandBuffer, passDescriptor: renderPassDescriptor) 
    commandBuffer.commit() 
} 

Wenn ich dies tue die App läuft, aber kein zusätzliches Metall Kontext gezeigt. Ich denke, die ganze Sache ist wegen des Metallteils etwas komplex.

Gibt es eine einfache Probe, wo reines Metall in einer SceneKit Ansicht oder besser in einer SpriteKit Ansicht wiedergegeben wird?

+2

SceneKit und SpriteKit machen Ihre Inhalte mit Metall "hinter den Kulissen". Wenn Sie reines Metall verwenden möchten, können Sie SpriteKit und Metal nicht gleichzeitig verwenden. Sie sind zwei getrennte Technologien mit einem anderen Zweck. –

+1

Nein. Wie UIKit sind auch die Ziele von Sprite Kit und Scene Kit Teilbereiche des Zwecks von Metal. Sprite Kit und Scene Kit würden mehr Sinn machen als Metal-basierte Bibliotheken, aber derzeit verhalten sie sich eher wie Game-Engines, was keinen Sinn ergibt, solange sie nicht plattformübergreifend sind. – Jessy

+0

Es gibt Möglichkeiten, dies zu tun. Zum Beispiel mit dem SCNRender: https://developer.apple.com/library/prerelease/ios/documentation/SceneKit/Reference/SCNRenderer_Class/index.html#//apple_ref/doc/uid/TP40012014-CLSCHSCNRenderer-DontLinkElementID_4 oder mit der SCNSceneRenderer: https://developer.apple.com/library/prerelease/ios/documentation/SceneKit/Reference/SCNSceneRenderer_Protocol/#//apple_ref/doc/uid/TP40012016-CLSCHSCNSceneRenderer-DontLinkElementID_11 – Oliver

Antwort

3

Metall, SpriteKit & SceneKit

SpriteKit & SceneKit zusammen arbeiten. Sie können SceneKit in SpriteKit verwenden und umgekehrt.

In SpriteKit können Sie verwenden, um eine SK3DNode SceneKit Szene zu machen. Hier ein Beispiel: https://github.com/CloakedEddy/SK3DNode-example/tree/master/SKSCN%20Crossover

In SceneKit können Sie die overlaySKScene-Eigenschaft Ihres SCNSceneRenderer verwenden, die von Ihrem SCNView vererbt wird. Sie können Ihre SpriteKit-Szenen nebeneinander mit den Szenen von SceneKit rendern.

Aber wie integriert man Metall?

Die Verwendung von Metall mit SpriteKit kann mit Texturen erfolgen. Sie berechnen die Texturen mit Metall auf der GPU und übertragen die Bilddaten über modifyPixelDataWithBlock in eine SKMutableTexture. Das funktioniert, aber Sie müssen die Daten kopieren, die nicht schön sind und SpriteKit arbeitet mit OpenGL hinter den Kulissen und nicht mit Metall. Es muss also eine OpenGL-Textur erstellt werden, die sehr teuer ist, wie Sie sehen können.

Ein weiteres Problem ist, dass Sie die GPU-Daten zu synchronisieren, wenn Sie mit großen Texturen arbeiten sie in CPU-Speicher zu holen. Nur dann können Sie die Daten in das SKMutableTexture kopieren. Dies ist sehr ineffizient, da die Daten wieder zur GPU gehen, aber jetzt mit OpenGL.

enter image description here

Mit SceneKit Sie können wählen, ob Sie OpenGL oder Metall möchte in Bezug auf die GPU zugrunde liegenden Rahmen haben. Und Sie können die Textur in der Materialeigenschaft direkt mit Metall modifizieren. Setzen Sie einfach die contents -Eigenschaft der SCNMaterialProperty. Oder Sie können die SCNGeometrySource direkt nach Metall ändern, wenn Sie die Geometrie eines Objekts ändern möchten.

+0

Alle Aktualisierungen zum Rendern von Metall in SpriteKit ? – Hexagons