Ios 提高SceneKit游乐场的速度

Ios 提高SceneKit游乐场的速度,ios,swift,scenekit,swift-playground,scnnode,Ios,Swift,Scenekit,Swift Playground,Scnnode,我正在测试一些简单的SceneKit运行时节点创建平面(只有大约30个平面),并且更愿意使用游乐场来测试概念。通常操场运行速度相当快,但使用SceneKit,通常只需几分之一秒的绘图就需要几分钟。下面是我的代码,它绘制了一个简单的5x5迷宫 import UIKit import SceneKit import PlaygroundSupport // needed to create the live view let maze = Maze(mazeSizeX, mazeSizeY) pu

我正在测试一些简单的SceneKit运行时节点创建平面(只有大约30个平面),并且更愿意使用游乐场来测试概念。通常操场运行速度相当快,但使用SceneKit,通常只需几分之一秒的绘图就需要几分钟。下面是我的代码,它绘制了一个简单的5x5迷宫

import UIKit
import SceneKit
import PlaygroundSupport // needed to create the live view

let maze = Maze(mazeSizeX, mazeSizeY)
public let π = M_PI
maze.solveMaze(x: mazeSizeX-1, y: mazeSizeY-1, comingFrom: -1)
maze.displayWithSolution()

let cellSize: CGFloat = 1.0

let scene = SCNScene()


let blueMat = SCNMaterial()
blueMat.diffuse.contents = #colorLiteral(red: 0.9529411793, green: 0.6862745285, blue: 0.1333333403, alpha: 1)
blueMat.lightingModel = SCNMaterial.LightingModel.physicallyBased

let redMat = SCNMaterial()
redMat.diffuse.contents = #colorLiteral(red: 0.9254902005, green: 0.2352941185, blue: 0.1019607857, alpha: 1)
redMat.lightingModel = SCNMaterial.LightingModel.physicallyBased

let greenMat = SCNMaterial()
greenMat.diffuse.contents = #colorLiteral(red: 0.3411764801, green: 0.6235294342, blue: 0.1686274558, alpha: 1)
greenMat.lightingModel = SCNMaterial.LightingModel.physicallyBased

let purpleMat = SCNMaterial()
purpleMat.diffuse.contents = #colorLiteral(red: 0.5568627715, green: 0.3529411852, blue: 0.9686274529, alpha: 1)
purpleMat.lightingModel = SCNMaterial.LightingModel.physicallyBased


let planeN = SCNPlane(width: cellSize, height: cellSize)
let planeS = SCNPlane(width: cellSize, height: cellSize)
let planeE = SCNPlane(width: cellSize, height: cellSize)
let planeW = SCNPlane(width: cellSize, height: cellSize)

planeN.materials = [blueMat]
planeS.materials = [redMat]
planeE.materials = [greenMat]
planeW.materials = [purpleMat]
//plane.firstMaterial?.isDoubleSided = true


for x in 0 ..< mazeSizeX
{
    let xPos: CGFloat = CGFloat(x)
    for y in 0 ..< mazeSizeY
    {
        let yPos: CGFloat = CGFloat(y)
        if maze.isWallThere(x: Double(x), y: Double(y), side: North)
        {
            let planeNode = SCNNode(geometry: planeN)
            planeNode.rotation = SCNVector4(-1, 0, 0, π/2)
            planeNode.position = SCNVector3(-yPos*cellSize, (xPos-0.5)*cellSize, cellSize/2.0)
            scene.rootNode.addChildNode(planeNode)
        }
        if maze.isWallThere(x: Double(x), y: Double(y), side: South)
        {

            let planeNode = SCNNode(geometry: planeS)
            planeNode.rotation = SCNVector4(1, 0, 0, π/2)
            planeNode.position = SCNVector3(-yPos*cellSize, (xPos+0.5)*cellSize, cellSize/2.0)
            scene.rootNode.addChildNode(planeNode)
        }
        if maze.isWallThere(x: Double(x), y: Double(y), side: East)
        {
            let planeNode = SCNNode(geometry: planeE)
            planeNode.rotation = SCNVector4(0, 1, 0, π/2)
            planeNode.position = SCNVector3((-yPos-0.5)*cellSize, xPos*cellSize, cellSize/2.0)
            scene.rootNode.addChildNode(planeNode)
        }
        if maze.isWallThere(x: Double(x), y: Double(y), side: West)
        {
            let planeNode = SCNNode(geometry: planeW)
            planeNode.rotation = SCNVector4(0, -1, 0, π/2)
            planeNode.position = SCNVector3((-yPos+0.5)*cellSize, xPos*cellSize, cellSize/2.0)
            scene.rootNode.addChildNode(planeNode)
        }
    }
}


