了解精灵表内存消耗



我想知道每一行标记的代码是如何影响内存消耗的。假设我的精灵表占用内存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中删除。不管怎样,如果你对内存没有问题,我可以不从内存中卸载纹理。加载纹理是最长的过程,所以在从卸载的纹理绘制精灵帧之前会有延迟,因为它将再次加载。

最新更新