2009-10-27 1 views
0

커다란 캐릭터 애니메이션 (적어도 25 가지)이 포함 된 cocos2d를 사용하여 iPhone 게임을하고 있습니다. 각 스프레드 시트의 무게가 약 100KB 이 주문형 (on-demand)을 위해 AtlasSpriteManagers를 만들었습니다. 그러나이 장치를 테스트했을 때이 애니메이션 주변에 많은 성능 문제가있었습니다 .. 프레임이 누락되었습니다 .. 이미지가로드되는 동안 이미지가 걸리는 게임 ..백그라운드 스레드에서 AtlasSpriteManager를로드 할 수 없습니다.

그래서 프리 로딩을 생성하기로 결정했습니다. NSMutableDictionary에서 필요한 AtlasSpriteManagers를 만들고이를 NSMutableDictionary에서 유지하고 애니메이션에서 가져온 캐싱 기법입니다. usageCount 변수를 기반으로 나중에이 사전에서 제거하고 메모리를 확보합니다. .. 그리고 performSelectorInBackground 메서드를 사용하여 AtlasSpriteManager를 생성하고 사전에 저장하는 'loadASM'함수를 호출합니다.

[self performSelectorInBackground:@selector(loadASM:) withObject:fileName]; 

-(ASMHolder *)loadASM:(NSString *)fileName 
{ 
AtlasSpriteManager *sprMgr = [AtlasSpriteManager spriteManagerWithFile:fileName capacity:40]; 
ASMHolder *asmHolder = [[ASMHolder alloc] init]; 
asmHolder.sprMgr = sprMgr; asmHolder.retainCount++; 
[asmDict setObject:asmHolder forKey:fileName]; 

return asmHolder; 
} 

하지만 이미지 나 이미지가 표시되어 어디 performSelectorInBackground는 .. 화이트 컬러 상자가 나타납니다 사용하여 백그라운드에서이 메서드를 호출 할 경우 ..로드하는 것 그나마의 AtlasSpriteManager 객체가 생성되고 그것은이다 거기에 사전에 ..하지만 그것은 단지 빈 스프라이트로 돌아가고 .. 그리고 배경 호출 대신, 내가 직접 'loadASM'메서드를 호출하려고하면 (예 : [자체 loadASM : fileName]), 이미지가로드 중입니다 .. 물론 동기 호출이기 때문에 지연이 있습니다 ..

AtlasSpriteManager 대신 Texture2D 객체를 캐싱하려고했지만 결과는 같습니다.

(TextureManager ..의 addImageAsync도 시도해 봤지만 내 목적 캐시의 키를 만들 수없는 콜백 메소드의 인수에서로드하는 파일 이름을 제공하지 않으므로 내 목적에도 도움이되지 않습니다. 제발 도와주세요)

..

감사 Sankar

답변

0

당신은 여러 스레드에서 OpenGL을 사용하기 위해 특별한 일을 할 필요가있다. this question을 참조하십시오.

+0

도움을 주셔서 감사합니다. David. OpenGL에 익숙하지 않습니다. 그래서 cocos2d에서 어떻게 할 수 있을지 생각합니다. AtlasSpriteManager는 OpenGL을 내부적으로 사용합니다.하지만 AtlasSpriteManager에 영향을주는 OpenGL 코드를 작성할 수 있습니까? – Sankar

+0

당신은 아마 당신이 새로운 스레드가 일치하는 OpenGL 컨텍스트를 사용하도록 알려주기 위해 링크 된 기사에서 말한 마술을 할 필요가 있습니다. 나는 cocos2d와 EAGLShareGroup을 검색하고 이미이 일을하고있는 누군가를 찾을 수 있는지 알아볼 것을 제안한다. 또한 performSelectorInBackground를 사용하기보다는 자신의 쓰레드를 관리해야 할 것이다. –

+0

고마워 데이빗 .. 나는 이것에 대한 검색을했는데 addImageAsync 함수가 이미 내부적으로 이러한 일을한다는 것을 알았습니다. 그래서 어떻게 든 함수 자체를 사용하도록 코드를 변경했습니다. 어쨌든 .. 감사합니다 :) – Sankar