let floor = SCNNode(geometry: SCNBox(width: CGFloat(mazeSizeX), height: CGFloat(mazeSizeY), length: 0.1, chamferRadius: 0))
floor.position = SCNVector3(-(CGFloat(mazeSizeX)/2.0)+0.5, (CGFloat(mazeSizeY)/2.0)-0.5, 0)
scene.rootNode.addChildNode(floor)

let light = SCNLight()
light.type = SCNLight.LightType.omni
let lightNode = SCNNode()
lightNode.light = light
lightNode.position = SCNVector3(40,12,15)
scene.rootNode.addChildNode(lightNode)


let light2 = SCNLight()
light2.type = SCNLight.LightType.omni
let lightNode2 = SCNNode()
lightNode2.light = light
lightNode2.position = SCNVector3(-40,-24,-30)
scene.rootNode.addChildNode(lightNode2)

var cameraPosition = SCNVector3Make(0.5, 0.5, 0.5)
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.position = cameraPosition
cameraNode.rotation = SCNVector4(-1, 0, 0, π/2)
scene.rootNode.addChildNode(cameraNode)

//let view = SCNView() //iPad version
let view = SCNView(frame: CGRect(x: 0, y: 0, width: 400, height: 600))     //Xcode version
view.allowsCameraControl = true
view.autoenablesDefaultLighting = true
view.showsStatistics = true
view.scene = scene
view.backgroundColor = #colorLiteral(red: 0.8078431487, green: 0.02745098062, blue: 0.3333333433, alpha: 1)
PlaygroundPage.current.liveView = view
导入UIKit
导入SceneKit
导入PlaygroundSupport//创建实时视图所需
设迷宫=迷宫(mazeSizeX,mazeSizeY)
公共letπ=M_π
迷宫。解算迷宫(x:mazeSizeX-1,y:mazeSizeY-1,来自:-1)
maze.displayWithSolution()
let cellSize:CGFloat=1.0
让场景=SCNScene()
设blueMat=scnmatary()
blueMat.diffuse.contents=#colorLiteral(红色:0.9529411793,绿色:0.6862745285,蓝色:0.133333403,alpha:1)
blueMat.lightingModel=scnmatary.lightingModel.physicallybase
设redMat=SCNMaterial()
redMat.diffuse.contents=#colorLiteral(红色:0.9254902005,绿色:0.2352941185,蓝色:0.1019607857,alpha:1)
redMat.lightingModel=scnmatary.lightingModel.physicallybase
设greenMat=SCNMaterial()
greenMat.diffuse.contents=#colorLiteral(红色:0.3411764801,绿色:0.6235294342,蓝色:0.1686274558,alpha:1)
greenMat.lightingModel=scnmatary.lightingModel.physicallybase
设purpleMat=SCNMaterial()
purpleMat.diffuse.contents=#colorLiteral(红色:0.5568627715,绿色:0.3529411852,蓝色:0.9686274529,alpha:1)
purpleMat.lightingModel=SCNMaterial.lightingModel.Physicallybase
let planeN=SCNPlane(宽度:cellSize,高度:cellSize)
let planeS=SCN平面(宽度:cellSize,高度:cellSize)
让平面E=SCNPlane(宽度:cellSize,高度:cellSize)
let planeW=SCNPlane(宽度:cellSize,高度:cellSize)
平面材料=[blueMat]
planeS.materials=[redMat]
平面材料=[greenMat]
平面材料=[purpleMat]
//平面.firstMaterial?.isDoubleSided=真
对于0中的x..

在优化运动场中的SceneKit绘图时,我是否做错了什么或可以做什么?

我尽可能在macOS中进行SceneKit运动场工作。iOS操场上根本没有这种表现。

我也经历过同样的行为。我最终在我的设备上部署了代码,这比复杂的东西更快。你可以在bugreport.apple.com上提交bugreport。那么至少有人在看它。如果没有错误通知单,他们不会做出任何改进。@Hal的回答是轻描淡写的。游乐场在渲染场景方面非常糟糕。比模拟器更糟糕,这说明了一些问题。