4

テクスチャ アトラスを解放するのに問題があります。現在、プレイヤーがキャラクターを変更できる 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 がこのようなことを自分で処理することになっていることを理解しています。そのため、混乱しています。テクスチャ アトラスを自分で手動で解放する方法は絶対にありませんか?

ありがとう!

4

1 に答える 1

3

@dragoneye の最初のポイントは正しいです。プリロードSKTextureAtlasは 1 回だけです。

Apple のドキュメントWorking with Sprites をご覧ください。

-

  1. メモリへのテクスチャのプリロード
  2. メモリからテクスチャを削除する

SKTexture次に、メモリが解放されない場合、2 番目のポイントが指す参照がまだ存在する可能性があります。

テクスチャがグラフィックス ハードウェアのメモリに読み込まれると、参照SKTextureオブジェクトが削除されるまでメモリに残ります。これは、レベル間 (または動的なゲーム) で、テクスチャ オブジェクトが削除されていることを確認する必要がある場合があることを意味します。SKTextureオブジェクト オブジェクトへの強い参照を削除して、オブジェクト オブジェクトを削除します。

  • ゲーム内のSKSpriteNodeおよびオブジェクトからのすべてのテクスチャ参照SKEffectNode
  • 独自のコード内のテクスチャへの強力な参照
  • SKTextureAtlasテクスチャ オブジェクトの作成に使用されたオブジェクト
于 2015-08-05T07:23:15.497 に答える