关于script:Lua代码内存泄漏的疑惑

46次阅读

共计 2221 个字符,预计需要花费 6 分钟才能阅读完成。

1)Lua 代码内存透露的纳闷
​2)一个 Lua 反复加载后造成的泄露问题
3)对于 Addressable 中计数的纳闷
4)合并 Mesh 的插件举荐


这是第 265 篇 UWA 技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫 10 分钟,认真读完必有播种。

UWA 问答社区:answer.uwa4d.com
UWA QQ 群 2:793972859(原群已满员)

Script

Q:Lua Profiler 提醒调用红框中函数,每次都会减少大略 0.23KB 的内存,且随工夫始终减少,求教一下,这个是因为闭包函数中用了局部变量 i,部分 table a 导致的吗?

A:是局部变量 table a 的内存在减少。至于是否泄露:因为局部变量返回的时候被援用了,如果卸载正当,每次 GC 是会革除的,不会造成泄露。对代码的倡议是:如果数据是雷同的,倡议做一个池子复用,不要每次生成。这样会造成堆内存升高导致触发 GC,造成大量耗时。另外,闭包的创立也会减少内存。

感激小 ben@UWA 问答社区提供了答复

Script

Q:当初的被动技是 Lua 写的,所以每场战斗会 Reload,然而又没有调用 package.loaded[‘xxx’] = nil 来强制开释,目前用的 Tolua,不晓得会不会主动开释?

A:package.loaded 其实是 Lua 外部保护的一个 Table。Require 的时候都会优先从 package.loaded 中查问一下,如果查问胜利,会间接返回 package.loaded[“Name”],

如果须要开释,必须手动 package.loaded[‘xxx’] = nil。

感激萧小俊 @UWA 问答社区提供了答复

Addressable

Q:试用一下 Addressables,看了看调试窗口,发现 Instantiation Counts 这里的值只有调用过一次 Addressables.InstantiateAsync 后就始终为 1,依据文档的形容是这里是每帧 Addressables.InstantiateAsync 的调用次数,难道真的是每帧都在调用?还是说是 Unity 的显示有错?

Addressables 版本 1.16.19,Unity 版本 2020.3.14f1,测试代码如下:

public AssetReference Prefab;
List<GameObject> ActiveObjs;

 private void Update()    {if (Input.GetMouseButtonDown(0)) {if (Camera.main.GetMouseInputCastPoint(Input.mousePosition, out var point)) {// 这里是本人扩大的
                Prefab.InstantiateAsync(point,Quaternion.identity).Completed += (op)=> {ActiveObjs.Add(op.Result);
                };
            }            
        }
    }

  void ReleaseInstance() {foreach (var item in ActiveObjs){Prefab.AssetReference.ReleaseInstance(item);
        }
        ActiveObjs.Clear();}

A:这个并不是每帧调用的数据,这个面板外面统计的是“驻留”的 Operation 以及被援用的次数,能够帮忙查看哪些该被卸载的 Bundle 然而却还在内存中。

感激 Xuan@UWA 问答社区提供了答复

Mesh

Q:在没有美术的前提下,Unity 程序想要合并 Mesh,求举荐好用的插件,我晓得的有 MeshBaker,有没有其它的举荐?

A1:举荐应用 SimpleLod,不过这个咱们没用只是测试过,次要还是 MeshBaker。

感激萧小俊 @UWA 问答社区提供了答复

A2:首先,StaticBatchingUtility.Combine 这个办法归根结底是一个手动动态批处理的操作,它的直观作用是通过动态批处理升高 DrawCall。尽管它能够合成 Mesh,然而这个 Mesh 我的确拿不到(如果谁能够拿到请不吝赐教)。

而后回归该问题,其实需要只是一个功能性而并非优化性的问题,只有把几个 Mesh 拼接进一个物体就能够了,那么 CombineInstance 就和这个需要很对口。

代码如下:

该办法的益处就是能够把须要合并的物体的材质信息也蕴含进来,成果如下:

合并完了之后能够通过 AssetDatabase.CreateAsset 保留该 Mesh:

感激翟孟飞 @UWA 问答社区提供了答复

20210830
更多精彩问题等你答复~

1.Vulkan API 的性能及兼容性
2.Unity TMP 字体计划如何抉择
3. 如何实现 AAB 包的增量更新

封面图来源于:Miku-LuaProfiler
xLua 的性能分析器组件,同时反对 XLua、SLua、ToLua。直观地显示 Lua 的 GC 和耗时、调用次数等。


明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在 UWA 问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官网技术博客:blog.uwa4d.com
官网问答社区:answer.uwa4d.com
UWA 学堂:edu.uwa4d.com
官网技术 QQ 群:793972859(原群已满员)

正文完
 0