Cocos2D постоянно прокручивает игру на основе тайлов: странная вспышка только в устройстве

Спасибо за вашу помощь и чтение этого.

Вот мой источник: Download_Cocos2d_Continuous_Scrolling_Tile_Based_Game

Это постоянно прокручиваемая игра на основе плитки Cocos2D. В этой игре тайлы карт загружаются и выпускаются по мере необходимости - третья карта тайлов загружается при выходе первой. Тот же процесс повторяется. Наблюдается некоторый рывок в листе прокрутки из-за времени загрузки. Поэтому я использовал отдельный поток для загрузки карты тайлов. Это вызвало странную вспышку на экране... только на устройстве.

  1. Как я могу исправить эту вспышку?
  2. Как я могу избежать небольшого рывка в свитке плитки? или какой-то альтернативный способ загрузки?

Вот код загрузки:

[NSThread detachNewThreadSelector:@selector(loadTileMapInThread:) toTarget:self withObject:nil];


-(void)loadTileMapInThread:(id)argument
{
    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
    CCGLView *view = (CCGLView*)[[CCDirector sharedDirector] view];
    EAGLContext *auxGLcontext = [[EAGLContext alloc]
                                 initWithAPI:kEAGLRenderingAPIOpenGLES2
                                 sharegroup:[[view context] sharegroup]];

    if( [EAGLContext setCurrentContext:auxGLcontext] ) {

        [self LoadTilesMap];

        glFlush(); //whn I comment this also..flash observed

        [EAGLContext setCurrentContext:nil];
    } else {
        CCLOG(@"cocos2d: ERROR: TetureCache: Could not set EAGLContext");
    }

    [auxGLcontext release];

    [autoreleasepool release];
}

1 ответ

Решение

Асинхронно загружая карту тайла, вы просто заменяете прерывание времени загрузки на короткое время, когда cocos2d не нужно ничего визуализировать - пока не будет загружена новая карта тайла. Я предполагаю, что многопоточность здесь не является исправлением, она просто дает вам другой симптом для той же проблемы.

Я думаю, что вы можете исправить это:

  • начать потоковую загрузку определенного порогового значения до того, как необходимо отобразить вновь загруженный раздел тайла карты
  • создавая меньшие карты листов подразделов (в идеале такие же маленькие, как размер экрана или немного больше), чтобы они загружались быстрее
  • Предварительно загрузите тайлы в память, но установите значение visible = NO для тех, которые не должны отображаться

Если вы не можете загрузить все карты тайлов просто из-за занимаемой ими памяти, а другие опции не сработают, либо вам не повезет, если вы не сможете реализовать свою собственную оптимизированную для памяти версию системы тайлкарт.

Другие вопросы по тегам