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와 함께 응용 프로그램을 프로파일 링했으며 동일한 결과를 보여 주었다고 말하고 싶습니다.
기본 자료에 관심이 있습니까? 아니면 단지 메모리를 비우고 싶습니까? 두 번째 것 - CCTextureCache에 대해 + (void) purgeSharedTextureCache \t을 호출하려고합니까? –
@ СергейМалетин 답변을 드리겠습니다. 실제로 받아 들일 수있었습니다. 너는 내 보호 인이야! 감사! 당신이 근사한 것들을 설명한다면 어쨌든 –
어떻게 메모리 사용량을 점검하고 있습니까? –