了解精灵表内存消耗

时间:2013-07-07 04:31:09

标签: cocos2d-iphone sprite-sheet ccspritebatchnode

我想知道每个标记的代码行如何影响内存消耗。鉴于我的精灵表在内存中占据了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号线?稍后再添加它会有什么影响。

1 个答案:

答案 0 :(得分:0)

i)Spritesheet在加载到内存时会消耗内存。由于coco2d是一个开源框架,你可以查看代码,你会看到,在batchNodeWithFile:调用后,spritesheet被添加到内存中。 In将它添加到此方法内的缓存中。

ii)你的第5行返回简单的自动释放对象。这是objective-c中的常见做法。对象将由发布池自动释放。这意味着如果您不保留对象,则会销毁该对象,例如,通过将其作为子项添加到其他节点。

iii)您不能两次添加孩子。如果您尝试添加的节点的父节点不是nil,则会导致断言。正如我之前所说,你可以在CCNode类的代码中看到它。

iv)纹理加载到内存后,所有精灵都非常​​轻量级,因为任何精灵都只使用链接到纹理的某些部分来绘制它。所以你会释放一点记忆,但你仍会看到你的4MB +。

v)从父项中删除任何节点后,即使对象被销毁,它的纹理仍将加载到内存中。您可以通过调用

卸载此纹理
[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];
[[CCTextureCache sharedTextureCache] removeUnusedTextures];

此外,如果您使用某些动画,则可以从CCAnimationCache中删除它们。无论如何,如果你没有内存问题,我可以提供不从内存中卸载纹理。加载纹理是最长的过程,因此在从卸载的纹理中绘制spriteframe之前会有滞后,因为它会再次加载。