• [Unity热更新]LuaFramework11.ObjectTranslator


    参考链接:

    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定义:

  • 相关阅读:
    理解jquery的$.extend()、$.fn和$.fn.extend()
    前端跨域请求原理及实践
    [leetcode]Minimum Path Sum
    [leetcode]Jump Game II
    [leetcode]Merge Intervals
    [leetcode]Length of Last Word
    [leetcode]Unique Paths
    [leetcode]Text Justification
    [leetcode]Binary Tree Level Order Traversal
    [leetcode]Jump Game
  • 原文地址:https://www.cnblogs.com/lyh916/p/12247092.html
Copyright © 2020-2023  润新知