C#删掉了发给lua的对象造成lua实际的Obj无效,解决办法

本文探讨了C#与Lua交互时,对象生命周期管理的问题,特别是C#主动销毁对象并释放垃圾回收(GC)时,Lua如何正确处理引用问题。提供了两种解决方案:一是使用tolua.isnull进行内存验证,二是逻辑层引入对象管理池。

C# 这边 new 了一个GameObject 对象并发给Lua那边, 这时C# 这边在通过GC释放掉这个对象;lua 那边会报错;遇到这种问题的两种方式 解决方案:

1.lua一个 sprite对象如果被引擎释放了,那引用它的变量怎么不是nil
    每一个lua引用的GameObject都有独立的 引用索引,当 lua的 对象的生命周期结束, 调用 原方法 _gc,会减去 一个引用计数,当这个引用计数为0 的时候会 remove 掉 c# 对象池里面的对象,然后如果这个c# 就没有了lua的引用,而如果也失去了 c#的引用,就会触发 c# 的GC,C#端主动Destroy的GameObject不会索引到lua这边来释放lua部分的“代理”内存,2边的gc各自管理自己的内存.
   

 tolua有个tolua.isnull专门来判断这个情况,tolua.isnull则是绕过proxy数据,查看源数据是否为空


    tolua的方案是,lua并不会尝试跨语言去管理C#的内存,他只是简单的“钉住”C#的某一个内存,自己gc完毕后,释放对某段C#内存的引用,至于释放掉引用的C#内存啥时候真正释放,lua不关心,C#gc的事情。
  总得来说:如果遇到C#那边主动Destory并释放GC的话,lua那边在用这个对象时,主动做一下isnull 的验证;验证对象内存是否被销毁

2.逻辑层去处理,用对象管理池,所有创建C#对象都通过管理器去创建,在创建对象时区分由哪边创建的;删除时,必须由创建时的那边去做destroy操作。如果在写逻辑时Lua把对象传给了C#,那么lua在调用Destroy时,必须先要确保C#的指向Clear。反之C#把对象传给Lua 也一样


————————————————
版权声明:本文为优快云博主「taohuagege1」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/taohuagege1/article/details/78978146

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值