1

感谢您的帮助和阅读本文。

这是我的来源:Download_Cocos2d_Continuous_Scrolling_Tile_Based_Game

其基于连续滚动瓷砖的 cocos2D 游戏。在这个游戏中,tileMaps 是根据需要加载和释放的——第三个瓦片地图是在第一个释放的时候加载的。重复相同的过程。由于加载时间,观察到磁贴滚动中的一些混蛋。所以我使用单独的线程来加载瓷砖地图。这导致屏幕出现奇怪的闪烁......仅在设备中。

  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 没有任何东西要渲染的短时间替换加载时间中断 - 直到加载新的瓷砖地图。我猜线程在这里不是一个修复,它只是给你一个不同的症状来解决同样的问题。

我认为您可以解决此问题的方法是:

  • 在需要显示新加载的 tilemap 部分之前开始线程加载某个阈值
  • 创建较小的小节瓷砖地图(理想情况下与屏幕尺寸一样小或稍大一些),以便它们加载更快
  • 将瓷砖地图预加载到内存中,但为那些不应该渲染的地图设置可见 = NO

如果仅仅因为它们消耗的内存而不能加载所有的瓷砖地图,并且其他选项也不起作用,那么除非你可以实现自己的、内存优化的瓷砖地图系统版本,否则你很不走运。

于 2012-09-10T20:33:21.237 回答