2013-07-07 3 views
2

Я хотел бы знать, как каждая из отмеченных строк кода влияет на потребление памяти. Учитывая, что мой спрайт-лист занимает 4 МБ в памяти.понимание расхода памяти спрайта

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) На каких линиях используется лист спрайтов 4 МБ, который начинает потреблять память?

ii) Ли линия 5 приведет к дополнительному потреблению памяти?

iii) Что произойдет в случае Line 8 (добавлена ​​строка 7), как это влияет на память?

iv) Как линия 9 и линия 10 влияют на потребление памяти? Они освобождают память?

v) Если пакетный узел не будет использоваться некоторое время, то подходит ли линия 11? Каковы последствия его добавления позже.

+0

Если вы хотите знать, что до точных линий и байтов вы должны использовать Инструменты. Текстура использует 99% памяти, другие строки добавляют максимум пару сотен байт. – LearnCocos2D

ответ

0

i) Spritesheet потребляет память, когда он загружается в память. Поскольку coco2d является открытым исходным кодом, вы можете проверить код, и вы увидите, что spritesheet добавляется в память после вызова batchNodeWithFile:. В это добавит его в кеш внутри этого метода.

ii) ваша линия 5 возвращает простой автореализованный объект. Это обычная практика в объективе-с. Объект будет автоматически выпущен пулом релизов по типу галочки. Это означает, что объект будет уничтожен, если вы его не сохраните, например, добавив в качестве дочернего элемента какой-либо другой узел.

iii) Вы не можете добавить ребенка дважды. Это приведет к утверждению, если родительский узел узла, который вы пытаетесь добавить, не является nil. Как я уже говорил, вы можете увидеть его в коде класса CCNode.

iv) После того, как текстуры загружены в память, все спрайты очень легкие, так как любой спрайт просто использует ссылку на какую-то часть текстуры, чтобы нарисовать ее. Таким образом, вы немного освободите память, но вы все равно увидите свой 4MB +.

v) После удаления любого узла из родителя его текстура будет по-прежнему загружаться в память, даже если объект будет уничтожен. Вы можете выгрузить эту текстуру звонков

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

Кроме того, если вы используете некоторые анимации, вы можете удалить их из CCAnimationCache. В любом случае, если у вас нет проблем с памятью, я могу предложить не выгружать текстуры из памяти. Загрузка текстур - это самый длинный процесс, поэтому у вас будет отставание до рисования spriteframe от разгруженной текстуры, потому что он будет загружен снова.

+0

downvote, серьезно? для чего? – Morion

+0

Может случиться так, что если начать ответ с комментария, высмеивая способности программиста, он не получил хорошего ответа? –

Смежные вопросы