ToLua&Unity-内存管理(Userdata和Delegate的GC方案)

ToLua

  • 1,lua正常销毁gameObject
    ObjectTranslator的数据容器管理GameObject.
    lua 创建GameObect时,添加到容器里。
    销毁时,Delay销毁(解除绑定)

  • 2,C#销毁gameObject,lua的处理
    如果C#销毁了GameObject,Lua的LuaObjectPool会解绑null的引用。(LateUpdate里 StepCollect)

C#

  • 场景加载完成,调用 C#和Lua的GC回收。

目前推荐做法

  • 问题:
    1,Unity销毁gameObject,tolua的ObjectTranslator.objects会持有。(内存泄漏)
    2,userData创建比较耗。

  • 处理:
    1,C#用创建和管理gameObject,和Lua使用Int类型来交互。 避免Lua创建gameObject带来的消耗,和内存管理难题。
    2,如果通过wrap 创建go,必须调用wrap的Destroy。且lua变量=nil
    3,Delegate和1同理,都是使用Int等基础类型交互(或者List

干货

  • tolua 中有一些关键点:
    C# 给Lua用的对象为了保持它的存活tolua使用了一个 **ObjectTranslator **来为它们建立引用以保障不被垃圾回收. Lua 给C#中使用回调函数之类会集中在 funcRefMap / delegateMap 中.以保持引用数据不被Lua回收

那么只要这些地方的引用计数在维护过程中出现问题就会导致内存资源被持续持有

  • lua profiler
    插件 LuaMemorySnapshotDump.

干货
https://blog.csdn.net/Game_jqd/article/details/64480614?utm_source=blogxgwz3

原文地址:https://www.cnblogs.com/Jaysonhome/p/13798439.html