銷(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
- 盡量減少不必要的層次嵌套,減少Sprite數(shù)量缅疟。
- 非可見(jiàn)區(qū)域的對(duì)象盡量從顯示列表移除或者設(shè)置visible=false。
- 對(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)容坞笙。
- 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è)值可選漓帚。
- 默認(rèn)為"none",不做任何緩存午磁。
- 當(dāng)值為"normal"時(shí)尝抖,Canvas下進(jìn)行畫(huà)布緩存,webgl模式下進(jìn)行命令緩存迅皇。
- 當(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í)行代碼塊。
- Laya.timer.frameLoop執(zhí)行頻率依賴于幀頻率衅码,可通過(guò)Stat.FPS查看當(dāng)前幀頻拯刁。
- 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ì)變得非常慢。