tolua++实现分析

游戏服务器之第三方库tolua++的使用 tolua++ 是使用lua与c++交互的第三方库。可以跨windows和linux平台的。 使用步骤: 1、把tolua++.exe(在tolua++-1.0.93.rar中) 添加到环境变量path中(或者把tolua++.exe、lua5.1.dll放到当前目录) 2、复制头文件到文件夹pack(若新加头文件,否则就直接修改对应pkg文件) 3、把头文件拓展名改为pkg 4 阅读详情


项目正在使用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特定的东西。

原文地址:http://blog.youkuaiyun.com/wtyqm/article/details/8977975

lua学习03:tolua的编译和使用:C/C++调用lua、lua调用C++、lua调用tolua、常用tolua和lua的API介绍 文章目录一、编译及使用流程1)编译lua静态库2)编译tolua++静态库3)编译tolua++.exe4)根据C/C++文件编写好对应的pkg文件,然后根据一创命令生成tolua(1)C文件举例(2)C++文件举例二、C++调用lua三、lua调用C++ 一、编译及使用流程 1)编译lua静态库 必须先下载lua 1.5,下载好后,把/src目录的除开lua.c,luac.c的文件全部放到一个新建的静态链接库的工程项目里,然后编译出一个静态链接库lua.lib。 2)编译tolua++静态库 去tolua 阅读详情

相关推荐

tolua++ 编译 及使用 简单介绍

tolua++ 编译 及使用 简单介绍 tolua++ 是用来把 C++代码 生成 在Lua中使用的接口的工具,编译步骤比较繁琐。

tolua++简介

 2005年12月27日23:07:59一.tolua++简介      tolua++是一种第三方的软件包,可以为Lua提供面向对象的特性,这样我们就可以使用Lua来编写使用C++语言库的脚本文件.二.tolua++的编译.     tolua++的主页在http://www.codenix.com/~tolua/,目前的最新版本是1.0.7,为了使用tolua++,我们需要三个文件

answer的专栏 4万+

Python、Selenium实现问卷星自动填写(内含适配个人问卷的方法)

使用Python、Selenium实现问卷星自动填写,内含适配个人问卷的方法。

DaenCode的博客 3836

【亲测免费】 tolua++ 项目使用教程

tolua++ 项目使用教程 1. 项目介绍 tolua++ 是一个扩展了 toLua 的工具,旨在将 C/C++ 代码与 Lua 语言进行集成。tolua++ 在 toLua 的基础上增加了面向 C++ 的新特性,如类模板等。tolua 是一个强大的工具,能够极大地简化 C/C++ 代码与 Lua 的集成过程。通过解析“清理”后的头文件,tolua 自动生成绑定代码,使得 Lua 能够访问 C/...

gitblog_00524的博客 840

Mac无管理员权限安装NVM全攻略(附国内镜像加速)

本文详细介绍了在Mac电脑无管理员权限的情况下,如何通过Git克隆方式安装Node版本管理工具NVM,并配置国内镜像源以加速下载。攻略涵盖环境检查、安装步骤、Shell环境变量配置、镜像加速设置以及常用命令和常见问题解决方案,帮助开发者绕过权限限制,高效管理Node.js版本。

weixin_29296241的博客 489

ESP32-CAM与Thonny的完美搭配:从烧录到通信的完整流程

本文详细介绍了如何将ESP32-CAM与Thonny IDE完美结合,从固件烧录到通信测试的完整流程。通过硬件连接、MicroPython固件烧录、Thonny环境配置以及摄像头功能开发等步骤,帮助开发者快速搭建高效的物联网开发环境,实现图像采集与无线通信功能。

tomato的博客 1122

tolua++实现lua层调用c++技术分析

