内存

Q1:我写了一个用例加载AssetBundle,并将多个特效Prefab实例化到场景中。连续运行了多次用例并把添加的特效对象都删除,而且切换了场景,我看到Profiler中的内存变化如下图所示:

我想咨询下:
1. Profiler里的Reserverd Unity内存比Used Unity内存高出很多是正常的吗?
2. 如果正常的话,有办法可以回收Reserverd Unity内存吗?
3. Reserverd Unity内存在运行完多次上述的用例后稳定在400MB,再运行一次用例可以上涨到450MB,虽然后面会回落到400MB。这样的表现也是正常的吗?

  1. 题主这个数据是在Editor中做测试的结果吗?Reserverd比Used高出这么多确实不太合理;但如果是Editor中,那么Unity其实会做很多辅助操作,这些也确实是会占用内存的。所以,建议在真机中测试看看,看看这个差距是否会下来。但如果是在真机中,那么这个差距确实过高了,不太合理。

  2. Reserverd Unity的内存是引擎自身管理的,一般会在后续不使用时自己降下来。

  3. 这种升高和回落是正常的,但至于是否应该这么高,请见1中的回答。

该问题来自UWA问答社区,如您对该问题仍有疑问,可以转至社区进行进一步交流。
https://answer.uwa4d.com/question/5a1fde25bd7d86f726903207


内存

Q2:我想咨询下,Resources.UnloadUnusedAssets() 在卸载旧场景后加载新场景前调用好,还是在加载新场景后调用比较好呢?如果考虑内存峰值的话,我觉得是前者好,但是在UWA上看到有些文章说是加载场景后调用,所以想深入学习下。

如果题主是通过LoadLevel(Async)类似的方式来加载场景的话,那么Unity自身会在底层执行一次类似Resources.UnloadUnusedAssets的操作。所以,这时如果手动调用Resources.UnloadUnusedAssets操作,时间间隔很短,其实这个是有些重复的。因此,我们才建议在新场景加载后再调用一次。

但如果题主使用LoadLevelAdditive或其他类似的API来切换场景的话,那么Unity是不会调用Resources.UnloadUnusedAssets的,这时你再旧场景卸载后调用,其实也是很不错的选择。

该问题来自UWA问答社区,如您对该问题仍有疑问,可以转至社区进行进一步交流。
https://answer.uwa4d.com/question/5a1fc7dbbd7d86f726903206


渲染

Q3:是否可以认为Shader里 Blend Off和Blend One Zero是完全等价的?我在Unity的Standard Shader里看到它的混合是使用形如Blend [_SrcBlend] [_DstBlend]来动态控制,并且注意到其在StandardShaderGUI.cs里设置Opaque时就是设置的 Blend One Zero,那么是否可以认为在Shader里写Blend One Zero的话,和Blend Off是等价的?Unity会自动改变blendstate从而避免从destbuffer读取数据?

我们在Unity 2017.1上测试了一下,发现实际上在Android平台的GLES调用中,Unity的Standard Shader的Opaque模式是在disable blend的状态下渲染的,实验如下:

设备:红米2。渲染场景是两个Standard Shader Opaque模式物体(Sphere和Cube),中间有一个Unlit Transparent的Quad:

通过Android工具查看GLES API调用发现,每一帧渲染Cube和Sphere的时候Blend都是关闭状态(上一帧结束时关掉),然后在渲染Unlit Transparent的Quad时打开:

其中,36个顶点的DC是渲染Cube,2304个顶点的DC是渲染Sphere,6个顶点的 DC是渲染quad。所以看起来Standard Shader的Opaque模式应该是glDisable(GL_BLEND)的状态下渲染的。

该问题来自UWA问答社区,如您对该问题仍有疑问,可以转至社区进行进一步交流。
https://answer.uwa4d.com/question/5a1a8e710aef30913881b489


内存

Q4:在游戏每次打完副本回到主界面后,内存数据总是不太一致,其中通过Unity Profiler我观察到ManagedHeap.ReservedUnuseSize和ManagedHeap.UseSize的数值一直在变化,请问这个变化是否是合理的?

ReservedUnuseSize和ManagedHeap.UseSize一直在变化是正常的,它们都属于Mono内存,前者是当前Mono内存中没有使用的,后者是正在使用的。一般游戏中,Mono堆内存是会经常由代码来进行分配的,所以这两个值一直在变化,也是很正常的情况。

这里建议题主密切关注以下两点:
(1)Mono的总堆内存是否一直在升高
下图是UWA性能测评报告中的Mono堆内存走势图,其中的紫色线条即为项目运行时的ManagedHeap.UseSize,而黄色线条为ReservedUnuseSize,这两者都是在变化的,但最需要关心的是蓝色线条Reserved Mono,这条线条如果持续往上走,那么就说明项目中是很可能出现了内存泄露问题,需要研发团队彻查,建议通过Mono详细堆内存分析来进行修复。

