我們公司有一個Unity原生開發語言C#寫的專案,目前已經在安卓測驗過多次,上架IOS在考慮熱更,所以對ILRuntim進行性能測驗,在測驗程序中已經按照官方檔案進行了CLR系結和生成Release的Dll,并且在非Editor環境下測驗,
我的測驗環境:ILRuntime 1.6.3 ,MuMu模擬器和華為手機
50萬次的加法運算
ILRuntime使用全域變數:UnitTest_Performance50萬 Elapsed time:1050ms, result = 445698416 ,Tick:10527445
ILRuntime使用區域變數:UnitTest_Performance50萬 Elapsed time:534ms, result = 445698416 ,Tick:5436060
Unity原生代碼:mono UnitTest_Performance50萬 Elapsed time:1ms, result = 445698416 ,Tick:19900
xlua中lua:[10:42:43.8636]LUA: cost: 4.00ms
C#測驗代碼
public static void UnitTest_Performance3()
{
var before = DateTime.Now.Ticks;
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
int cnt = 0;
for (int i = 0; i < 500000; i++)
{
cnt += i;
}
sw.Stop();
var tick_diff = DateTime.Now.Ticks - before;
Debug.Log(string.Format("UnitTest_Performance50萬 Elapsed time:{0:0}ms, result = {1} ,Tick:{2}", sw.ElapsedMilliseconds, cnt,tick_diff));
}
Lua測驗代碼
local begin = os.clock()
local cnt = 0;
for i = 1, 500000 do
cnt = cnt + i;
end
local diff = os.clock() - begin;
print(string.format("cost:%.2f ms", diff*1000))
從測驗結果可以看到在Lua做加法運算的性能會比ILRuntime中好一百倍左右,對于需要大量運算的確實如ILRuntime的檔案所以不應該放熱更代碼中
為什么不測驗熱更調主工程?
在這個專案中,從熱更呼叫主工程代碼,相對比較少,大部分都是在熱更工程中使用計算,比如物件管理,戰斗部分,玩法邏輯,
從ILRuntime的檔案中提到跨域呼叫會比Lua快很多
空Update也耗時
對于MonoBehaviour中的空Update,當執行上千次時,耗時在0.1ms,所以要去掉空內容的Update
建議
堆疊和堆差別非常大
上面區域變數和全域變數的耗時差別很大,是因為區域變數是存盤在堆疊中,而全域變數是存盤在堆中,一定要注意在進行遍歷一個串列時,在方法內先使用local xx = 全域變數,這樣對于性能的提升是非常有效的
邏輯運算問題會放大數百倍
如果專案計劃使用ILRuntime熱更,強烈建議在專案初期就接入,這樣能及早發現邏輯代碼效率問題,及早解決掉,
一定要仔細閱讀官方的檔案,避免踩到雷區,比如foreach會產生GC Allow,熱更代碼中避免頻繁大量的計算和空函式呼叫,對于有很多的空Update也需要去掉
不要使用foreach
在每秒執行的update中使用for會比foreach性能好很多
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/677.html
標籤:其他
