テクスチャ アトラスを解放するのに問題があります。現在、プレイヤーがキャラクターを変更できる SpriteKit ゲームがあります。現在、グローバル共有インスタンスにアトラスがあります。
let char0Atlas: SKTextureAtlas = SKTextureAtlas(named: "Atlas/iPhone/char0")
let char1Atlas: SKTextureAtlas = SKTextureAtlas(named: "Atlas/iPhone/char1")
let char2Atlas: SKTextureAtlas = SKTextureAtlas(named: "Atlas/iPhone/char2")
変更できる各キャラクターには、独自のテクスチャ アトラスがあります。次のようなメソッドを使用して、そのキャラクター アトラスからプレイヤーの動き、アイドル、およびジャンプのアニメーションをフェッチします。
func charAnimation(char: CharEnum) -> [SKTexture] {
var temp: [SKTexture] = []
var name: String = ""
let atlas: SKTextureAtlas = char.atlasForChar()
for i in 1...20 {
if i > 9 { name = "char_\(charId)_idle_00\(i)" }
else { name = "char_\(charId)_idle_000\(i)" }
temp.append(atlas.textureNamed(name))
}
return temp
}
そして、それはプレーヤー スプライト ノード クラスの配列インスタンス変数に格納されます。キャラクターが変更されるたびに、これらのフレームは新しいフレームに置き換えられるので、古いフレームは正しく解放されるべきですか?
class PlayerNode: SpriteNode {
private var currentAnimation: [SKTexture] = []
private var animations: (idle: [SKTexture], run: [SKTexture], jump: [SKTexture]) = PlayerController.animationsForHero(.CharOne)
}
また、プレイヤーがキャラクターを切り替えるときは、これを使用してテクスチャ アトラスをプリロードします。
SKTextureAtlas.preloadTextureAtlases([char.atlasForHero()], withCompletionHandler: { () -> Void in
updateChar()
})
SpriteKit が以前のキャラクター アニメーションからメモリを解放しないのはなぜですか? プレーヤーが新しいキャラクターに切り替えると、メモリが絶えず増加し、アプリがクラッシュします。そのセッションですでに選択されているキャラクターを再度選択した場合、メモリは増加しません。これは、メモリ リークを示しています。キャラクターのアニメーションは解放されていません。なんで?
SpriteKit がこのようなことを自分で処理することになっていることを理解しています。そのため、混乱しています。テクスチャ アトラスを自分で手動で解放する方法は絶対にありませんか?
ありがとう!