0

私のゲームでは、ゲームプレイ中にシーンの背景を変更する必要があります。背景に新しいテクスチャを設定すると、ゲームの速度が少し遅くなります。これを回避するために、テクスチャを非同期でプリロードしてから、メインスレッドに表示しようとしています。これは私がそれを行う方法です:

NSString *filename = [NSString stringWithFormat:@"res/src/level_%i/background.png", [GameLevel sharedGameLevel].currentLevelIndex + 1];
__block CCTexture2D *texture;

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    NSLog(@"FILENAME %@", filename);
    [[CCTextureCache sharedTextureCache] addImage:filename];
    NSLog(@"%@", [CCTextureCache sharedTextureCache]);

    dispatch_async(dispatch_get_main_queue(), ^{

        texture = [[CCTextureCache sharedTextureCache] textureForKey:filename];

        [spareBackground setTexture:texture];

        [dayBackground runAction:[CCSequence actions:fadeOut,[CCCallBlockN actionWithBlock:^(CCNode *node)
        {
            NSLog(@" TEXTURE %@", texture);
            [dayBackground setTexture:texture];
            CCFadeIn *fadeIn = [[[CCFadeIn alloc] initWithDuration:5] autorelease];
            [dayBackground runAction:fadeIn];
        }], nil]];      

    });
});

しかし、背景の代わりに、テクスチャが正常にロードされたにもかかわらず、常に空白の画面が表示されますが、そうではありませんnil。このコードは、gcdを使用せずにテクスチャがメインスレッドにロードされている場合は問題なく機能します。私は何が欠けていますか?

4

2 に答える 2

1

私の疑いは、それCCTextureCacheはスレッドセーフではないということです(そして共有オブジェクトであるため、別のスレッドから安全に呼び出されるためにはスレッドセーフである必要があります)。

一方、Cocos2dは、テクスチャを非同期でロードするメカニズムをすでに提供しているため、代わりにそれらを使用することができます。これは署名である必要があります:

[[CCTextureCache sharedTextureCache] addImageAsync:filename target:self selector:@selector(textureLoaded:)];
于 2013-02-12T09:05:04.390 に答える
0

「スペース」を「時間」と交換する余裕がある場合、つまりゲームのメモリフットプリントが妥当な場合は、シーンの開始時に両方のテクスチャをプリロードし、ゲームのプレイ中にテクスチャの可視性を反転するだけです。

また、pngの代わりにpvrテクスチャをロードすると、かなり高速に実行されることがわかりました(つまり、CPUの消費量が少ないと思います)。これを最初の試みとして試すことができます。ユーザーエクスペリエンスの観点から「一時停止」が受け入れられることを期待しています。

ps。パフォーマンスに関するコメントは、実際のデバイスでの実際の測定とテストに基づいています。シミュレーターは役に立たない。最適化に労力を費やす前に、この「一時停止」がデバイスに存在することを確認してください。

于 2013-02-12T15:07:19.637 に答える