1

あなたの心を助け、これを読んでくれてありがとう。

これが私のソースです:Download_Cocos2d_Continuous_Scrolling_Tile_Based_Game

その継続的にスクロールするタイルベースのcocos2Dゲーム。このゲームでは、タイルマップは必要に応じてロードおよびリリースされます。最初のタイルマップがリリースされると、3番目のタイルマップがロードされます。同じプロセスが繰り返されます。読み込み時間のため、タイルスクロールに多少のジャークが見られました。そこで、別のスレッドを使用してタイルマップをロードしました。それは画面に奇妙なフラッシュを引き起こしました..デバイスでのみ。

  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];
}
4

1 に答える 1

3

タイルマップを非同期でロードすることにより、ロード時間の中断を、新しいタイルマップがロードされるまで、cocos2dがレンダリングするものがない短い時間に置き換えるだけです。ここでは、スレッド化は修正ではないと思います。同じ問題に対して異なる症状が発生するだけです。

これを修正する方法は次のとおりだと思います。

  • 新しくロードされたタイルマップセクションを表示する必要がある前に、特定のしきい値のスレッドロードを開始します
  • より小さなサブセクションタイルマップ(理想的には画面サイズと同じか少し大きい)を作成して、ロードを高速化します
  • タイルマップをメモリにプリロードしますが、レンダリングされるはずのないタイルマップにはvisible=NOを設定します

消費するメモリが原因ですべてのタイルマップをロードできず、他のオプションも機能しない場合は、独自のメモリ最適化バージョンのタイルマップシステムを実装できない限り、運が悪いことになります。

于 2012-09-10T20:33:21.237 に答える