找回密码
 立即注册
查看: 311|回复: 0

前端开发Lua篇——LuaJIT

[复制链接]
发表于 2022-1-8 14:01 | 显示全部楼层 |阅读模式
三十六计手游:利用LuaJIT转出bytecode跑interpreter模式,但是禁用了JIT模式
具体的方案是:
1.The LuaJIT Project网站下包,注意和cocos2dx引擎的jit版本一致
比如我们游戏cocos2dx版本号是3.13,在luaconf.h中可以看到lua和jit的版本信息luajit-2.1.0-beta2。
#ifndef LUA_LMULTILIB
#define LUA_LMULTILIB        "lib"
#endif
#define LUA_LROOT        "/usr/local"
#define LUA_LUADIR        "/lua/5.1/"
#define LUA_LJDIR        "/luajit-2.1.0-beta2/"

#ifdef LUA_ROOT
#define LUA_JROOT        LUA_ROOT
#define LUA_RLDIR        LUA_ROOT "/share" LUA_LUADIR
#define LUA_RCDIR        LUA_ROOT "/" LUA_MULTILIB LUA_LUADIR
#define LUA_RLPATH        ";" LUA_RLDIR "?.lua;" LUA_RLDIR "?/init.lua"
#define LUA_RCPATH        ";" LUA_RCDIR "?.so"版本不一致会出现cannot load incompatible bytecode报错。
2.luajit -b 转化bytecode
下载文件后,mac上可以直接make;win10下需要先配置VSCommandPrompt,如图


参数为/k "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\VsDevCmd.bat"。接下来cd到jit的src目录运行msvcbuild.bat即可编译出jit.exe.
利用luajit -b 命令即可生成bytecode。
这里有个细节要注意:jit bytecode后sethook的lua_debug信息中的行号钩子失效,永远显示0,如有基于行号的debug或者profile的话需要做相应改动。
3.ios默认关闭jit,android中用jit.off()关闭
1.为什么禁用JIT?

1.jit并不是直接将lua转为机器码,而是先以luajit的bytecode在runtime中iterpreter模式运行,iterpreter运行中发现某段代码经常被执行就会开启记录模式,记录这段代码的细节,推测变量的类型,记下来->SSAIR->机器码。
以trace compiler方案推测着运行机器码,用固定的内存访问而不是查表操作,所以速度更快。每次根据推测生成机器码时方式推测失败会加上一段守护代码。当类型不匹配时就会jit失败然后用守护方法重来。
所以一旦jit失败会比原先的interpreter更耗!
2.luajit为了提速,会尽可能用寄存器存储local,寄存器有限,所以对临时变量的请求更为苛刻
3.android平台的其他不稳定情况。
就我们游戏而言,for循环用的比较重的地方,jit开启时经常会有玩家报偶现卡顿。英雄模块就是个重灾区,后来jit.off(),这个世界清静了
2.为什么不用luac,还是坚持用jit的bytecode?

既然ios禁用jit,Android我们也主动关了jit,而且用jit还要区分平台,比如ios我们要为32位和64位系统打包两份bytecode,为什么还要用它而不用luac?
1.体积减少40%,体积一小,包体,内存,转化率,热更文件大小跟着都好办了
2.require代码时load速度快10倍
同时因为禁用了jit,性能特性和luac是一致的,不需要对代码做额外的优化

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2025-5-15 21:09 , Processed in 0.136397 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表