關(guān)于creator動態(tài)合圖

在creator中,為了降低DC勋颖,提供了一個方法侨赡,在項目運行的時候蓖租,運行時將內(nèi)存中的任意紋理組合成一張虛擬的圖集,當(dāng)渲染一張貼圖的時候羊壹,動態(tài)合圖系統(tǒng)會自動檢測這張貼圖是否已經(jīng)被加入到了動態(tài)合圖系統(tǒng)蓖宦,如果沒有,并且此貼圖又符合動態(tài)合圖的條件油猫,就會將此貼圖合并到動態(tài)合圖系統(tǒng)生成的大貼圖中稠茂。

動態(tài)合圖?是按照?渲染順序?來選取要將哪些貼圖合并到一張大圖中的,這樣就能確保相鄰的 DrawCall 能合并為一個 DrawCall情妖。

注意事項:

在場景加載前睬关,動態(tài)合圖系統(tǒng)會進(jìn)行重置,?SpriteFrame貼圖的引用和 uv 都會恢復(fù)到初始值毡证。

Cocos Creator是如何實現(xiàn)這個功能的呢电爹?

核心思想是數(shù)據(jù)結(jié)構(gòu)中常說的空間換時間, 原理其實并不復(fù)雜料睛,就是幀緩存丐箩,簡單來說就是將多份spriteFrame繪制到RenderTexture上,并記錄其在新的RenderTexture中所屬的位置和長寬恤煞,渲染的時候利用這些信息從RenderTexture所得到的紋理上取所需要的區(qū)域`

```

onstAtlas=require('./atlas');

let_atlases=[];

let_atlasIndex=-1;

let_maxAtlasCount=5;

let_textureSize=2048;

// Smaller frame is more likely to be affected by linear filter

let_minFrameSize=8;

let_maxFrameSize=512;

let_debugNode=null;

functionnewAtlas(){

letatlas=_atlases[++_atlasIndex]

if(!atlas){

atlas=newAtlas(_textureSize,_textureSize);

_atlases.push(atlas);

}

returnatlas;

}

functionbeforeSceneLoad(){

dynamicAtlasManager.reset();

}

let_enabled=false;

/**

* !#en Manager the dynamic atlas.

* !#zh 管理動態(tài)圖集屎勘。

*@classDynamicAtlasManager

*/

