lyh916

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

参考链接:

https://www.cnblogs.com/ghl_carmack/p/6720500.html

https://zhuanlan.zhihu.com/p/41113505?edition=yidianzixun&utm_source=yidianzixun&yidian_docid=0JhF3poZ&yidian_s=&yidian_appid=

https://www.jianshu.com/p/3c853b6bf980

 

一.LuaObjectPool.cs(主要用于分配id)

1.PoolNode,存放id和对应的c#对象

2.int Add(object obj),保存c#对象并返回对应的id

3.object Remove(int pos),移除指定id对应的c#对象

4.复用性:

----------------------------初始化后

0-null(head),1-null

----------------------------Add2个节点(objA和objB)后

0-null(head),1-null,2-objA,3-objB

----------------------------Remove节点2(objA)后

2-null(head),1-null,0-null,3-objB

----------------------------Add1个节点(objC)后

0-null(head),1-null,0-objC,3-objB

----------------------------Remove节点2(objC)后

2-null(head),1-null,0-null,3-objB

----------------------------Add1个节点(objD)后

0-null(head),1-null,0-objD,3-objB

 

二.ObjectTranslator.cs(主要用于管理lua访问过的c#对象)

1.objectsBackMap,key为c#对象,value为id

 

三.c#到lua(以UnityEngine_TransformWrap.cs中的Find为例)

1.ToLua.Push(L, o),将找到的Transform进栈

2.如果之前objectsBackMap有缓存过该对象,则将该对象对应的id包装成userdata,并设置元表(Transform),进栈

3.否则,LuaObjectPool和ObjectTranslator会缓存该对象,再执行第2步后面的操作

 

四.lua到c#(以UnityEngine_TransformWrap.cs中的Find为例)

1.ToLua.CheckObject<UnityEngine.Transform>(L, 1),将userdata(即id)转换为c#对象

2.从栈中取出id后,转换为c#对象

 

五.c#对象的释放

lua层拿到的是一个int形式的userdata,由于lua对c#对象的引用,导致c#的gc机制无法释放掉对应的内存对象

对于lua层拿到的对象,会重写其__gc方法,当lua的gc执行时,会调用这个方法,从而释放掉ObjectTranslator这层缓存的c#对象

因此对于那些在lua层被访问过的对象,在不调用lua gc的情况下会一直驻留在ObjectTranslator这层

Collect定义:

RemoveObject定义:

posted on 2020-01-31 22:44  艰苦奋斗中  阅读(830)  评论(0编辑  收藏  举报