IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> unity-tolua之释放引用实测 -> 正文阅读

[游戏开发]unity-tolua之释放引用实测


title: unity-tolua之释放引用实测
categories: Unity3d
tags: [unity, tolua]
date: 2021-12-11 17:08:58
comments: false
mathjax: true
toc: true

unity-tolua之释放引用实测, 主要是验证是否能够解开 lua 与 csharp 之间的引用, 进而被对应 gc 回收.


前篇

目的是测试 csharp 中的 lua 相关导出变量在不 Dispose 的情况下是否会解引用, 进而被 gc.


相关测试代码

  • csharp

    public class CDog : MonoBehaviour {
        public LuaFunction luaCellCreateFn;
        
        void OnDestroy() {
            if (luaCellCreateFn != null) {
                luaCellCreateFn.Dispose(); // 主要是测试 Dispose
                luaCellCreateFn = null;
            }
        }
    }
    
  • lua

    -- 类定义
    local CGm = class()
    CGm.__name = "CGm"
    
    function CGm.Init(self)
    end
    
    return CGm
    
    
    -- lua 对象被回收会调用这个函数, obj 是实例对象, 这个代码就不贴那么细了
    function _luaObjGc(obj)
        local type_id = obj.__name
    	if type_id then
    		gLog("--- _luaObjGc, name: {0}", type_id)
    	end
    end
    
    --- 测试逻辑
    function _test()
        local testIns = require("gm"):New() -- 创建 CGm 实例
    
    	local dog = GameMgr.Ins:AddComponent("CDog")
        dog.luaCellCreateFn = function() -- 绑定 lua 方法到 csharp 中
            testIns:Init() -- 引用住 testIns
        end
    end
    
    
    
    

确定实例对象及方法都是引用住的

  1. 执行 _test 方法, 会往 go 上挂一个 CDog 实例组件, 同时 绑定了 luaCellCreateFn 方法, luaCellCreateFn 方法右引用住了 testIns 实例

  2. 触发 lua gc 几次

    没有发现 testIns 实例被回收的日志, 这是正确的, 因为被引用住了


不 Dispose LuaFunction

  1. 注释掉 csharp 中 CDogOnDestroy 方法中的 luaCellCreateFn.Dispose(); 代码

  2. 在 lua 中销毁 dog 实例

    GameObject.Destroy(dog)
    
  3. 触发 lua gc 几次 (不要太多次, 不要触发到 csharp 的 gc)

    发现了其他 lua 实例被回收的日志, 但没有发现 testIns 实例被回收的日志

  4. 触发 csharp gc 几次 再触发 lua gc 几次

    发现 testIns 实例被回收的日志

    原因是因为 csharp 中 CDog 实例被 gc 后, 才会调用到 tolua 框架的 析构函数 进行解引用, 解引用完后绑定到 luaCellCreateFn 的 lua 方法才被释放, 然后进一步回收 testIns 实例


主动 Dispose LuaFunction

  1. 打开 csharp 中 CDogOnDestroy 方法中的 luaCellCreateFn.Dispose(); 代码

  2. 在 lua 中销毁 dog 实例

    GameObject.Destroy(dog)
    
  3. 触发 lua gc 几次

    发现 testIns 实例被回收的日志, 而且还在其他 lua 实例被回收之前

    原因是因为 CDogOnDestroy 方法中的 luaCellCreateFn.Dispose(); 代码, 主动解开了 lua 中绑定的 luaCellCreateFn 方法引用, 然 lua gc 时就可以立马释放 luaCellCreateFn 方法 及 testIns 实例


结论

在 csharp 中不主动 Dispose lua 方法/table 都是没问题的, 只是被回收的时间会比较长

如果主动 Dispose, 就能及时回收 lua 实例.

by the way, 养成良好习惯, 在不使用时都主动置空 (lua 置为 nil, csharp 置为 null)


  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-12-13 13:11:29  更:2021-12-13 13:12:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 20:35:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码