2012-07-11 2 views
1

내 앱에 시작 로더를 구현하고 싶습니다. 그것은 다음과 같아야합니다 : 시작 화면 시작 후, 사용자는 간단한 animataion을 보게됩니다. 그 사이에 app preload 사운드 효과, 배경 음악, 스프라이트 이미지, 스프라이트 시트 등을 보게 될 것입니다. 현재 구현 :cocos2d-iphone 앱에서 부드러운 로더 구현

- (id)init { 
    if((self = [super init])) { 

     // Some other setup ... 
     CGRect rect; 
     rect = waveSprite.textureRect; 
     waveInitialTexRectOrigin = rect.origin; 
     rect.size.width = 91; 
     waveSprite.textureRect = rect; 

     assetFilenames = [[NSArray alloc] initWithObjects: 

          // images 
          @"background.png", 


          // spritesheets 
          @"sprites.plist", 

          // fonts 
          @"main.png", 

          // sound effects 
          @"button.wav", 
          nil]; 
     assetCounter = 0; 
     [self loadAsset]; 
    } 
    return self; 
} 


- (void)update:(ccTime)dt { 
    CGRect rect; 
    rect = waveSprite.textureRect; 
    rect.origin.x += dt*kLoaderWaveSpeed; 
    while (rect.origin.x > waveInitialTexRectOrigin.x + kLoaderWavePeriod) { 
     rect.origin.x -= kLoaderWavePeriod; 
    } 
    waveSprite.textureRect = rect; 
} 

#pragma mark Private 

- (void)loadAsset { 
// CCLOG(@"loadAsset"); 

    NSString *filename = [assetFilenames objectAtIndex:assetCounter]; 
    CCLOG(@"loading %@", filename); 

    NSString *ext = [filename pathExtension]; 

    if ([ext doesMatchRegStringExp:@"[png|jpg]"]) { 
     [[CCTextureCache sharedTextureCache] addImage:filename]; 
    } else if ([ext isEqualToString:@"plist"]) { 
     [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:filename]; 
    } else if ([ext doesMatchRegStringExp:@"[caf|wav|mp3]"]) { 
     [[SimpleAudioEngine sharedEngine] preloadEffect:filename]; 
    } 

    assetCounter++; 

    if (assetCounter < [assetFilenames count]) { 
     [self performSelector:@selector(loadAsset) withObject:self afterDelay:0.1f]; 
    } else { 
     [self performSelector:@selector(loadingComplete) withObject:self afterDelay:0.2]; 

    } 

하지만 애니메이션이 갑작 스럽습니다.

UPD 이미

[self performSelectorInBackground: withObject:] 

을 시도했지만 작동하지 않았다 (첫 번째 자산을로드에 걸려). 어쩌면 나는이 방향으로 나아가 야한다.

UPD2 부드럽고 갑작스럽지 않고 지연 및 깜박임이 없습니다. fps는 중요하지 않습니다. 20 fps 꽤 OK

+1

"부드럽게"를 정의하십시오. 여러 스레드를 사용하면 다른 CPU 코어가 자산을로드하는 동안 60fps로 애니메이션을 만들 수 있습니다. 하지만 단일 코어 CPU 장치에서는 20fps 이상을 얻지 못할 수도 있습니다. – LearnCocos2D

+0

정의 됨, 업데이트 –

+0

@ LearnCocos2D를 참조하십시오. 그러면 다른 스레드에서 텍스처를 다른 다음 메인으로 가져올 수 있습니까? –

답변

0

같은 스레드에서 모든 작업을 수행하고 있기 때문입니다. 로더에 별도의 스레드를 사용하십시오.

희망이 도움이됩니다.

건배!

편집 : this을 살펴보십시오.

+0

고마워,하지만 작동하지 않는 것 같아. 어쩌면 잘 해봐야 할 것 같아. –

+0

내 수정 된 답변보기 – George

1

performSelectorInBackground를 더 이상 사용하지 않아야합니다. 더 이상 사용되지 않지만 나중에 그림에 GCD이 표시 될 수 있습니다.

UI 업데이트를 할 수있는 유일한 스레드이기 때문에 주 스레드에서 애니메이션을 실행하려고합니다. GCD를 사용하여 하나 이상의 스레드를 생성하여 모든 에셋을로드합니다.

병렬 처리 대기열을 사용하여 모든 항목을 병렬로로드하고 완료되면 애니메이션을 닫습니다.

현재 동시 발송 큐에 대한 완전한 정보를 얻을 수 있습니다

Concurrency Programming Guide

희망을.

2

나는 CC2D 경험, 그러나 여기에서 나는 부드러운 애니메이션 로딩 표시 보여 내의 ViewController에서 사용 무엇 아니에요 : 나는 해볼만 한 가치는 추측

//Set up and run your loading scene/indicator here 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 

     //Load your scene 

    dispatch_async(dispatch_get_main_queue(), ^{ 

     //This fires when the loading is complete 
     //Show menu and destroy the loader scene/indicator here 

    }); 
}); 

합니다.