Egret的一些性能優化


Egret的性能優化不知道在哪里啊,主要參考Laya的性能優化,都差不多

 

一、性能統計面板

index.html頁面設置data-show-fps=true打開性能面板

 

性能統計面板說明

 

 Egret沒有內存占用查看,F12瀏覽器中Memory查看內存占用

 

 二、內存優化

1.對象池

減少了實例化對象時的開銷,且能讓對象反復使用,減少了新內存分配與垃圾回收器運行的機會

用了對象池后將減少程序的垃圾對象,有效的提高程序的運行速度和穩定性

我自己寫的對象池

laya的對象池

還是laya的精簡...

/**
*<p> <code>Pool</code> 是對象池類,用於對象的存貯、重復使用。</p>
*<p>合理使用對象池,可以有效減少對象創建的開銷,避免頻繁的垃圾回收,從而優化游戲流暢度。</p>
*/
//class laya.utils.Pool
var Pool=(function(){
	function Pool(){}
	__class(Pool,'laya.utils.Pool');
	Pool.getPoolBySign=function(sign){
		return Pool._poolDic[sign] || (Pool._poolDic[sign]=[]);
	}

	Pool.clearBySign=function(sign){
		if (Pool._poolDic[sign])Pool._poolDic[sign].length=0;
	}

	Pool.recover=function(sign,item){
		if (item["__InPool"])return;
		item["__InPool"]=true;
		Pool.getPoolBySign(sign).push(item);
	}

	Pool.getItemByClass=function(sign,cls){
		var pool=Pool.getPoolBySign(sign);
		var rst=pool.length ? pool.pop():new cls();
		rst["__InPool"]=false;
		return rst;
	}

	Pool.getItemByCreateFun=function(sign,createFun){
		var pool=Pool.getPoolBySign(sign);
		var rst=pool.length ? pool.pop():createFun();
		rst["__InPool"]=false;
		return rst;
	}

	Pool.getItem=function(sign){
		var pool=Pool.getPoolBySign(sign);
		var rst=pool.length ? pool.pop():null;
		if (rst){
			rst["__InPool"]=false;
		}
		return rst;
	}

	Pool._poolDic={};
	Pool.InPoolSign="__InPool";
	return Pool;
})()

 

關於對象池對於效率有多少提高,沒有實測,得根據實例化和銷毀對象的性能消耗來判定。

 

三、垃圾回收、資源卸載、釋放內存

內存管理

Javascript垃圾回收

阮一峰 JavaScript 內存泄漏教程

垃圾回收方式:標記清除、引用計數

垃圾回收時間:固定間隔、上限

游戲中除了常用的事件監聽的移除、對象引用設置為null等等,對於資源加載使用后,也要即時卸載。

 

四、渲染優化

1. drawcall

合圖對drawcall的影響

 

 

吃飯去了,待編輯...

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM