zoukankan      html  css  js  c++  java
  • [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定义:

  • 相关阅读:
    LIPS的历史
    语法分析生成器 LEX
    Effective JAVA 中有关Exception的几条建议
    Code Reading chap10
    Code Reading chap8
    Code Reading chap7
    Code Reading chap11
    Code Reading chap9
    软件设计中的抽象层次
    Invalid bound statement (not found) @Update注解写的怎么还报错!
  • 原文地址:https://www.cnblogs.com/lyh916/p/12247092.html
Copyright © 2011-2022 走看看