一尘不染

SKTextureAtlas不再在iOS 10中共享纹理

swift

看来,当从纹理图集中提取纹理时,我现在正在生成新的纹理,而不是在iOS 10上跨不同的精灵使用相同的纹理。在iOS
9上,此工作按预期进行。还有其他人遇到这个问题吗?也许我错过了一步,现在它已成为iOS 10的一部分。

注意:我创建了一个示例项目并创建了一个新的图集,然后只是将飞船拖入@ 1x中,我还尝试了预加载,但这也没有做任何事情。

码:

  let atlas = SKTexturAtlas(named:"Sprites")
  var texture = atlas.textureNamed("Spaceship")
  print("\(Unmanaged.passUnretained(texture)),\(Unmanaged.passUnretained(texture).toOpaque())")

  texture = atlas.textureNamed("Spaceship")
  print("\(Unmanaged.passUnretained(texture)),\(Unmanaged.passUnretained(texture).toOpaque())")

编辑:为了解决比较问题,我使用description属性比较两个纹理是否相等。但是要使此工作正常进行,您不能使用2个包含有确切名称和大小的纹理的地图集。我永远不会遇到这种情况,但是对于任何寻求帮助的人,请记住这一点。


阅读 280

收藏
2020-07-07

共1个答案

一尘不染

为了解决这个问题,我不得不想出一种方法来缓存纹理,以使其不会重复:

private var textureCache = [String: SKTexture]()
extension SKTextureAtlas
{
    func texturesWithNames(_ names:[String]) -> [SKTexture]
    {
        var textures = [SKTexture]()
        names.forEach({textures.append(textureNamed($0))})
        return textures
    }
    func cachedTextureWithName(_ name:String) -> SKTexture
    {
        if  textureCache[name] == nil
        {

            textureCache[name] = textureNamed(name)
        }

        return textureCache[name]!
    }
    func cachedTexturesWithNames(_ names:[String]) -> [SKTexture]
    {
        var textures = [SKTexture]()
        names.forEach({textures.append(cachedTextureWithName($0))})
        return textures
    }
    func clearCache()
    {
        textureCache = [String: SKTexture]()
    }
}


extension SKTexture
{

    var name : String
    {
        return self.description.slice(start: "'",to: "'")!
    }


}
2020-07-07