首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >留在内存中的SKTextureAtlas

留在内存中的SKTextureAtlas
EN

Stack Overflow用户
提问于 2018-10-06 18:23:23
回答 2查看 102关注 0票数 0

我做了一个快速项目来了解SpriteKit是如何从内存中解放地图集的。每次点击屏幕时,都会创建一个地图集,并将其加载到内存中。对地图集的唯一引用是在下面的代码中看到的,我认为由于var位于非转义函数中,所以它不包含强引用。我的目标是最终释放加载到内存中的以前的地图集,但是内存堆积起来,最终崩溃。

我知道地图集只能加载一次,苹果在这里提出的三点(与雪碧合作)是关于为什么纹理不会被释放的。

有人能帮我弄明白为什么会这样吗?

代码语言:javascript
复制
class GameScene: SKScene {

     override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

        var atlas:SKTextureAtlas? = SKTextureAtlas(named: "Title")

        atlas?.preload {

            atlas = nil

            print("Loaded")

        }

    }

}

每次检测到触摸时,都会创建一个新的内存级。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-07 16:07:31

挖掘其他帖子(第二答案),发现atlas.preload似乎存在内存泄漏漏洞,并发现预加载整个SKTextureAtlas的工作是调用类似的

代码语言:javascript
复制
 for texture in self.textureNames {
        SKTexture(imageNamed: texture).size()
    }
票数 0
EN

Stack Overflow用户

发布于 2018-10-06 18:35:37

每次触摸屏幕时,您都在分配和初始化一个新的纹理,这意味着在函数第二次运行时将不会有引用,因为它将被一个新的纹理指针替换。

要解决这个问题,请在var声明之前添加静态变量,这将防止变量被新指针覆盖,直到程序完成。

例如,如果你把这个函数

代码语言:javascript
复制
var nm = 5 
print(nm)  // will print 5 every time

nm += 1
print(nm)  // will print 6 every time 

nm每次在声明前放置静态时都会被覆盖,static var nm = 5会解决这个问题,每次函数运行时都会看到数量增加

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52682096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档