LuaJIT

文章探讨了在游戏开发中使用LuaJIT时,如何处理iOS和Android平台上JIT的禁用问题。由于JIT可能导致性能下降和偶现卡顿,选择在所有平台关闭JIT,并通过luajit-b生成bytecode来优化体积和加载速度。尽管失去了JIT的加速,但考虑到体积减少40%和require代码加载速度提升10倍,这个决策带来了包体大小、内存占用和热更新文件大小的改善。
摘要由CSDN通过智能技术生成

利用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是一致的,不需要对代码做额外的优化

https://zhuanlan.zhihu.com/p/40484460

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值