预加载精灵套件纹理
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 中幸存下来,并且在应用程序处于活动状态时将持续存在。
所以我正在阅读有关最佳 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 中幸存下来,并且在应用程序处于活动状态时将持续存在。