选lua而非python因启动快、内存低、c接口干净,无隐式线程/环境初始化;python易卡主线程、污染状态,常见importerror与segmentation fault。

为什么选 Lua 而不是 Python 做游戏脚本引擎
因为 Lua 启动快、内存占用低、C 接口干净,lua_State* 就是唯一上下文,嵌入时不会偷偷拉起解释器线程或初始化全局环境。Python 的 Py_Initialize 会读系统路径、加载 site.py、触发 GC 初始化——在热更新频繁或沙箱隔离要求高的游戏里,容易卡主线程或污染宿主状态。
常见错误现象:ImportError: No module named 'encodings'(Python 找不到标准库路径)、Segmentation fault(多线程调用 PyEval_AcquireLock 不匹配)。
- Unity / UE 插件、自研引擎普遍选 Lua(如
sol2、tolua++) - Python 更适合工具链(编辑器插件、资源打包脚本),而非运行时逻辑
- 若硬要用 Python,必须静态链接、禁用
site、用Py_SetPythonHome锁死路径
用 sol2 绑定 C++ 类到 Lua 的最小可行步骤
sol2 是目前最省心的 Lua C++ 绑定库,不依赖宏、支持现代 C++17,且错误提示比原生 API 友好得多。
关键点:类绑定不是“导出所有函数”,而是明确控制哪些成员可被 Lua 访问、是否允许继承、如何处理 const 与引用。
- 头文件只 include
sol/sol.hpp,无需预编译 Lua 库(sol2 内置轻量封装) - 绑定前确保类有默认构造函数,或显式提供
sol::constructors() - 成员函数用
.function("name", &Class::method);属性用.property("name", &Class::get, &Class::set) - 避免绑定裸指针返回值(如
Texture*),改用std::shared_ptr或 sol2 的sol::object包装
示例:
sol::state lua;
lua.open_libraries();
lua.new_usertype<player>("Player",
sol::constructors<:string>(),
"name", &Player::name,
"move", &Player::move
);
</:string></player>
从 Lua 调用 C++ 函数时参数类型怎么对齐
sol2 默认做隐式转换(int ←→ double ←→ string),但容易掩盖类型错误。比如 C++ 函数要 const std::string&,Lua 传数字就会静默转成 "123",而不是报错。
性能影响:字符串反复构造、vector 复制、临时对象生成,尤其在每帧调用的函数里会放大开销。
- 强制类型检查:加
sol::default_pass_function_object并配合sol::check_arguments编译期校验 - 避免
std::vector<t></t>直接传参,改用sol::as_table_t<:vector>></:vector>显式声明表结构 - 回调函数用
std::function<void></void>绑定时,Lua 侧必须传 function,不能传 nil 或 string - 枚举类型需手动注册为
sol::enum_,否则 Lua 拿到的是整数,无意义
热重载 Lua 脚本时最容易崩的三个地方
不是语法错误导致崩溃,而是资源生命周期错位:C++ 对象还在,Lua 已删掉对应 userdata;或者新脚本 reload 后,旧函数闭包还持有已释放的 this 指针。
典型错误现象:attempt to call a nil value(函数被覆盖但引用未更新)、invalid 'this'(析构后仍被 Lua 回调)。
- 禁止在
luaL_dofile或sol::state::script_file后直接复用旧sol::function对象,每次 reload 都要重新获取 - C++ 对象销毁前,必须调用
sol::state::garbage_collect()或确保其 Lua userdata 引用计数归零 - 全局变量(如
GameConfig表)reload 时不会自动清空,要用lua.set("GameConfig", sol::nil)显式重置
真正麻烦的从来不是“怎么 reload”,而是“谁还在引用旧代码”——尤其是事件监听器、定时器回调、协程挂起点这类隐式长生命周期对象。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











