2013-11-15 2 views
1

addImageAsync:(NSString*)path withBlock:(void(^)(CCTexture2D *tex))block 또는 -(void) addImageAsync: (NSString*)path target:(id)target selector:(SEL)selector 중 하나를 사용하여 비동기 적으로로드 할 때 CCTexture2D 개체가 유지되는 이상한 것을 발견했습니다.Cocos2d. 왜 텍스처를 비동기 적으로로드해도 그것을 유지합니까?

이것을 확인하기 위해 저는 매우 간단한 프로젝트를 만들었습니다. 실제로 이것은 cocos2d 템플릿입니다. 두 개의 버튼, png 파일 mytexture.png과 메가 바이트 단위로 메모리를 인쇄하는 기능이 있습니다. 아무 일도하지 않고 단지 cocos2d 층이 메모리가 주위에 8메가바이트 (아이 패드)에 표시되어있는 동안

void report_memory(void) { 
struct task_basic_info info; 
mach_msg_type_number_t size = sizeof(info); 
kern_return_t kerr = task_info(mach_task_self(), 
           TASK_BASIC_INFO, 
           (task_info_t)&info, 
           &size); 
if(kerr == KERN_SUCCESS) { 
    NSLog(@"Memory : %f", info.resident_size/1024.0f/1024.0f); 
} else { 
    NSLog(@"Error with task_info(): %s", mach_error_string(kerr)); 
} 
} 

:이 기능입니다. 첫 번째 버튼을 클릭합시다 :

[[CCTextureCache sharedTextureCache] addImageAsync:@"mytexture.png" withBlock:^(CCTexture2D *text){ 

      NSLog(@"Cache %@", [CCTextureCache sharedTextureCache]); 

     }]; 

이제 메모리는 약 24MB입니다. 승인. 두 번째 버튼을 클릭하십시오 :

[[CCTextureCache sharedTextureCache] removeTextureForKey:@"mytexture.png"]; 
NSLog(@"Cache %@", [CCTextureCache sharedTextureCache]); 

그리고 메모리는 여전히 24MB입니다! 왜??? 텍스처에 대한 참조를 가진 유일한 객체는 캐시 였지만 제거되었습니다. 왜 아직도 기억에 남는가? 그것을 참조하는 것이 무엇입니까? addImage: 메서드를 사용하여 텍스처를 추가하면 예상대로 제거됩니다. 어떻게 해결할 수 있을까요? 메모리에서 언로드하는 방법?

메모리 검사 기능이 잘못된 데이터를 제공 할 수 있다고 생각한다면 나는 Instruments와 함께 응용 프로그램을 프로파일 링했으며 동일한 결과를 보여 주었다고 말하고 싶습니다.

+0

기본 자료에 관심이 있습니까? 아니면 단지 메모리를 비우고 싶습니까? 두 번째 것 - CCTextureCache에 대해 + (void) purgeSharedTextureCache \t을 호출하려고합니까? –

+0

@ СергейМалетин 답변을 드리겠습니다. 실제로 받아 들일 수있었습니다. 너는 내 보호 인이야! 감사! 당신이 근사한 것들을 설명한다면 어쨌든 –

+0

어떻게 메모리 사용량을 점검하고 있습니까? –

답변

1

인스트루먼트의 메모리 사용을 측정하는 것이 좋습니다. 실제 문제에 관해서는

:

    어떤 스프라이트 나 스프라이트 프레임이 또한 메모리 전에 약간의 시간이 걸릴 수 있습니다
  • 가 해제 질감을 유지합니다
  • 즉 autoreleasepool 메모리 사용량을 측정하는 의미 제거 할 때 퍼지 직후에 잘못된 인상을주었습니다 (그러므로 악기를 사용하십시오)