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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM