记忆中的SKTextureAtlas

时间:2018-10-06 18:23:24

标签: swift memory memory-management sprite-kit sktextureatlas

我做了一个快速项目,以了解SpriteKit如何从内存中释放地图集。每次轻按屏幕,就会创建一个地图集并将其加载到内存中。对地图集的唯一引用是您在下面的代码中看到的内容,并且我认为由于var位于非转义函数内部,因此它没有强大的引用。我的目标是最终释放以前加载到内存中的地图集,但是内存堆积并最终崩溃。

我了解地图集仅应加载一次,而苹果在此处(Working with Sprites)提出了三点关于为何纹理无法释放的问题

有人可以帮助我理解为什么会这样吗?

from itertools import chain


df = pd.DataFrame({'Product': df1['Product'].values.tolist()*len(df2),
                   'Price'  : df1['Price'].values.tolist()*len(df2),
                   'Colour' : list(chain.from_iterable([[v]*len(df1) for v in df2['Colour'].values.tolist()]))})

print(df)
  Product  Price Colour
0    Book      5   Blue
1   Table     10   Blue
2   Chair      7   Blue
3    Book      5    Red
4   Table     10    Red
5   Chair      7    Red
6    Book      5  Green
7   Table     10  Green
8   Chair      7  Green

enter image description here  每次检测到触摸都会创建一个新的内存台阶

2 个答案:

答案 0 :(得分:0)

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

要解决此问题,请在var声明之前添加static,这将防止在程序完成之前,该变量不会被新的指针覆盖

例如 如果您输入该功能

var nm = 5 
print(nm)  // will print 5 every time

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

nm每次都被覆盖 在声明之前放置static static var nm = 5 将解决此问题,并且每次函数运行时您都会看到

答案 1 :(得分:0)

去挖掘其他帖子(2nd answer)时,atlas.preload似乎存在内存泄漏错误,发现预加载整个SKTextureAtlas的工作就是调用类似的

 for texture in self.textureNames {
        SKTexture(imageNamed: texture).size()
    }