zoukankan      html  css  js  c++  java
  • cocos2dx 3.3 异步加载纹理

    这里以3d场景加载为例,2d情况类似。

    先同步加载模型数据和尺寸缩小了100倍的贴图,创建mesh。然后异步加载所有精细纹理并每加载完一个就替换一个,并进入场景。

    如此做法的效果是当刚进入场景时看到的是贴图非常糙的场景,然后逐渐贴换为精细贴图。(就像放大谷歌地图时的情况)。

    下图左边是 刚进入场景时,右边是 精细纹理异步加载完成后:

      

    具体实现如下:

    bool ClevelMapLayer::init(){

      loadAllModelData();

      loadAllRoughTex();

      createMeshesWithModelDataAndMiniTex();

      asyncLoadAllFineTex();  

      return true;

    }

    void ClevelMapLayer::asyncLoadAllFineTex(){

        const int nTexPath=(int)m_allTexPathList.size();

        for(int i=0;i<nTexPath;i++){

            const string&texPath=m_allTexPathList[i];

            //ref:http://www.cocoachina.com/bbs/read.php?tid=198291

            CCTextureCache::sharedTextureCache()->addImageAsync(texPath,CC_CALLBACK_1(ClevelMapLayer::replaceTexCallBack,this,texPath));

        }

    }

    void ClevelMapLayer::replaceTexCallBack(CCTexture2D*tex,const string&texPath){

        vector<Cmesh*> meshList=getMeshesWhoseTexPathEqualsTo(texPath);

        for(int i=0;i<(int)meshList.size();i++){

            Cmesh*mesh=meshList[i];

            mesh->setTexture(tex);

        }

    }

    另外粗略看了一下,如果没看错的话cocos2dx中异步加载纹理的线程是公用的,只有一个,所以异步加载的纹理的完成顺序与调用addImageAsync的先后顺序一致,因此对于异步加载的纹理,我们想让哪个纹理最先显示出来,就应该最先对那个纹理调用addImageAsync。

  • 相关阅读:
    python目录
    Django的认证系统
    Django logging配置
    Django 中间件
    Django Form和ModelForm组件
    AJAX
    Django中ORM介绍和字段及字段参数
    Django ORM那些相关操作
    Python中应该使用%还是format来格式化字符串?
    利用Python win32api 模拟键盘输入,打开浏览器,实现网页全屏,并移到第二屏幕
  • 原文地址:https://www.cnblogs.com/wantnon/p/4515293.html
Copyright © 2011-2022 走看看