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一次。

查看 Apple 的文档Working with Sprites

-

  1. 将纹理预加载到内存中
  2. 从内存中删除纹理

那么如果内存没有被释放,这可能是因为仍然存在SKTexture第二点所指向的引用:

纹理加载到图形硬件的内存后,它会一直保留在内存中,直到引用SKTexture对象被删除。这意味着在关卡之间(或在动态游戏中),您可能需要确保删除纹理对象。通过删除对它的任何强引用来删除SKTexture对象对象,包括:

  • 游戏中的所有纹理引用SKSpriteNodeSKEffectNode对象
  • 在您自己的代码中对纹理的任何强引用
  • SKTextureAtlas用于创建纹理对象的对象
于 2015-08-05T07:23:15.497 回答