letdynamicAtlasManager={


/**

? ? * !#en Enabled or Disabled dynamic atlas.

? ? * !#zh 開啟或者關(guān)閉動態(tài)圖集。

*@propertyenabled

*@type{Boolean}

? ? */

getenabled(){

return_enabled;

},

setenabled(value){

if(_enabled===value)return;

if(value){

this.reset();

cc.director.on(cc.Director.EVENT_BEFORE_SCENE_LAUNCH,beforeSceneLoad);

}

else{

cc.director.off(cc.Director.EVENT_BEFORE_SCENE_LAUNCH,beforeSceneLoad);

}

_enabled=value;

},

/**

? ? * !#en The maximum number of atlas that can be created.

? ? * !#zh 可以創(chuàng)建的最大圖集數(shù)量阱州。

*@propertymaxAtlasCount

*@type{Number}

? ? */

getmaxAtlasCount(){

return_maxAtlasCount;

},

setmaxAtlasCount(value){

_maxAtlasCount=value;

},

/**

? ? * !#en The size of the atlas that was created

? ? * !#zh 創(chuàng)建的圖集的寬高

*@propertytextureSize

*@type{Number}

? ? */

gettextureSize(){

return_textureSize;

},

settextureSize(value){

_textureSize=value;

},

/**

? ? * !#en The maximum size of the picture that can be added to the atlas.

? ? * !#zh 可以添加進(jìn)圖集的圖片的最大尺寸挑秉。

*@propertymaxFrameSize

*@type{Number}

? ? */

getmaxFrameSize(){

return_maxFrameSize;

},

setmaxFrameSize(value){

_maxFrameSize=value;

},

/**

? ? * !#en Append a sprite frame into the dynamic atlas.

? ? * !#zh 添加碎圖進(jìn)入動態(tài)圖集。

*@methodinsertSpriteFrame

*@param{SpriteFrame} spriteFrame

? ? */

insertSpriteFrame(spriteFrame){

if(CC_EDITOR)returnnull;

if(!_enabled||_atlasIndex===_maxAtlasCount||

!spriteFrame||spriteFrame._original)returnnull;


lettexture=spriteFrame._texture;

if(textureinstanceofcc.RenderTexture||texture._isCompressed())returnnull;

letw=texture.width,h=texture.height;

if(w>_maxFrameSize||h>_maxFrameSize||w<=_minFrameSize||h<=_minFrameSize

||texture._getHash()!==Atlas.DEFAULT_HASH){

returnnull;

}

letatlas=_atlases[_atlasIndex];

if(!atlas){

atlas=newAtlas();

}

letframe=atlas.insertSpriteFrame(spriteFrame);

if(!frame&&_atlasIndex!==_maxAtlasCount){

atlas=newAtlas();

returnatlas.insertSpriteFrame(spriteFrame);

}

returnframe;

},

/**

? ? * !#en Resets all dynamic atlas, and the existing ones will be destroyed.

? ? * !#zh 重置所有動態(tài)圖集苔货,已有的動態(tài)圖集會被銷毀犀概。

*@methodreset

? ? */

reset(){

for(leti=0,l=_atlases.length;i<l;i++){

_atlases[i].destroy();

}

_atlases.length=0;

_atlasIndex=-1;

},

/**

? ? * !#en Displays all the dynamic atlas in the current scene, which you can use to view the current atlas state.

? ? * !#zh 在當(dāng)前場景中顯示所有動態(tài)圖集,可以用來查看當(dāng)前的合圖狀態(tài)夜惭。

*@methodshowDebug

*@param{Boolean} show

? ? */

showDebug:CC_DEV&&function(show){

if(show){

if(!_debugNode||!_debugNode.isValid){

letwidth=cc.visibleRect.width;

letheight=cc.visibleRect.height;

_debugNode=newcc.Node('DYNAMIC_ATLAS_DEBUG_NODE');

_debugNode.width=width;

_debugNode.height=height;

_debugNode.x=width/2;

_debugNode.y=height/2;

_debugNode.zIndex=cc.macro.MAX_ZINDEX;

_debugNode.parent=cc.director.getScene();

_debugNode.groupIndex=cc.Node.BuiltinGroupIndex.DEBUG;

cc.Camera._setupDebugCamera();

letscroll=_debugNode.addComponent(cc.ScrollView);

letcontent=newcc.Node('CONTENT');

letlayout=content.addComponent(cc.Layout);

layout.type=cc.Layout.Type.VERTICAL;

layout.resizeMode=cc.Layout.ResizeMode.CONTAINER;

content.parent=_debugNode;

content.width=_textureSize;

content.anchorY=1;

content.x=_textureSize;

scroll.content=content;

for(leti=0;i<=_atlasIndex;i++){

letnode=newcc.Node('ATLAS');


lettexture=_atlases[i]._texture;

letspriteFrame=newcc.SpriteFrame();

spriteFrame.setTexture(_atlases[i]._texture);

letsprite=node.addComponent(cc.Sprite)

sprite.spriteFrame=spriteFrame;

node.parent=content;

}

}

}

else{

if(_debugNode){

_debugNode.parent=null;

_debugNode=null;

}

}

},

update(){

if(!this.enabled)return;

for(leti=0;i<=_atlasIndex;i++){

_atlases[i].update();

}

},

};

/**

*@modulecc

*/

/**

*@propertydynamicAtlasManager

*@typeDynamicAtlasManager

*/

module.exports=cc.dynamicAtlasManager=dynamicAtlasManager;

```

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末姻灶,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子诈茧,更是在濱河造成了極大的恐慌产喉,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異曾沈,居然都是意外死亡这嚣,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門塞俱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姐帚,“玉大人,你說我怎么就攤上這事障涯」奁欤” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵唯蝶,是天一觀的道長九秀。 經(jīng)常有香客問我,道長粘我,這世上最難降的妖魔是什么鼓蜒? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮征字,結(jié)果婚禮上友酱,老公的妹妹穿的比我還像新娘。我一直安慰自己柔纵,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布锤躁。 她就那樣靜靜地躺著搁料,像睡著了一般。 火紅的嫁衣襯著肌膚如雪系羞。 梳的紋絲不亂的頭發(fā)上郭计,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機與錄音椒振,去河邊找鬼昭伸。 笑死,一個胖子當(dāng)著我的面吹牛澎迎,可吹牛的內(nèi)容都是我干的庐杨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼夹供,長吁一口氣:“原來是場噩夢啊……” “哼灵份!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起哮洽,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤填渠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氛什,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡莺葫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了枪眉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捺檬。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瑰谜,靈堂內(nèi)的尸體忽然破棺而出欺冀,到底是詐尸還是另有隱情,我是刑警寧澤萨脑,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布隐轩,位于F島的核電站,受9級特大地震影響渤早,放射性物質(zhì)發(fā)生泄漏职车。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一鹊杖、第九天 我趴在偏房一處隱蔽的房頂上張望悴灵。 院中可真熱鬧,春花似錦骂蓖、人聲如沸积瞒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茫孔。三九已至,卻和暖如春被芳,著一層夾襖步出監(jiān)牢的瞬間缰贝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工畔濒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留剩晴,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓侵状,卻偏偏與公主長得像赞弥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子趣兄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容