预加载精灵套件纹理

Preloading sprite kit textures

所以我正在阅读有关最佳 sprite 工具包实践的 apple 文档。我遇到了这个:

例如,如果您的游戏在所有游戏玩法中使用相同的纹理,您可以创建一个在启动时运行一次的特殊加载 class。您执行一次加载纹理的工作,然后将它们留在内存中。如果场景对象被删除并重新创建以重新开始游戏,则不需要重新加载纹理。

这将显着提高我的应用程序的性能。有人可以指出我将如何实现这一目标的正确方向吗?

我想我会调用一个函数来在我的视图控制器中加载纹理?然后访问那个纹理图集?

问题是,你真的要这样缓存资源吗?不能说我曾经发现需要那种性质的东西。无论如何,如果这样做以某种方式有助于您的应用程序的性能,那么您可以创建一个 TextureManager class ,这将是一个单例(为 TextureManager class 创建单独的文件),例如这个:

class TextureManager{

    private var textures = [String:SKTexture]()

    static let sharedInstance = 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
    }
}

这里您使用字典并将每个纹理与其名称相关联。很简单的概念。如果字典中没有同名的纹理,则添加它。请注意过早优化。

用法:

 //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.sharedInstance.addTexture(withName: "someTexture", texture: texture)
        TextureManager.sharedInstance.addTextures(dictionary)

    }

正如我所说,您必须将 TextureManager 实现放在一个单独的文件中,以使其成为真正的单例。否则,如果你在GameScene中定义它,你将能够调用那个private init,那么TextureManager将不是一个真正的单例。

因此,使用此代码,您可以在应用程序生命周期的最开始创建一些纹理,如文档中所述:

For example, if your game uses the same textures for all its gameplay, you might create a special loading class that runs once at startup.

并用它们填满字典。以后,每当你需要一个纹理时,你不会使用 atlas.textureNamed() 方法,而是从 TextureManager class 的字典 属性 中加载它。此外,当在场景之间转换时,该字典将在场景的 deinits 中幸存下来,并且在应用程序处于活动状态时将持续存在。