• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

unity lua C# 这边 new 了一个GameObject 对象并发给Lua那边, 这时C# 这边在通过GC释 ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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 也一样


以上属于个人观点,如果理解有误,欢迎留言讨论.....大家共同进步



鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
lua与c之间交互详解(三)发布时间:2022-07-22
下一篇:
lua中文教程(第二章 类型和值)发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap