Red de conocimiento informático - Material del sitio web - Cómo utilizar la inicialización de cierre para acelerar el patio de juegos de Swift

Cómo utilizar la inicialización de cierre para acelerar el patio de juegos de Swift

El patio de juegos de Swift puede ser inexplicablemente lento, especialmente si estás usando SpriteKit o SceneKit. Migrar código a archivos de recursos externos cuando sea posible puede optimizar la compilación y aumentar la velocidad de ejecución.

El mayor problema con este enfoque es que se pierde el flujo lineal en el patio de juegos y la compilación del módulo no admite instrucciones de nivel superior que modifican variables. Por ejemplo, si tiene un código como este:

public let lightNode = SCNNode()

lightNode.light = SCNLight()

lightNode.light!. tipo = SCNLightTypeOmni

lightNode.light!position = SCNVector3(x: 0, y: 10, z: 10)

scnscene.rootNode.addChildNode(lightNode)

(Me disculpo por usar el descomprimido forzado, pero este es un código de muestra de Apple).

No puedes mover este código directamente al archivo del módulo porque estás usando una llamada de nivel superior y este código no compilarse en archivos Swift externos. Como solución alternativa, puede poner este código en una función, por ejemplo:

función interna setupLightNode() -> SCNNode {

let theLight = SCNNode()

theLight.light = SCNLight()

theLight.light!.type = SCNLightTypeOmni

theLight.position = SCNVector3(x: 0, y: 10, z: 10)

scnscene.rootNode.addChildNode(theLight)

devuelve theLight

}

Luego puedes llamar a la función:

let lightNode = setupLightNode()

Esto realmente me frustra porque este enfoque crea una función adicional innecesaria y te obliga a declarar la nueva instancia antes de simplemente procesarla.

Los cierres ofrecen una solución más atractiva y relativamente ligera. Verás esto en el siguiente ejemplo. Aquí, el código de inicialización se encapsula en un grupo separado que se ejecutará y, en última instancia, devolverá una instancia completamente inicializada.

//Crea una luz y agrégala a la escena

public let lightNode: SCNNode = {

let theLight = SCNNode()

theLight.light = SCNLight ()

theLight.light!.type = SCNLightTypeOmni

theLight.position = SCNVector3(x: 0, y: 10, z: 10)

scnscene.rootNode.addChildNode(theLight)

return theLight

}()

Este método le permite usar una declaración separada Crear e inicializar objetos para mantener las declaraciones en el patio de juegos fluidas y legibles, y ejecutarse más rápido.

Este vídeo contiene el código y otras operaciones de configuración del lightNode.

Después de hacer clic en el botón "Ejecutar" de Playground, el tiempo de ejecución es de solo 3 a 4 segundos en lugar de minutos. Este enfoque acelerado tiene mucho sentido para crear prototipos antes de implementar SpriteKit y SceneKit como elementos en una aplicación real.

Actualización: aquí hay otra forma de crear una instancia de clase:

operador infijo?-> {}

// Preparar instancia de clase

func ?-> (objeto:T, f: (T) -> Vacío) -> T {

f(objeto)

devolver objeto

}

clase MiClase {var (x, y, z) = ("x", "y", " z")}

let miInstancia = MiClase( ) ?-> {

$0.x = "NuevoX"

$0.y = "NuevoY"

}