2011-03-01 6 views
3

) 나는 게임을로드하고 실행하면 55 ~ 60fps로 실행됩니다.게임에서 화면로드 (

그러나 내 메뉴와 게임 (각각 하나씩)에 스프라이트 시트를 사용했기 때문에 메모리에로드 된 너무 많은 큰 png로 인해 메모리 경고가 발생할 수있는 게임로드시 크로스 오버 포인트가있었습니다.

로딩을 위해 간단한 CCScene을 구현했습니다 (경량이며 메인 게임을로드하기 전에 메뉴가 비활성화되도록 함).

이것은 훌륭하게 작동합니다. 그러나, 나는로드 블록 옆에, 나는 로딩 화면 옆에 단어로드 (회전하고있는 일이 벌어지고 있음) 옆에 회전하는 주인공이있다.

나는 다른 스레드에서 게임을로드하기 위해 NSThread를 사용할 수 있음을 발견했기 때문에로드하는 장면의 애니메이션을 방해받지 않고 계속 사용할 수 있습니다 (매우 즐거운 사용자 경험을 위해 제작되었습니다).

그러나 5-6/10 번,이 오류 메시지가 나타납니다.

Received memory warning. Level=1 
*** -[NSLock dealloc]: lock (<NSLock: 0x3ded70> '(null)') deallocated while still in use 
    *** Break on _NSLockError() to debug. 
    *** -[CFDictionary setObject:forKey:]: message sent to deallocated instance 0x3decc0 

내 게임을로드하는 데이 코드를 사용하고 있습니다. 버튼 내

-

-(void) goToNextScene { 

NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; 

EAGLContext *k_context = [[[EAGLContext alloc] 
          initWithAPI :kEAGLRenderingAPIOpenGLES1 
          sharegroup:[[[[CCDirector sharedDirector] openGLView] context] sharegroup]] autorelease]; 
[EAGLContext setCurrentContext:k_context]; 

CCScene *gs = [GameEngine scene]; 

[[CCDirector sharedDirector] replaceScene:[CCTransitionFade transitionWithDuration:0.5 scene:gs]]; 

[autoreleasepool release]; 

} 

내가 일어나기에서 일어나고있는 것을 방지 할 수 방법에 대한 아이디어를 - 새로운 스레드에서 실행

NSThread* thread = [[[NSThread alloc] initWithTarget:self selector:@selector(goToNextScene) object:nil] autorelease]; 
[thread start]; 

방법?

NSLock은 그가 dealloced되고있어 CCSpriteFrameCache 아니에요 있지만, gameScene 당신은 정확하게 자신을 진단받은 gamesheet.plist (TEH spritesheet 내에서 개별 이미지의 framenames 및 좌표)

+0

나는 이것에 대해 좀 더 조사를 해봤는데, 게임이 로딩 전환 동안 메모리 경고 1을 받으면 충돌이 5-6/10 번 발생합니다. 이 때문에 CCSpriteFrameCache가 dealloc을 얻거나 다른 스레드로 이동하게되는지 궁금합니다. – Bongeh

답변

2

를로드 할 때 발생하지만됩니다 CCTextureCache는 의존합니다.

기본 cocos2d 템플릿에서 프로젝트를 만든 경우 응용 프로그램 대리인은 [[CCDirector sharedDirector] purgeCachedData]를 호출하여 applicationDidReceiveMemoryWarning에 응답합니다. 이렇게하면 [CCTextureCache purgeSharedTextureCache]가 호출되어 공유 캐시를 해제하고 제거합니다. 그것은 주 앱 스레드에서 발생하며 백그라운드 스레드가 같은 캐시를 사용하여로드하는 텍스처를 저장하는 중간에 있기 때문에 ... 붐.

가장 간단한 해결 방법은 응용 프로그램 대리인으로부터 purgeCachedData 호출을 제거하는 것입니다. OS가하는 것보다 애플리케이션의 메모리 소비를 잘 이해하고 있기 때문에 OS가 캐시를 삭제할시기를 알려주지 않고 직접 해보십시오. 더 이상 사용하지 않을 캐시 된 텍스처가있는 경우에만 purgeCachedData를 호출하십시오.

간단한 설명에서 전환 /로드 장면의 시작 부분에서 그렇게하는 것처럼 들립니다. 후에 이후에 퍼지를 수행하면 진척 애니메이션에 사용하는 스프라이트를 만들어 텍스처가 유지되도록 할 수 있습니다. (제거 호출은 현재 사용중인 것도 삭제하지 않습니다.) 마찬가지로, 을 제거한 후에 백그라운드 스레드를 시작하십시오. 그렇지 않으면 현재보고있는 것과 동일한 충돌이 발생합니다.

+0

유익한 답변을 보내 주셔서 감사합니다. CCDirector의 더 깊은 부분을 아직 다루지 않았으며, 최근에 Pre CC 접두어가 붙은 cocos2d 객체를 최신 버전으로 전환하면 조금만 날아 버렸습니다. 이 문제를 해결하면이 조언을 적용하고 스레드를 업데이트 할 것입니다. 다시 한번 감사드립니다. – Bongeh

+0

동시성 문제를 방지하기 위해 잠금 (NSLock)을 사용할 수 없습니까? –