Laya3d 內(nèi)存優(yōu)化

銷(xiāo)毀元素

var  sp =  new  Sprite();
sp.destroy();

禁止回調(diào)垃圾回收

Laya.loader.load(urls, Handler.create( this , onAssetLoaded), Handler.create( this , onLoading,  null ,  false ));

資源卸載

var  assets = [];
assets.push( "res/apes/monkey0.png" );
assets.push( "res/apes/monkey1.png" );
assets.push( "res/apes/monkey2.png" );
assets.push( "res/apes/monkey3.png" );
  
Laya.loader.load(assets, Handler.create( this , onAssetsLoaded));
  
function  onAssetsLoaded()
{
     for ( var  i =  0 , len = assets.length; i < len; ++i)
     {
         var  asset = assets[i];
         console.log(Laya.loader.getRes(asset));
         Laya.loader.clearRes(asset);
         console.log(Laya.loader.getRes(asset));
     }
}

ColorFiter在Canvas渲染下需要計(jì)算每個(gè)像素點(diǎn),而在WebGL下的GPU消耗可以忽略不計(jì)村怪。
最佳的做法是喷橙,盡可能使用圖像創(chuàng)作工具創(chuàng)建的位圖來(lái)模擬濾鏡。避免在運(yùn)行時(shí)中創(chuàng)建動(dòng)態(tài)位圖蜂莉,可以幫助減少CPU或GPU負(fù)載且蓬。特別是一張應(yīng)用了濾鏡并且不會(huì)在修改的圖像欣硼。

優(yōu)化Sprite

  1. 盡量減少不必要的層次嵌套,減少Sprite數(shù)量缅疟。
  2. 非可見(jiàn)區(qū)域的對(duì)象盡量從顯示列表移除或者設(shè)置visible=false。
  3. 對(duì)于容器內(nèi)有大量靜態(tài)內(nèi)容或者不經(jīng)常變化的內(nèi)容(比如按鈕)遍愿,可以對(duì)整個(gè)容器設(shè)置cacheAs屬性存淫,能大量減少Sprite的數(shù)量,顯著提高性能沼填。如果有動(dòng)態(tài)內(nèi)容桅咆,最好和靜態(tài)內(nèi)容分開(kāi),以便只緩存靜態(tài)內(nèi)容坞笙。
  4. Panel內(nèi)岩饼,會(huì)針對(duì)panel區(qū)域外的直接子對(duì)象(子對(duì)象的子對(duì)象判斷不了)進(jìn)行不渲染處理,超出panel區(qū)域的子對(duì)象是不產(chǎn)生消耗的薛夜。

cacheAs

設(shè)置cacheAs可將顯示對(duì)象緩存為靜態(tài)圖像籍茧,當(dāng)cacheAs時(shí),子對(duì)象發(fā)生變化梯澜,會(huì)自動(dòng)重新緩存寞冯,同時(shí)也可以手動(dòng)調(diào)用reCache方法更新緩存。 建議把不經(jīng)常變化的復(fù)雜內(nèi)容晚伙,緩存為靜態(tài)圖像吮龄,能極大提高渲染性能,cacheAs有"none"咆疗,"normal"和"bitmap"三個(gè)值可選漓帚。

  1. 默認(rèn)為"none",不做任何緩存午磁。
  2. 當(dāng)值為"normal"時(shí)尝抖,Canvas下進(jìn)行畫(huà)布緩存,webgl模式下進(jìn)行命令緩存迅皇。
  3. 當(dāng)值為"bitmap"時(shí)牵署,Canvas下進(jìn)行依然是畫(huà)布緩存,webGL模式下使用renderTarget緩存喧半。這里需要注意的是奴迅,webGL下renderTarget緩存模式有2048大小限制,超出2048會(huì)額外增加內(nèi)存開(kāi)銷(xiāo)。另外取具,不斷重繪時(shí)開(kāi)銷(xiāo)也比較大脖隶,但是會(huì)減少drawcall,渲染性能最高暇检。 webGL下命令緩存模式只會(huì)減少節(jié)點(diǎn)遍歷及命令組織产阱,不會(huì)減少drawcall,性能中等块仆。

設(shè)置cacheAs后构蹬,還可以設(shè)置staticCache=true以阻止自動(dòng)更新緩存,同時(shí)可以手動(dòng)調(diào)用reCache方法更新緩存悔据。

