2

이 아닌 GameScene 클래스가 있습니다. 싱글 톤 인스턴스입니다. 따라서 사용자가 새 레벨을 선택하고 "정적"/ "공유"데이터를 다른 싱글 톤 클래스 (예 : GameManager)에 보관할 때마다 할당하고 할당을 해제합니다.Cocos2d, iOS : 캐시에서 스프라이트를 제거하는 올바른 방법은 무엇입니까?

ARC입니다. 내 접근 방식이 메모리 관리 관점에서 올바른지 이해하고 싶습니다. 즉, 정리에서 "removeUnusedSpriteFrames"를 호출하는 것으로 충분합니까? 이것이 게임 아트에서 모든 스프라이트를 제거 할 것인가? CCSpriteBatchNode와 함께 뭔가를해야합니까?

-(void) loadGameArtFileForLevelOne //I do this in a switch but this is to simplify the reading 
{ 
    CCSpriteFrameCache* frameCache = [CCSpriteFrameCache sharedSpriteFrameCache]; 
    [frameCache addSpriteFramesWithFile:@"game-art-forLevelOne-hd.plist"]; 
    CCSpriteBatchNode * sharedSpriteBatchNode = [CCSpriteBatchNode batchNodeWithFile:@"game-art-forLevelOne-hd.png"];  
} 

//As dealloc is deprecated for ARC code, I prefer to remove unused sprites and texture on cleanup 
-(void) cleanup 
{ 
    [[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];  
} 

CCSpriteBatch 노드의 dealloc 메소드에서 CCLOG 호출을 추가했습니다. GameScene을로드 한 다음 메뉴로 돌아 가면 예상대로 "사용하지 않은 텍스처 제거"로그가 표시되지만 CCSpriteFrameCache의 dealloc 메소드 로그가 표시되지 않습니다. * !! 경고 : 아래 편집을 참조하십시오 - 내 실수! *

편집 : 죄송합니다, 나는이 난에 "무료"원하는대로 나를 약간 우려와 스프라이트와 관련된 모든 메모리를 제거 CCSpriteBatch

의 할당 해제의 방법의 모든 로그를 볼 수 없습니다 의미 수준.

이 내용을 이해하면이 비트를 "최적화"합니다 (예 : 레벨 1의 스프라이트 시트 - 예 : 세계 1 - 각 배경에 스프라이트 시트 1 개).

의견이 있으십니까?

+0

dealloc 메소드는 더 이상 사용되지 않지만 계속 사용할 수 있습니다. dealloc에서 [super dealloc]을 호출하는 것은 더 이상 허용되지 않습니다. – LearnCocos2D

답변

2

편집 :

내가, 당신이 어딘가에 CCSpriteBatchNode 노드를 추가하는 가정 비록 당신이 그것을 (당신은 또한 스위치에서 발생 언급, 그래서 완전히 다른 설정에서 생각) 표시되지 않습니다 게시 된 코드입니다. 그렇다면 추가 한 위치에서 제거 할 때까지 할당이 해제되지 않습니다.

여기에 설명이 정리되어있을 수 있습니다.

CCSpriteFrameCache은 캐시입니다. 재사용을 위해 모든 스프라이트를 쉽게 사용할 수있는 저장소입니다.

CCSpriteBatchNode은 원칙적으로 캐시와 전혀 관련이없는 Open GL 레이어의 성능을 향상시키기위한 메커니즘입니다.

배치 노드를 통해 사용 된 일부 스프라이트가 여전히 일부 레이어/노드/장면에 있으면 "사용되지 않는"것으로 간주되지 않으며 클린업 코드로 제거되지 않는다는 것을 알고 있습니다. 사실, 그것은 사용 중입니다. 캐시 된 스프라이트는이를 참조하는 모든 노드에서 제거 될 때 "사용되지 않음"이됩니다. 귀하의 질문에 관해서는

:

즉, 정리에 "removeUnusedSpriteFrames"을 호출한다?

음, 내 생각에 응용 프로그램에 따라 좋은 정리라고 생각할 수 있습니다. 캐시에서 사용하지 않는 스프라이트를 제거하는 것은 괜찮습니다. 하지만로드 된 오디오 리소스를 언로드하는 것, 사용되지 않는 장면의 부분을 제거합니다 (필요한 경우 다시로드 할 수 있음). 기타

희망이 도움이됩니다.

CCSpriteFrameCache의 dealloc 메소드 로그가 표시되지 않습니다.

CCSpriteFrameCache는 싱글, 그래서 프로그램의 수명을 위해 존재하여야한다 (이 다를 수 있습니다,하지만이 경우 베팅) : 그래서

CCSpriteFrameCache* frameCache = [CCSpriteFrameCache sharedSpriteFrameCache]; 

, 나는되지 않을 것 캐시가 삭제되지 않는다는 사실에 염려했다. 중요한 것은 내용이 비어 있다는 것입니다.

+0

죄송합니다. CCSpriteBatch를 의미했습니다. CCSpriteFrameCache (예 : cocos2d : CCSpriteFrameCache : 사용하지 않는 프레임 : file0.png 제거)의 로그 호출을 볼 수 있지만 CCSpriteBatch의 dealloc 메소드 (CCLOG를 추가 함)가 아닙니다. 죄송합니다 .. 나는 노력을 포기하고 실수로 사과드립니다. – mm24

4

당신은이를 사용할 수 있습니다 ..

[[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFrames]; 

당신이 사용 따릅니다 더 필요합니다.

[[CCDirector sharedDirector] purgeCachedData]; 
[[CCTextureCache sharedTextureCache] removeAllTextures]; 
[CCTextureCache purgeSharedTextureCache]; 
[[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFrames]; 
[CCSpriteFrameCache purgeSharedSpriteFrameCache]; 
+0

그 방법이 무엇을 설명해 주시겠습니까? 나는 Doxygen 박사를 보았다. adn은 나에게 명확하지 않았다. – Narek

관련 문제