Y3的Lua虚拟机版本为 5.4
,并进行了一些定制:
- 实数的实现由浮点数改为了定点数。这是为了保证在跨平台时运算的一致性。通常你不需要考虑这个问题,并且出于习惯我们会继续称呼其为“浮点数”。以下是一些细节:
- 定点数的性能会略有损失,因为浮点数是硬件实现的。
- 定点数的精度较低,只能表示13位左右的十进制数,有效位数9位左右。而浮点数可以表示308位左右的十进制数字,有效位数位15位左右,因此你更容易观察到一些精度问题。
- 如果一张表的所有索引均为数字或字符串且插入顺序一致,那么使用
pairs
与next
遍历这张表时会保证遍历顺序稳定。如果无法保证这些前提,请改用y3.util.sortPairs
。 math.random
改用了引擎提供的接口,以保证玩家之间的一致性。os.clock
返回当前的逻辑时间,原本的实现要使用os.clock_banned
- 出于安全性考虑,以下函数只能在开发模式中使用,平台中运行地图时这些函数会被置为
nil
:dofile
loadfile
debug.debug
debug.gethook
debug.getlocal
debug.getmetatable
debug.getregistry
debug.getupvalue
debug.getuservalue
debug.sethook
debug.setlocal
debug.setupvalue
debug.setuservalue
debug.upvaluejoin
io.close
io.flush
io.input
io.lines
io.output
io.popen
io.read
io.stdin
io.stdout
io.tmpfile
io.write
os.execute
os.exit
os.getenv
os.remove
os.rename
os.setlocale
os.tmpname
package.loadlib
- 出于安全性考虑,在平台运行地图时以下函数会受到限制:
io.open
: 无法使用绝对路径,路径中不能包含..
,相对路径将基于地图的custom
目录。io.open
: 无法使用r
模式打开文件。debug.getinfo
: 返回的表中不会包含func
字段。debug.setmetatable
: 对table
或userdata
使用时将降级为setmetatable
,以保证无法绕过__metatable
元方法。