cacheAs主要通過(guò)兩方面提升性能庄敛。一是減少節(jié)點(diǎn)遍歷和頂點(diǎn)計(jì)算;二是減少drawCall科汗。善用cacheAs將是引擎優(yōu)化性能的利器藻烤。

文本

//后面只是更新文字內(nèi)容,使用changeText能提高性能
text.changeText( "text changed." );

Text.changeText會(huì)直接修改繪圖指令中該文本繪制的最后一條指令头滔,這種前面的繪圖指令依舊存在的行為會(huì)導(dǎo)致changeText只使用于以下情況:
· 文本始終只有一行怖亭。
· 文本的樣式始終不變(顏色、粗細(xì)坤检、斜體兴猩、對(duì)齊等等)。

減少動(dòng)態(tài)屬性查找

JavaScript中任何對(duì)象都是動(dòng)態(tài)的早歇,你可以任意地添加屬性峭跳。然而,在大量的屬性里查找某屬性可能很耗時(shí)缺前。如果需要頻繁使用某個(gè)屬性值蛀醉,可以使用局部變量來(lái)保存它:

function  foo(){
     var  prop = target.prop;
     // 使用prop
     process1(prop);
     process2(prop);
     process3(prop);
}

計(jì)時(shí)器

LayaAir提供兩種計(jì)時(shí)器循環(huán)來(lái)執(zhí)行代碼塊。

  1. Laya.timer.frameLoop執(zhí)行頻率依賴于幀頻率衅码,可通過(guò)Stat.FPS查看當(dāng)前幀頻拯刁。
  2. Laya.timer.loop執(zhí)行頻率依賴于參數(shù)指定時(shí)間。
Laya.timer.frameLoop( 1 ,  this , animateFrameRateBased);
Laya.stage.on( "click" ,  this , dispose);
function  dispose() {
     Laya.timer.clear( this , animateFrameRateBased);
}

獲取顯示對(duì)象邊界

第一種

var  sp =  new  Sprite();
sp.graphics.drawRect( 0 ,  0 ,  100 ,  100 ,  "#FF0000" );
var  bounds = sp.getGraphicBounds();
Laya.stage.addChild(sp);

第二種, 自動(dòng)尺寸

var  sp =  new  Sprite();
sp.autoSize =  true ;
sp.graphics.drawRect( 0 ,  0 ,  100 ,  100 ,  "#FF0000" );
Laya.stage.addChild(sp);

加載圖片后獲得尺寸

var  sp =  new  Sprite();
sp.loadImage( "res/apes/monkey2.png" ,  0 ,  0 ,  0 ,  0 , Handler.create( this ,  function (){
     console.log(sp.width, sp.height);
}));
Laya.stage.addChild(sp);

直接設(shè)置

Laya.loader.load( "res/apes/monkey2.png" , Handler.create( this ,  function ()
{
     var  texture = Laya.loader.getRes( "res/apes/monkey2.png" );
     var  sp =  new  Sprite();
     sp.graphics.drawTexture(texture,  0 ,  0 );
     sp.size(texture.width, texture.height);
     Laya.stage.addChild(sp);
}));

幀頻 fps

幀頻有三種模式逝段,
Stage.FRAME_SLOW維持FPS在30垛玻;
Stage.FRAME_FAST維持FPS在60;
Stage.FRAME_MOUSE則選擇性維持FPS在30或60幀奶躯。

Laya.init(Browser.width, Browser.height);
Stat.show();
Laya.stage.frameRate = Stage.FRAME_SLOW;
  
var  sp =  new  Sprite();
sp.graphics.drawCircle( 0 ,  0 ,  20 ,  "#990000" );
Laya.stage.addChild(sp);
  
Laya.stage.on(Event.MOUSE_MOVE,  this ,  function (){
     sp.pos(Laya.stage.mouseX, Laya.stage.mouseY);
});
  • 延遲調(diào)用
var rotation=0,
scale=1,
position=0;
function setRotation(value)
{
  rotation=value;
  Laya.timer.callLater(this, update);
}
function setScale(value)
{
  scale = value;
  Laya.timer.callLater(this, update);
}
function setPosition(value)
{
    position = value;
    Laya.timer.callLater(this, update);
}
function update()
{
    console.log('rotation: ' + rotation + '\tscale: ' + scale + '\tposition: ' + position);
}

其它優(yōu)化策略

