我做了一个快速项目,以了解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
答案 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()
}