У меня есть игра cocos2d, она работает со скоростью 55–60 кадров в секунду после загрузки и запуска игры.
Однако из-за использования листов спрайтов как для моего меню, так и для игры (по одному для каждого), при загрузке игры возникла точка пересечения, которая вызвала бы предупреждения памяти, из-за слишком большого количества больших 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
Я использую этот код для загрузки своей игры.
Внутри кнопки -
NSThread* thread = [[[NSThread alloc] initWithTarget:self selector:@selector(goToNextScene) object:nil] autorelease];
[thread start];
Метод, выполненный в новом потоке -
-(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];
}
Есть идеи о том, как я могу предотвратить то, что происходит?
NSLock вызывается, когда gameScene пытается загрузить список gamesheet.plist (имена отдельных изображений в пределах спрайт-листа и координат)