Lua 5.4引入的新變動
- 新的分代模式垃圾回收 (new generational mode for garbage collection)
在分代模式下,收集器頻繁進行次要收集,僅遍歷最近創建的對象。如果在次要收集之后對內存的使用仍然超出限制,則收集器將進行一次世界停止的主要收集,該遍歷將遍歷所有對象。分代模式使用兩個參數:次要乘數和主要乘數。
次要乘數控制次要收集的頻率。對於次要乘數x,當內存增長到前一個主要集合之后使用的內存大x%時,將進行新的次要集合。例如,對於20的乘數,當內存使用量比上一個主要收集之后的使用量大20%時,收集器將進行次要收集。默認值為20;默認值為20。最大值為200。
主乘數控制主集合的頻率。對於主乘數x,當內存增長到前一個主集合之后使用的內存大x%時,將進行新的主集合。例如,對於100的乘數,當內存使用量大於上一次收集之后的兩倍時,收集器將進行主收集。預設值為100;最大值為1000。
分代模式垃圾回收對以Lua為主的項目是有好處的,分代的機制能減少對不需要回收對象的遍歷,提升垃圾回收的速度.
-
to-be-closed特性 (to-be-closed variables)
Lua引入了新的語法——特性,我覺得這在Lua的變動中是最新鮮的部分,特性可以讓對象具有更加特別的行為,期待Lua后續的更新中帶來更多的特性.
to-be-closed特性是讓lua的對象具有終結器一樣的功能,當變量超出訪問范圍后即會觸發其__close
元方法.do local obj<close> = xxxx end -- 當 obj 不可訪問時就會調用其 __close 原方法
-
局部常量 (const variables)
const
特性使變量在聲明后不可以再次改變其值.對Lua這樣的語言,引入這個特性感覺只是性能上的考慮.
const特性變量是編譯器變量VCONST, /* compile-time <const> variable; info = absolute index in 'actvar.arr' */
do local my_value<const> = xxxx -- 其后無法再對my_value 賦值 end
-
userdata可以有多個user values(userdata can have multiple user values)
對於只用Lua寫邏輯的人,不太清楚這個變動的影響
-
math.random
新的實現 (new implementation for math.random)Lua現在基於[xoshiro256]算法實現快速的偽隨機數生成(https://en.wikipedia.org/wiki/Xorshift#xoshiro256)
更加可靠的隨機算法,對游戲有好處,之前Lua虛擬機每次重啟后隨機出來的值都是一樣的Lua 5.3的隨機:
現在Lua 5.4 每次隨出來的就是不一樣的
-
警告系統 (warning system)
通過
warn(msg1,...)
發出一條警告信息,按照慣例,以@
開頭的單條消息旨在作為控制消息,它是警告系統本身的消息.特別地,標准的Lua warning 函數,
特別是,Lua中的標准警告功能會識別控制消息“ @off”,以停止發出警告,並識別“ @on”,以(重新)開始發出警告;它忽略未知的控制消息。> warn("@on") > warn("2020年只剩下40天啦!時間: ",os.date() ) Lua warning: 2020年只剩下40天啦!時間: 11/08/20 23:29:34 > warn("@off") >
-
關於函數參數和返回值的Debug信息(debug information about function arguments and returns)
(略)
-
整數“for”循環的新語義 (new semantics for the integer 'for' loop)
(沒看到這個啥意思)
-
string.gmatch
新增了一個可選的init
參數 (optional 'init' argument to 'string.gmatch') -
close特性引入的新函數 (new functions 'lua_resetthread' and 'coroutine.close')
-
字符串到數字的強制轉換轉移到字符串庫中(string-to-number coercions moved to the string library)
-
縮小內存塊時分配功能失敗(allocation function allowed to fail when shrinking a memory block)
-
string.format
的新格式(new format '%p' in 'string.format') -
utf8庫最多接受代碼點到2^21(utf8 library accepts codepoints up to 2^31)