【UnLua】深入理解 UnLua
从 UnLua 框架层面讨论真正值得关注的关键点
- UnLua 架构
- UnLua 内存管理
- UnLua 性能
大纲
- UnLua 静态导出
- UnLua 架构
- UnLua 内存管理
- UnLua 性能
静态导出
静态导出,这是标准的 Lua 用法,已经非常完善了,就一种标准做法
简单过一遍,之后的章节不再讨论静态导出
Case Study:Cocos Lua
以 Cocos Lua 为例,架构如下图:
- 跑 binding-generator 工具,用 clang 扫描 C++ 源码,自动生成 Lua Binding C++ 代码
- Lua Binding 代码 和引擎 C++ 一起编译
- 运行时 加载 Lua Binding,即把 引擎 C++ API 注册给 Lua 调用
可以理解为 Lua Binding 层 也是一种反射层,笔者自己写玩具引擎早期就是直接拿 Lua 当作反射层来动态调用 C++
UnLua 静态导出
- 目前只有手工静态导出这条路,自动生成可以有,但没必要
- 引擎里不支持反射的类型,只能通过静态导出来提供给 Lua 调用
UnLua 架构
接下来我们讨论基于一般实践 Common Case,忽略其他链路
UnLua Runtime 架构 如下图:
- 反射层是核心
- BP 和 UnLua 通过 反射层 和 UE 通信
- BP 定义了 UClass 的结构,包括 UFunction 和 UProperty 的集合
- UnLua 监听 UObject 的创建销毁,如果 UClass 绑定了 UnLua(实现了 UnLuaInterface),则换掉 UFunction 调用,走 UnLua 调用 Lua 函数
- Lua 代码中 调用 UE C++ API,通过 UnLua 走 UE 反射层去调用
Lua Call UE 的调用链路,如下图:
接下来我们结合实际例程来理解
Case Study:Delay
调用 Delay 背后发生了什么?
UnLua 内存管理
UE 内存管理 + Lua 内存管理
UnLua 性能
- GC,尤其是 struct,Vector3 数学类型