Lua代码内存泄漏的疑惑
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(原群已满员)
原文地址:https://www.cnblogs.com/uwatech/p/15233441.html
- Entity Framework——常见报错总结
- MySQL 主从复制的原理和配置
- Entity Framework——读写分离
- 如何在 MySQL 中判断中文字符?
- Entity Framework——执行sql语句
- 深入浅析PHP7.0新特征(五大新特征)
- 走在专家的路上,每天优化一条SQL
- 用GenePred注释文件进行数据分析
- 走在专家的路上,每天一条SQL优化(2)
- Entity Framework——性能测试
- 谷歌开放的TensorFlow Object Detection API 效果如何?对业界有什么影响?
- 生信编程直播课程优秀学员作业展示1
- ID转换大全
- 走在专家的路上,每天一条SQL优化(3)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 跨域请求的解决方案
- 【排序】快速排序
- 因为BitMap,白白搭进去8台服务器...
- java所有的“锁”大总结,以后面试再也不怕遇到锁了
- 【Java8新特性】03 Stream流式数据处理
- 慎用JSON.stringify
- 【Java8新特性】04 详解Lambda表达式中Predicate Function Consumer Supplier函数式接口
- ubuntu下的进程控制系统————Supervisor
- 如何高效、快速、准确地完成ML任务,这4个AutoML库了解一下
- [译]如何用 Typescript 写一个完整的 Vue 应用程序
- Docker上手系列:Docker入门hello world
- 前端应该知道的 HTTP 知识
- React 学习笔记(基础篇)
- 前端性能优化《一》——Chrome Performance 页面性能调试
- 【Vue 进阶】从 slot 到无渲染组件