tolua++啥玩意,谁看得懂 链接: link 前言 一直都使用 cocos2dx + lua 进行游戏开发,用 Lua 开发可以专注于游戏逻辑的实现,另外一方面可以实现热更新;而且 lua 是一个轻量级的脚本语言,库小但是功能齐全,所以在业内非常受欢迎。之前看了网上很多关于 c/c++ 如何与 lua 互调的讲解,也查看了 lua 官网的 lua api 和 c api,感觉大有收获。最近这一段时间研究了 tolua++ 里面 lua 层调用 c/c++ 的技术实现,准备记录一下学习心得,这样可以让自己

JZQNIBASILE的博客 554

VMware 17+Win10 22H2全栈配置指南|UEFI优化+GPU直通实战

​VMware下载:下载官网版本的Wmare 17 Pro (点击直达链接 )企业用户可选永久许可证,个人学习也可以直接安装使用,Win10镜像:微软官网下载22H2版ISO文件(附官方纯净版渠道 )

waicsdn_haha的博客 4019

Tolua++ 实现分析

tolua++ 是一个将 C/C++ 的函数和对象导出给 Lua 脚本使用的工具。 使用这个工具的基本步骤: 将要导出的 C/C++ 函数和对象定义写入 .pkg 文件;运行 tolua++ 工具,将 .pkg 文件编译为目标 .cpp 文件;将目标 .cpp 文件加入项目,在启用 Lua 虚拟机后调用目标文件中的 open() 函数注册导出的内容。 ~ tolua++ 工

luyafei_89430的专栏 1160

从建模到调参:基于Simulink的两轮差速机器人轨迹跟踪PID控制全流程解析

本文详细解析了基于Simulink的两轮差速机器人轨迹跟踪PID控制全流程。从运动学建模入手,对比了基于距离与基于位置偏差的两种控制策略,并重点阐述了高精度轨迹跟踪的控制器设计、Simulink仿真搭建及PID参数整定方法,为移动机器人运动控制提供了完整的仿真实践指南。

weixin_29169505的博客 312

codex出现Reconnecting和stream disconnected before completion:stream closed before response.complete解决方案

本文主要介绍了在使用codex过程中出现Reconnecting和stream disconnected before completion: stream closed before response.completed的解决方案,希望能对使用codex的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 9万+

tolua++实现分析 【转】

原文地址:http://blog.youkuaiyun.com/wtyqm/article/details/8977975   项目正在使用cocos2dx的lua绑定,绑定的方式是tolua++。对大规模使用lua代码信心不是很足,花了一些时间阅读tolua++的代码,希望对绑定实现的了解,有助于项目对lua代码的把控。从阅读结果上来看,起码在内存管理上,帮助还是很大的。 1.tolua++如

sharemyfree的专栏 813

倍福--手动加入第三方伺服的配置

客户在没有硬件情况下,希望手动配置硬件,添加第三方驱动器,本文介绍其操作流程 目 录 软硬件版本 3 1.1. 倍福Beckhoff 3 1.1.1. 控制器硬件 3 1.1.2. 控制软件 3 操作步骤 3 2.1. 添加电机XML文件 3 2.2. 创建EtherCAT 3 2.3. 添加新建项 3 2.4. 选择型号 4 2.5. 关联NC轴 5 软硬件版本 1.1. 倍福Beckhoff 1.1.1. 控制器硬件 TwinCAT控制制器,PC或者EPC,包括: 嵌入式控制器:CX5020-

weixin_41883890的博客 5325

lua: tolua++实现分析

项目正在使用cocos2dx的lua绑定,绑定的方式是tolua++。对大规模使用lua代码信心不是很足,花了一些时间阅读tolua++的代码,希望对绑定实现的了解,有助于项目对lua代码的把控。从阅读结果上来看,起码在内存管理上,帮助还是很大的。 1.tolua++如何将c++对象导入到lua里 tolua++为每一个传入lua的对象建立一个userdata,userdata的值

小天 专栏 3060

华为OD机试双机位C卷-FLASH坏块监测系统(Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【FLASH坏块监测系统】,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - FLASH坏块监测系统。

qq_45776114的博客 1928

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: 骨骼动画原理及简单实现
下一篇: cocos2dx的lua绑定
cbbbc
博客等级 码龄15年 609粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值