项目正在使用cocos2dx的lua绑定,绑定的方式是tolua++。对大规模使用lua代码信心不是很足,花了一些时间阅读tolua++的代码,希望对绑定实现的了解,有助于项目对lua代码的把控。从阅读结果上来看,起码在内存管理上,帮助还是很大的。

1.tolua++如何将c++对象导入到lua里

tolua++为每一个传入lua的对象建立一个userdata,userdata的值,是c++对象的地址。userdata的metatable,是一个tolua++建立的,记录了userdata对应c++类型信息的表格,包括导出的成员变量、成员函数等信息。

对于成员变量的读取赋值,tolua++是在metatable里新建了.get和.set两个表。两个表里分别存储了以变量名为键,以读取设置c函数为值的表项。在metatable的__index和__newindex里,以变量名为键,从.get和.set表里取得读取设置函数并调用。

对于成员函数的调用,只需要以函数名为键,函数为值,存储在metatable里就好了。

传入c++对象的tolua++函数是tolua_pushusertype。一般情况下,第一次使用这个函数将一个c++对象push到lua堆栈上时,才会新建userdata。tolua++会以c++对象地址为键,userdata为值,将键值对存储在tolua_ubox表里。下次推入同样的c++对象时,从这个表里取出userdata推入堆栈即可。

—————————————————

2.tolua++如何处理类型的继承

父类的metatable,是子类metatable的metatable。这样调用父类方法时,就会去父类的metatable里查找了。

tolua++还维护了一个tolua_super表,这个表以c++类型的metatable为键,以一个表格为值。这个值表格以类型名称为键,以true为值,记录了metatable对应c++类型的父类有哪些。这个表格可以用来帮助判断对象是否是某一个类型(子类实例也可以认为是父类类型)

—————————————————

3.tolua++如何管理对象的生命周期

一般情况下,当lua里对c++对象的引用变量可以被垃圾回收时,tolua++只是简单的释放userdata占用的4字节指针地址内存。但是也可以通过绑定或者代码指定的方式,让tolua++真正释放对象所占内存。

绑定的方式,是指在将c++类型构造函数使用tolua++导出到lua里时,tolua++会自动生成new_local方法。如果在lua代码里,用这个方法新建对象时,tolua++会调用tolua_register_gc方法,指明回收对象时回收对象内存。

在c++代码里,使用tolua_pushusertype_and_takeownership;在lua代码里,使用tolua.takeownership,都可以达到同样的目的。

对于这些指定由tolua++回收内存的对象,如果其类型的析构函数也通过tolua++导出了,则在回收内存时,会通过delete运算符,调用对象的析构函数。否则只会使用free方法回收。

tolua_register_gc方法,做的事情,是以对象指针为键,以对象metatable为值,将键值对存储在tolua_gc表里。在对象类型的metatable表的__gc方法里,tolua++会检查tolua_gc表是否包含以这个地址为键的表项。包含的话才会进行上述的内存回收工作。

4.其它

有的时候,在lua里取得一个c++对象后,我们想赋给它一些只在lua环境下有意义的属性。或者,我们想在lua里扩展一个c++类。tolua++也提供了实现这种需求的机制。

tolua++在LUA_REGISTRY里维护了一张tolua_peers表。这张表以表示c++对象的userdata为键,以一张表格t为值。t里面就记录了这个对象在lua里扩展的属性。

cocos2dx并没有完全使用tolua++的方式,而是自己进行了一些修正。下篇博客应该会记录修正的原因和方式,并介绍一些cocos2dx lua bind特定的东西。

