我想知道每一行标记的代码是如何影响内存消耗的。假设我的精灵表占用内存4MB。
CCSpriteBatchNode *spritesBgNode; // Line 1
spritesBgNode = [CCSpriteBatchNode batchNodeWithFile:@"sprites.pvr.ccz"]; // Line 2
[self addChild:spritesBgNode]; // Line 3
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"sprites.plist"]; // Line 4
sprite1 = [CCSprite spriteWithSpriteFrameName:@"sprite1"]; // Line 5
[spritesBgNode addChild:sprite1]; // Line 6
[spritesBgNode addChild:sprite1]; // Line 7
[spritesBgNode addChild:sprite1]; // Line 8
[spritesBgNode removeChild:sprite1]; // Line 9
[spritesBgNode removeSpriteFramesFromFile:@"sprites.plist"]; // line 10
[self removeChild: spritesBgNode]; // Line 11
i) 4MB精灵表在哪一行开始消耗内存?
ii)第5行是否会导致任何额外的内存消耗?
iii)第8行(再次添加第7行)会发生什么,它如何影响记忆?
iv)第9行和第10行如何影响内存消耗?它们释放内存吗?
v) 如果批处理节点将在一段时间内不使用,第11行是否可取?稍后再次添加它有什么含义。
i)Spritesheet加载到内存时会消耗内存。由于coco2d是一个开源框架,您可以检查代码,您会看到,在batchNodeWithFile:
调用后,该spritesheet被添加到内存中。In会将其添加到此方法内的缓存中。
ii)您的第5行返回简单的自动释放对象。这是客观性的常见做法。对象将在勾选结束时由释放池自动释放。这意味着,如果不保留对象,例如,通过将其作为子节点添加到其他节点,对象将被销毁。
iii)不能两次添加子项。如果您尝试添加的节点的父级不是nil
,则会导致assert。正如我之前所说,您可以在CCNode类的代码中看到它。
iv)纹理加载到内存后,所有精灵都非常轻,因为任何精灵都只需使用纹理某个部分的链接来绘制它。所以你会释放一些内存,但你仍然会看到你的4MB+。
v) 从父节点中移除任何节点后,即使对象已损坏,其纹理仍将加载到内存中。你可以通过调用来卸载这个纹理
[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];
[[CCTextureCache sharedTextureCache] removeUnusedTextures];
此外,如果您使用某些动画,可以将它们从CCAnimationCache中删除。不管怎样,如果你对内存没有问题,我可以不从内存中卸载纹理。加载纹理是最长的过程,所以在从卸载的纹理绘制精灵帧之前会有延迟,因为它将再次加载。