Contents
  1. 1. 简介
  2. 2. 安装
  3. 3. 问题
  4. 4. 应用
  5. 5. 深入
  6. 6. 总结

项目链接:lua_tinker

简介

现在做项目开发很流行多语言搭配进行开发,组合各种语言的优势可以给项目带来数之不尽的好处。

比如,在游戏行业山口山带来了一波Lua热,后来几年国内赶时髦也越来越多采用C++结合Lua脚本的方式进行游戏开发。

游戏开发过程中引入像Lua这样的脚本语言有很多好处,比如安全、易上手、开发效率高、支持热更新、支持动态编译、数据即代码等等等…

Lua提供了完善的C接口,利用这套接口程序猿们可以很容易对自己的C/C++项目添加脚本扩展。

话虽如此,但每个人若想用上Lua都非得通读各种中英文文档,理解各种概念才能做出功能相对齐全的脚本库的话,未免还是折腾人了点。所以无产阶级革命的资本还是要依靠群众的力量——用第三方库吧。

为C++寻找Lua脚本库时会发现好几种选择,比如luaplus、tolua++、luabind之类的,而我自己呆的项目,用的又是另外一套“自己”的(十分复杂的)脚本库。

今天推荐另外一种:lua_tinker

虽然其它几种我也没拿来看过不好进行比较,但结合我自己过去尝试封装lua C接口的经验来看,这款脚本库(lua_tinker)的特点还是相当明显——2个文件搞定一切。

你以为是2个很大的文件?

…其实是有点大,不过要是考虑到它所支持的各种强悍的功能,就会明白其实一点都不大(实际上每个文件也只有几百行,而且不依赖除了lua之外任何第三方库)。

所以就算没有用过其他脚本库,也会明白,这绝对是超级轻量级的实现。

这是在去年找脚本库时无意中发现的,发现虽然不出名,但还是有人对它赞誉有佳,还打算用到自己的项目中去。

不过通过能够找到的资料以及其github活跃读来看,真要拿来用的话最好还是自己有一定把握解决可能出现的任何问题时再考虑(因为看上去像作者随手写完提交一次就不管它了)。而且唯一的“官方”文档只有6个sample而已,索性代码不多,我们可以自己看。

另外,个人觉得这个脚本库封装的相当漂亮,产生大量好感。对我来说大概学习价值大于使用价值,不过鉴于其高质量的实现,我也十分愿意在它的基础上对功能进行扩展。

安装

1、从上面的链接下载代码到本地

git clone https://github.com/zupet/LuaTinker.git ./

2、下载lua源码包或者根据环境找到已经编译的lib制成品
http://sourceforge.net/projects/luabinaries/files/

3、建立空项目把LuaTinker目录下的lua_tinker.h和lua_tinker.cpp加入到项目中,配置lua库路径。

4、测试demo

问题

安装lua的时候我习惯性的找了lua的最新版(5.2.3),配置环境的时候发现lua_tinker编译不过。

查了资料知道是lua 5.1和5.2版本做了些调整导致原有项目中用到的一些接口失效了,问题主要出现在C++向Lua注册全局变量的地方,找了些资料改了下,终于可以正常跑,具体修改方法先不展开。

应用

lua_tinker支持所有基本交互功能,下面简单罗列下基本用法:

// 注册全局函数
lua_tinker::def(L, "cpp_add", cpp_add); // 虚拟机handle | Lua中的函数名 | C++中函数指针

// 注册全局变量
lua_tinker::set(L, "cpp_global_var", &g_dc);

// 获取全局变量
int state = lua_tinker::get<int>(L, "global_state");

// 执行lua文件
lua_tinker::dofile(L, "../ScriptTest/script/main.lua");

// 调用lua函数
int res = lua_tinker::call<int>(L, "startup");

// 注册C++类
lua_tinker::class_add<Base>(L, "Base");

// 注册类方法
lua_tinker::class_def<Base>(L, "xoo", &Base::xoo);

// 注册构造函数
lua_tinker::class_con<Derived>(L, lua_tinker::constructor<Derived, int>);

// 注册类成员
lua_tinker::class_mem<Derived>(L, "str", &Derived::str); 

// 注册类继承关系
lua_tinker::class_inh<Derived, Base>(L);

用这些已经可以搞定大部分需求了。

深入

我原来的项目还支持其它一些“高级特性”,比如注册enum、内嵌调试器之类的,不过实际上主要是封装的更高级一点而已,这个根据项目需求来考虑要不要。

调试器和一些内存监控的功能,有的话用起来可能用起来更加方便,不过这些东西貌似都有其他第三方工具提供了,自己写必要性也不是很大。

除了把它拿来开发用需求驱动式的去完善脚本库功能之外,也可以考虑多看看lua C API,看看会不会有启发能够拿来做一些“犀利”的工具,再就是多关注关注Lua版本更新内容吧,可能随时要做些调整。

总结

暂时还没有拿来深入的用过,以今天写了半天的demo以及“升级lua版本”的感受来看,感觉lua_tinker可塑性还蛮强的,基本的template工具写了不少,后续扩展的时候都可以考虑拿来用。

但是最重要的——我觉得它对我的学习价值更大一点,可以顺着它的封装清晰的看到各个功能的实现机制,对于想了解C/Lua交互层的人来说是个不错的媒介。


测试写的代码已提交到:https://github.com/ooomceg/examples/tree/master/ScriptTest

Contents
  1. 1. 简介
  2. 2. 安装
  3. 3. 问题
  4. 4. 应用
  5. 5. 深入
  6. 6. 总结