Skip to content

Latest commit

 

History

History
47 lines (46 loc) · 2.23 KB

Lua虚拟机.md

File metadata and controls

47 lines (46 loc) · 2.23 KB

Y3的Lua虚拟机版本为 5.4 ,并进行了一些定制:

  • 实数的实现由浮点数改为了定点数。这是为了保证在跨平台时运算的一致性。通常你不需要考虑这个问题,并且出于习惯我们会继续称呼其为“浮点数”。以下是一些细节:
    • 定点数的性能会略有损失,因为浮点数是硬件实现的。
    • 定点数的精度较低,只能表示13位左右的十进制数,有效位数9位左右。而浮点数可以表示308位左右的十进制数字,有效位数位15位左右,因此你更容易观察到一些精度问题。
  • 如果一张表的所有索引均为数字或字符串插入顺序一致,那么使用 pairsnext 遍历这张表时会保证遍历顺序稳定。如果无法保证这些前提,请改用 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: 对 tableuserdata 使用时将降级为 setmetatable,以保证无法绕过 __metatable 元方法。