unity热更新json_[Unity 热更新]tolua原理及实践

本文介绍了Unity中tolua的使用,强调其相对于ulua的优势,如效率和稳定性。文章详细阐述了tolua的结构,包括LuaAttribute、LuaBaseRef等关键类的作用,并解释了如何在C#和Lua之间进行交互。还提到了对象翻译、Lua虚拟机的启动和管理,以及tolua的内存管理和垃圾回收机制。最后,给出了使用tolua的示例代码,展示了如何在Unity中启动Lua虚拟机并执行脚本。
摘要由CSDN通过智能技术生成

一、概论

1、tolua相比ulua的优势:

①效率更高。

②更加稳定。

③不支持使用反射,只支持wrap方式。

二、基础

[DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]

其中LUADLL对应的字符串就是tolua,在不同的平台上mono会去加载对应的tolua.dll或者tolua.so等文件并调用对应的函数。

①LuaAttribute.cs

在tolua#生成绑定代码时做一些标示使用。

②LuaBaseRef.cs

Lua中对象对应C#中对象的一个基类,主要作用是有一个reference指向lua里面的对象,引用计数判断两个对象是否相等等。

比如LuaFunction里面的reference是指向lua里面的一个闭包的,而LuaTable的reference是指向lua中的一个table的。

③LuaDll.cs

这个类的主要作用就是实现了C#调用原生代码的功能。

④LuaState.cs

这里面是对真正的lua_State的封装,包括初始化lua路径,加载相应的lua文件,注册我们前面生成的绑定代码以及各种辅助函数。

⑤ObjectTranslator.cs

主要意义就是给lua中对C#对象的交互提供了基础,简单来说就是C#中的对象在传给lua时并不是直接把对象暴露给了lua,而是在这个OjbectTranslator里面注册并返回一个索引(可以理解为windows编程中的句柄),并把这个索引包装成一个userdata传递给lua,并且设置元表。具体可以查看tolua_pushnewudata代码。

弱引用可以让您保持对对象的引用,同时允许GC在必要时释放对象,回收内存。对于那些创建便宜但耗费大量内存的对象,即希望保持该对象,又要在应用程序需要时使用,同时希望GC必要时回收时,可以考虑使用弱引用。

Object obj = new Object();

WeakReference wref = new WeakReference( obj );

obj = null;

第一行代码新建了一个新的对象,这里叫它对象A,obj是对对象A的强引用。接着第二行代码新建了一个弱引用对象,参数就是对象A的强引用,第三行代码释放掉对对象A的强引用。这时如果GC进行回收,对象A就会被回收。

怎样在取得对象A的强引用呢?很简单,请看代码2:

Object obj2 = wref.Target;

if( obj2 != null )

{

// 做你想做的事

}

else

{

// 对象已经被回收,如果要用必须新建一个

}

1、提供Lua-c#值类型、对象类型转化操作交互层。(ObjectTranslator.cs、LuaFunction.cs、LuaTable.cs、ToLua.cs等)。

2、提供Lua虚拟机创建、启动、销毁,Require、DoFile、DoString、Traceback等相关支持。(LuaState.cs、Lu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值