tolua++实现分析相关推荐

  1. (原创)cocos2dx-lua TableView官方demo分析

    本来是想看看网上的教程文章,结果看了好几篇,复制代码各种报错,有很多不存在的类和变量,根本用不了. 所以干脆自己去看官方demo,经过自己分析测试,已经大概会用了,顺便记录一下. 以下是代码,复制粘贴 ...

  2. tolua打包Android后路径出错,unity+tolua 64位android崩溃排查过程记录

    最近项目上线googleplay,需要打64位包,由于unity l2cpp打包比mono慢很多,因此前期开发过程中都是用的mono打的32位包进行测试.结果64位包出来后发生各种莫名其妙的卡死,尤其 ...

  3. ToLua 入门05_AccessingLuaVariables

    Tolua中的变量怎么去使用和赋值,在案例场景ToLua/Examples/04_AccessingLuaVariables中可以去学习:本章我们就分析下具体使用方式,首先先看一下提供的示范代码. u ...

  4. Tolua for Unity3d 编译字节码

    想必折腾过Tolua的都知道, 为了最简化对Lua文件的支持.最优方案就是  把Lua文件 以文件的形式载入.而不是用 AssetBundle 的方式.这样会最优化的使用 Lua本身的一些文件 机制. ...

  5. tolua wrap原理与使用

    一.什么是wrap文件 每个wrap文件都是对一个c#类的包装,在lua中,通过对wrap类中的函数调用,间接的对c#实例进行操作. 二.wrap类文件生成和使用的总体流程 三.生成一个wrap文件的 ...

  6. Lua快速入门篇(基础概述)(Yanlz+toLua+xLua)

    <Lua热更新> ##<Lua热更新>发布说明: ++++"Lua热更新"开始了,立钻哥哥终于开始此部分的探索了. ++++作为游戏发布迭代的重要技术:Lu ...

  7. Unity中SLua、Tolua、XLua和ILRuntime效率评测

    Unity脚本效率评测 对SLua.Tolua.XLua和ILRuntime四个脚本插件进行效率测试,对框架脚本进行选型. 本文项目:https://github.com/cateatcatx/Uni ...

  8. 三国杀(1):VS2017 C/C++ lua tolua++ 编译 集成,及使用介绍

    tolua++ 是用来把 C++代码 生成 在Lua中使用的接口的工具,编译步骤比较繁琐. 使用tolua有以下步骤: 工程建立 编写c/c++文件. 编写.pkg文件,填写需要导出的c/c++接口. ...

  9. 记一次《龙之谷》手游代码分析

    目录 <龙之谷>手游挺垃圾的代码 首先,工具乱糟糟 其次,用的Unity4.6~4.7的版本 另外,发现使用了slua ulua + tolua的组合 其他,后面补充 主要场景渲染效果如下 ...

最新文章

  1. DynamicPropertyAccessor Expression lambda
  2. SSM整合Shiro 身份验证及密码加密简单实现
  3. 【Flutter】Flutter 拍照示例 ( 浮动按钮及点击事件 | 底部显示按钮组件 | 手势检测器组件 | 拍照并获取当前拍摄照片 | 从相册中选择图片 )
  4. Matlab GUI 设计(3):edit、slider、table数据同步
  5. Effective C# Item23:避免返回内部类对象的引用
  6. html检查链接正确代码,Groovy脚本检查html坏链接
  7. Android Notification总结
  8. 发那科pmc地址分配_一台全新的FANUC数控机床,请简述有挡块回参功能的实现步骤?包括PMC的I/O分配、具体参数设定、梯形图程序...
  9. linux远程拷贝免手动输入密码,scp远程拷贝避免输入密码
  10. 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画
  11. ceil() 与 floor() 与 round()
  12. 增长量计算n+1原则_何俊-资料分析中的增长量计算
  13. MySQL软件下载安装配置——详细教程
  14. CwRsync实现文件同步(windows或linux服务器通用)
  15. 计算机按电源键无法反应,笔记本无法正常开机,按下电源键无任何反应要过一段时间才可以开机...
  16. workbench设置单元坐标系_浅谈Ansys中的几种坐标系
  17. Unity Shader(一) Lowpoly动态低多边形 (QQ登录界面低边动画)
  18. 在一家地产公司搞销售
  19. spry提示信息设置html,CSS教程:12.4 借助于Spry实现折叠面板
  20. HTML中label标签的用途

热门文章

  1. dax和m的区别_DAX:一文透彻理解DAX本质
  2. 谦卑的程序员(The Humble Programmer) by E.W.Dijkstra,1972
  3. 一文掌握Pandas可视化图表
  4. Latex添加中文支持和A4纸张设置
  5. 2021深圳观澜中学高考成绩查询入口,2019深圳龙华中学、观澜中学、龙华高级中学录取分数线及高考成绩喜报...
  6. python字典统计排序1_数据分析1_入门Python
  7. java file 的length_java里怎么知道一个file的大小?
  8. C# 自动转换为半角 (输入法半角/全角切换) 转载
  9. 霍学文:大数据重塑未来金融监管方式
  10. (4)Dojo学习之动画学习