2013-07-07 2 views
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 스프라이트 시트가 메모리를 소비하기 시작하는 라인은 무엇입니까?

ii) 라인 5로 인해 추가 메모리가 소모됩니까?

iii) 8 행 (다시 7 행 추가)의 경우 어떻게됩니까? 메모리에 어떤 영향을 줍니까?

iv) 라인 9와 라인 10은 메모리 소비에 어떤 영향을 줍니까? 그들은 기억을 해방합니까?

v) 배치 노드를 잠시 사용하지 않을 경우 11 행을 사용하는 것이 좋습니다. 나중에 다시 추가 할 때의 의미는 무엇입니까?

+0

정확한 선과 바이트를 알고 싶다면 Instruments를 사용해야합니다. 텍스처는 메모리의 99 %를 사용하고 다른 라인은 최대 몇백 바이트를 추가합니다. – LearnCocos2D

답변

0

i) 스프라이트 시트는 메모리에로드 될 때 메모리를 소비합니다. coco2d는 오픈 소스 프레임 워크이기 때문에 코드를 확인하면 batchNodeWithFile: 호출 후 spritesheet가 메모리에 추가됩니다. In은이 메소드 내부의 캐시에이를 추가합니다.

ii) 라인 5는 간단한 자동 렌더링 된 객체를 반환합니다. 객관적으로는 일반적인 관행입니다. c. 개체는 틱의 엔트리에서 릴리스 풀에 의해 자동으로 해제됩니다. 예를 들어 다른 노드에 자식으로 추가하여 객체를 유지하지 않으면 객체가 삭제된다는 의미입니다.

iii) 자녀를 두 번 추가 할 수 없습니다. 추가하려고하는 노드의 부모가 nil이 아닌 경우 어설 션이 발생합니다. 앞에서 말한 것처럼 CCNode 클래스의 코드에서 볼 수 있습니다.

iv) 텍스처가 메모리에로드 된 후에 모든 스프라이트는 텍스처의 일부분에 링크를 사용하여 그리기 때문에 매우 가볍습니다. 따라서 메모리를 약간 확보 할 수 있지만 4MB 이상은 계속 볼 수 있습니다.

v) 부모로부터 노드를 제거한 후에도 객체가 파괴 되더라도 텍스쳐는 여전히 메모리에로드됩니다. 당신은 전화

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

일부 애니메이션을 사용하는 경우, 당신은 CCAnimationCache에서 제거 할 수 있습니다하여 질감을 언로드 할 수 있습니다. 어쨌든, 메모리에 문제가 없다면 메모리에서 텍스처를 언로드하지 않을 것을 제안 할 수 있습니다. 텍스처로드는 가장 긴 프로세스이므로 언로드 된 텍스처에서 spriteframe을 그리기 전에 지연되므로 다시로드됩니다.

+0

downvote, 진지하게? 무엇 때문에? – Morion

+0

질문자의 프로그래밍 능력을 조롱 한 댓글로 답변을 시작하는 것이 좋지 않을 수 있습니다. –