【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 数学类型
 



![[程序设计]-基于人工智能博弈树,极大极小(Minimax)搜索算法并使用Alpha-Beta剪枝算法优化实现的可人机博弈的AI智能五子棋游戏。](https://img-blog.csdnimg.cn/83e1004aada2485d8d7c4c074aaafc1a.png)








![Bandit算法学习[网站优化]01——Multiarmed Bandit 算法引入](https://img-blog.csdnimg.cn/img_convert/b239898a02a96016e951d7da9471e9f3.png)