(2)具体的堆内存分配是否合理
ManagedHeap.UseSize或者Mono总内存的上升都是由于代码的堆内存产生的,所以查看代码堆内存分配是否合理,避免不必要的堆内存分配是非常重要的,类似于下图。

建议题主参考以下两篇文章:

  • 用正确的方式,三天搞定Mono堆内存泄漏!
  • Unity游戏的代码堆内存优化

原文出处:侑虎科技
本文作者:admin
转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。

技术分享连载(八十九)相关推荐

  1. 技术分享连载(十八)

    图形渲染 Q1:我看到Unity 5.3.5版本中恢复了对粒子系统的合批功能,但是我尝试下来并没有达到这个效果.是粒子系统合批有什么要求吗,实例化会不会对粒子系统的合批造成影响呢? 经过我们验证,Un ...

  2. DockOne微信分享( 八十九):恒生金融交易系统的Docker化实践

    本文讲的是DockOne微信分享( 八十九):恒生金融交易系统的Docker化实践[编者的话]Docker可以显著改善企业软件研发流程.提升企业DevOps效率.借助Docker,企业可以对现有IT系 ...

  3. DockOne微信分享(八十四):Docker在B站的实施之路

    本文讲的是DockOne微信分享(八十四):Docker在B站的实施之路[编者的话]B站一直在关注Docker的发展,去年成功在核心SLB(Tengine)集群上实施了Docker.今年我们对比了各种 ...

  4. DockOne微信分享(六十九):微服务选型之Modern Node.js

    本文讲的是DockOne微信分享(六十九):微服务选型之Modern Node.js[编者的话]目前Node.js的发展非常快,大家可能还停留在:Node.js性能很好,Node.js里都是回调,写起 ...

  5. DockOne微信分享(八十五):Docker存储方式选型建议

    本文讲的是DockOne微信分享(八十五):Docker存储方式选型建议[编者的话]Docker存储方式提供管理分层镜像和容器的可读写层的具体实现.最初Docker仅能在支持AUFS文件系统的Ubun ...

  6. 第三百八十九节,Django+Xadmin打造上线标准的在线教育平台—列表筛选结合分页...

    第三百八十九节,Django+Xadmin打造上线标准的在线教育平台-列表筛选结合分页 根据用户的筛选条件来结合分页 实现原理就是,当用户点击一个筛选条件时,通过get请求方式传参将筛选的id或者值, ...

  7. 八十九、Python的GUI系列 | 使用PyQt5 快速构建一个GUI 应用

    @Author:Runsen @Date:2020/7/11 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  8. JavaScript学习(八十九)—数组练习题

    JavaScript学习(八十九)-数组练习题

  9. WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载]

    原文:WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载] 我们有两种典型的WCF调用方式:通过SvcUtil.exe(或者添加Web引用)导入发布的服务元数据生成服务代理相关的代码 ...

  10. UWA 技术分享连载 转载

    技术分享连载1 Q1:Texture占用内存总是双倍,这个是我们自己的问题,还是Unity引擎的机制? Q2:我现在发现两个因素直接影响Overhead,一个是Shader的复杂度,一个是空Updat ...

最新文章

  1. 一文看懂Python(四)-----os.path模块篇
  2. bat脚本注释多行_cmd批处理常用符号详解
  3. [css] 不使用border画出1px高的线,在不同浏览器的标准和怪异模式下都能保持效果一样
  4. np.cross函数详解
  5. 设计模式:单件模式(Singleton Pattern)
  6. Infor与Marketo®合作,帮助全球企业实现客户体验变革
  7. PHP 错误与异常 笔记与总结(6)将错误日志保存在系统日志中
  8. 火爆Github的刷题攻略,现在配套网站上线了!!力扣刷题网站,刷题路线
  9. raid数据恢复,Raid5磁盘阵列数据恢复案例,服务器数据恢复
  10. CHROME扩展开发文档之·chrome.runtime
  11. 网络安全红蓝军对抗完整战术周期
  12. 正确使用“width:100%“
  13. ChatGPT会砸了谷歌的饭碗吗?(附彩蛋)
  14. 0703齐次方程-微分方程
  15. Distiller 安装时环境配置的一些可选项
  16. 8大模块、40个思维模型,打破思维桎梏,满足你工作不同阶段、场景的思维需求,赶紧收藏慢慢学
  17. Isolation Forest 孤立森林
  18. ListBox优化初步(一)
  19. 搜索小技巧,八大搜索技巧
  20. Android_获取手机记事本

热门文章

  1. LeetCode 88 合并两个有序数组
  2. 6. OD-去除收费软件次数限制,去除退出软件时弹出的广告(比如可执行5次)
  3. C#不支持XPATH2.0
  4. 【洛谷习题】南蛮图腾
  5. Graph_Master(连通分量_Poj_1904)
  6. ifstat命令_统计网络接口活动状态的工具
  7. live-server 箭头函数
  8. Nginx配置优化参考
  9. 【持续更新】设计技巧++
  10. OSMeteorTranslationAPI(百度,有道)对比