1帚桩、減少粒子的使用數(shù)量
由于粒子屬于矢量繪制,大量使用粒子對(duì)CPU壓力大嘹黔,在移動(dòng)平臺(tái)Canvas模式下账嚎,盡量不用粒子;
WebGL模式下可以采用GPU運(yùn)算,能減輕CPU壓力郭蕉,但也要盡量控制疼邀,減少使用量。

2召锈、Canvas模式盡量減少旋轉(zhuǎn)旁振,縮放,alpha等屬性的使用
在Canvas模式下涨岁,盡量減少旋轉(zhuǎn)拐袜,縮放,alpha等屬性的使用梢薪,這些屬性會(huì)對(duì)性能產(chǎn)生消耗蹬铺。
如要使用,建議在WebGL模式下使用沮尿;

3丛塌、不要在Timer的循環(huán)里創(chuàng)建對(duì)象及復(fù)雜計(jì)算
由于Timer的loop()frameLoop()方法里會(huì)不斷的循環(huán)執(zhí)行较解,當(dāng)創(chuàng)建對(duì)象及復(fù)雜計(jì)算時(shí)畜疾,會(huì)導(dǎo)致大量的性能消耗出現(xiàn)在循環(huán)里,因此印衔,盡可能不要在循環(huán)里創(chuàng)建對(duì)象及復(fù)雜計(jì)算啡捶。

4、盡量少用autoSize與getBounds
autoSize()getBounds()需要大量計(jì)算奸焙,對(duì)性能的影響較大瞎暑,盡量少用。

5与帆、被try catch的函數(shù)執(zhí)行會(huì)變得非常慢
項(xiàng)目中盡量減少try catch的使用了赌,被try catch的函數(shù)執(zhí)行會(huì)變得非常慢。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末玄糟,一起剝皮案震驚了整個(gè)濱河市勿她,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌阵翎,老刑警劉巖逢并,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異郭卫,居然都是意外死亡砍聊,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)贰军,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)玻蝌,“玉大人,你說(shuō)我怎么就攤上這事≡钜粒” “怎么了疆前?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)聘萨。 經(jīng)常有香客問(wèn)我竹椒,道長(zhǎng),這世上最難降的妖魔是什么米辐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任胸完,我火速辦了婚禮,結(jié)果婚禮上翘贮,老公的妹妹穿的比我還像新娘赊窥。我一直安慰自己,他們只是感情好狸页,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布锨能。 她就那樣靜靜地躺著,像睡著了一般芍耘。 火紅的嫁衣襯著肌膚如雪址遇。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天斋竞,我揣著相機(jī)與錄音倔约,去河邊找鬼。 笑死坝初,一個(gè)胖子當(dāng)著我的面吹牛浸剩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鳄袍,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼绢要,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了拗小?” 一聲冷哼從身側(cè)響起重罪,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎十籍,沒(méi)想到半個(gè)月后蛆封,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡勾栗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年惨篱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片围俘。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡砸讳,死狀恐怖琢融,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情簿寂,我是刑警寧澤漾抬,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站常遂,受9級(jí)特大地震影響纳令,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜克胳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一平绩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧漠另,春花似錦捏雌、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至满败,卻和暖如春肤频,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背葫录。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工着裹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留领猾,地道東北人米同。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像摔竿,于是被迫代替她去往敵國(guó)和親面粮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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

  • 部分內(nèi)容參考了[大天使H5主程死肥仔在LAYA沙龍的演講PPT]继低,感謝主程陳策的無(wú)私分享熬苍!另外參考極光會(huì)客廳:大型...
    合肥黑閱讀 9,603評(píng)論 0 9
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評(píng)論 25 707
  • This article is a record of my journey to learn Game Deve...
    蔡子聰閱讀 3,754評(píng)論 0 9
  • 用思念的淚水 加入迷失的果實(shí) 制瓶淡的香水 我叫它 你的味道 或遠(yuǎn)或近 散落各處 遮住憂傷
    瑪諾奇朵的愛(ài)情閱讀 333評(píng)論 0 1
  • 的確柴底,這部片子最令人稱(chēng)贊的,是它炫目的特效粱胜。從頭至尾柄驻,結(jié)合法師題材,再加上折疊空間焙压、能量武器鸿脓、萬(wàn)物尺度抑钟、空間傳送、...
    作家明至閱讀 1,215評(píng)論 2 2