Precarga de texturas de kit de sprite

Así que estaba leyendo la documentation de Apple para las mejores prácticas de kit de sprite. Me encontré con esto:

Por ejemplo, si su juego usa las mismas texturas para todo su juego, puede crear una class de carga especial que se ejecuta una vez al inicio. Realiza el trabajo de cargar las texturas una vez y luego dejarlas en la memory. Si un object de escena se elimina y se vuelve a crear para reiniciar el juego, las texturas no necesitan volverse a cargar.

Y esto ayudaría significativamente al performance en mi aplicación. ¿Alguien me puede señalar en la dirección correcta de cómo lograría esto?

Supongo que llamaría a una function para cargar textura en mi controller de vista. ¿Y luego acceder a ese atlas de textura?

La cuestión es, ¿realmente quieres almacenar en caching los resources de esa forma? No puedo decir que alguna vez encontré la necesidad de algo de esa naturaleza. De todos modos, si hacerlo de alguna manera ayuda con el performance de tu aplicación, entonces puedes hacer una class TextureManager que sea un singleton (crear un file separado para la class TextureManager ), así:

 class TextureManager{ private var textures = [String:SKTexture]() static let shanetworkingInstance = TextureManager() private init(){} func getTexture(withName name:String)->SKTexture?{ return textures[name] } func addTexture(withName name:String, texture :SKTexture){ if textures[name] == nil { textures[name] = texture } } func addTextures(texturesDictionary:[String:SKTexture]) { for (name, texture) in texturesDictionary { addTexture(withName: name, texture: texture) } } func removeTexture(withName name:String)->Bool { if textures[name] != nil { textures[name] = nil return true } return false } } 

Aquí está utilizando el dictionary y asocia cada textura con su nombre. Concepto bastante simple Si no hay una textura con el mismo nombre en un dictionary, añádala. Solo ten cuidado con la optimization prematura.

El uso:

  //I used didMoveToView in this example, but more appropriate would be to use something before this method is called, like viewDidLoad, or doing this inside off app delegate. override func didMoveToView(view: SKView) { let atlas = SKTextureAtlas(named: "game") let texture = atlas.textureNamed("someTexture1") let dictionary = [ "someTexture2": atlas.textureNamed("someTexture2"), "someTexture3": atlas.textureNamed("someTexture3"), "someTexture4": atlas.textureNamed("someTexture4"), ] TextureManager.shanetworkingInstance.addTexture(withName: "someTexture", texture: texture) TextureManager.shanetworkingInstance.addTextures(dictionary) } 

Como dije, tienes que poner la implementación de TextureManager en un file separado, para que sea un singleton real. De lo contrario, si lo define en GameScene por ejemplo, podrá llamar a ese init privado y, a continuación, TextureManager no será un singleton real.

Entonces, con este código puedes crear algunas texturas al principio del ciclo de vida de la aplicación, como se dice en los documentos:

Por ejemplo, si su juego usa las mismas texturas para todo su juego, puede crear una class de carga especial que se ejecuta una vez al inicio.

y rellena el dictionary con ellos. Más adelante, siempre que necesite una textura, no utilizará el método atlas.textureNamed() , sino que lo cargará desde una propiedad del dictionary de una class TextureManager . Además, cuando se hace la transición entre escenas, ese dictionary sobrevivirá a las desinencias de la escena y persistirá mientras la aplicación esté viva.