2

我想知道每个标记的代码行如何影响内存消耗。鉴于我的精灵表占用了 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 sprite sheet 在哪一行开始消耗内存?

ii) 第 5 行是否会导致任何额外的内存消耗?

iii) 在第 8 行(再次添加第 7 行)的情况下会发生什么,它如何影响内存?

iv) 第 9 行和第 10 行如何影响内存消耗?他们释放内存吗?

v) 如果批处理节点暂时不使用,第 11 行是否可取?以后再添加有什么影响。

4

1 回答 1

0

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

ii)您的第 5 行返回简单的自动释放对象。这是objective-c中的常见做法。对象将在滴答开始时由释放池自动释放。这意味着如果您不保留该对象,它将被销毁,例如,通过将其作为子节点添加到某个其他节点。

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

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

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

[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];
[[CCTextureCache sharedTextureCache] removeUnusedTextures];

此外,如果您使用一些动画,您可以将它们从 CCAnimationCache 中删除。无论如何,如果您对内存没有问题,我可以建议不要从内存中卸载纹理。加载纹理是最漫长的过程,因此在从未加载的纹理中绘制 spriteframe 之前会有延迟,因为它将再次加载。

于 2013-07-07T07:54:38.150 回答