如何利用UWA优化物理开销

如何利用UWA优化物理开销

这是第162篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

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


本期目录:

  • 如何利用UWA优化物理开销
  • Unity中的Lua所占内存会统计到Profiler中吗
  • 如何获得AssetBundle加载任务的AssetBundleLoadResult
  • 如何在客户端和服务端保持Navmesh寻路计算结果相同
  • 如何设计渲染等级

Physics

Q:我们游戏项目使用UWA深度评测报告FixedUpdate.PhysicsFixedUpdate存在较大的CPU耗时,想问下这一块的耗时是怎么导致的,该如何优化?

请输入图片描述

A:首先,这是Unity引擎中物理模块的主要耗时开销。从图中可以看出,你们物理模块较高的一个主要原因是调用次数过高,显示了一帧中调用了17次,就算一次开销1ms,调用17次,也有17ms。所以,调用次数是需要题主项目中最需要注意的一点。游戏运行过程中物理模块的调用次数可以通过下图中的箭头查看,同时,物理的调用次数最好是每帧控制在1~3次,如下图所示。

请输入图片描述
而题主中的物理模块之所以会调用次数这么高,其主要原因是其他模块的耗时很卡,所以导致了物理模块的FixedUpdate在一帧中不断更新,而17次是默认情况下的上限值。物理模块有个有意思的特点,就是你的项目越卡,它会让你的项目更卡,切记!

所以,题主首先要做的是去看看其他模块改如何进行优化,优化下来后,物理模块的耗时自然就下来了。

其次,需要查看你们的项目是否确实需要物理模拟,很多项目(哪怕是MMO)的物理模拟都可以通过其他方式来代替。如果你们的项目中的物理模拟可以通过其他方式来代替,那么题主尽可能将物理模块进行关闭,在Unity 2018及以上版本中,可以自行关闭“Auto Simulation”选项,在5.4~2017版本中,Unity引擎会根据你们物理引擎使用与否来自行关闭。

最后,UWA线上深度测评中的性能简报中有更多的需要注意的关键点,可以根据性能简报中的建议来进行查看,同时,还有更多其他团队遇到的相关技术问题,建议详细查看,很多问题都是共通的,很有可能你们的项目也用的上。

请输入图片描述

该回答由UWA提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5cf22493d27511377098274b


Lua

Q:Unity中Lua部分所占用的内存会被统计到Profiler中吗?如果被统计到了Profiler中,那对应会是被统计到哪一块所占内存中?Mono吗?

实测了下,在Lua中实时创建一个全局超大数组,在Profiler未看哪项数值有变动,所以结论应该是Lua所占内存不会被Profiler给统计到?

A:是的,Lua堆内存并不会在Unity Profiler中被统计到。

目前,Lua堆内存只能通过第三方工具(比如UWA GOT Online)来进行统计。具体可以查看这篇文章:新功能!Lua,是时候和你走走心了!

游戏运行时的Lua总内存查看:
请输入图片描述

每一帧的具体Lua堆内存分配查看:

请输入图片描述

该回答由UWA提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5cf33be5d275113770982750


AssetBundle

Q:最近找到Unity里面有一个叫AssetBundleLoadResult的枚举值。目测这个枚举值是用来反馈一次AssetBundle加载任务的结束状态(错误原因)。
https://docs.unity3d.com/2019.1/Documentation/ScriptReference/AssetBundleLoadResult.html

但是实际在Untiy的各个AssetBundle相关的API中,我没有找到获得这个枚举值的方法。而且几个常用接口CreateFromXXX之类的,不管同步还是异步,出现错误只是返回空值,错误输出直接打进LogError,除了直接截取Log外,还没有想到其他解决方法。

不知道各位有没有能够获得这个值的方法,或者有没有其他干净的获得加载失败原因的方法?

A:这个枚举使用在AssetBundle.RecompressAssetBundleAsync的AssetBundleRecompressOperation中。

有相关的API:AssetBundleRecompressOperation.result,主要用于描述将AssetBundle的压缩方式转换到另一种压缩方式的状态。

参见官方文档:
https://docs.unity3d.com/ScriptReference/AssetBundle.RecompressAssetBundleAsync.html

https://docs.unity3d.com/2019.1/Documentation/ScriptReference/AssetBundleRecompressOperation.html

官方未提供任何的修复AssetBundle的机制,建议方式是自己对比MD5值,如果不一致就下载新的,本地AssetBundle失败无非两种,文件损坏或修改,或者不存在。

感谢郑骁@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5cf5cf17a937dc376b4ccee8


Navmesh

Q:我这边尝试使用客户端使用Unity原生的Navmesh,服务端使用Recast,使用客户端导出Navmesh给服务端。

但是因为Unity对Recast进行了修改,所以更正确的情况或许应该是客户端和服务端都是使用Recast进行导航。

所以如何在Unity客户端中直接使用Recast?或者有什么其他的客户端服务器使用同一套寻路方案的方法吗?

A1:赞同你的思路。通过统一的数据和计算过程来保持寻路计算结果相同。在Unity没有开放自己修改过的Navigation源码的情况下,更好的方式是都使用recastnavigation的算法。由于recastnavigation是基于C++的,因此需要以native plugin的方式接入到Unity。

其他方案,如果不是很大和有很复杂的结构的地图,也可以基于A算法来做,导出一份标记了可行走区域的Grid数据。客户端和服务器共用一套A寻路算法。
感谢张锐@UWA问答社区提供了回答

A2:即使你客户端和服务器使用了相同的Recast&Detour,也不会得到相同的运算结果,这个系统都是基于浮点数运算的,得不到完全一致的结果,如果是服务器主导的寻路倒是没啥问题,除非,你要么使用Grid这种传统的整数格子寻路,要么实现定点数版本的Recast&Detour。

首先我觉得是否可以使用多线程跟寻路算法是无关的,原生的Recast对多线程的支持并不友好; 客户端想完全自己控制的话,可以考虑使用Unity 3D AssetStore的一个A* Pathfinding Project Pro的寻路插件,提供了三种寻路算法:Navmesh、Grid、Waypoint,实现了协程和多线程计算。我们项目以前用过,如果服务器使用的是Phong这种C#语言,应该很容易移植;如果服务器是C++ 使用了Recast,也许客户端可以考虑改造AStarPathFindingProject和C++ Recast两者之一来实现相同的算法。但是这样做代价高昂,也依然不能得到完全一致的结果,需要一致的运算首先不能使用浮点数。

我觉得你还是需要仔细评估你们项目的需求,Recast不是万能的,大规模场景快速获取结果适合但有误差,传统格子A*适合小场景适合服务器客户端一致,每种寻路算法都有优缺点,你需要根据核心的需求去选择评估。

另外,UWA学堂里我的那篇《Unity引擎Navmesh的导出及应用》是将Unity的Navmesh导出到Recast使用,也无法满足前后端运算结果一致,适合服务器需要客户端制作的数据然后来主导寻路。

感谢Yaukey@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5cf4fa55d2751137709827fc


Render

Q:现思考如何设计项目中的渲染等级,求有经验的大佬指个方向,例如ShaderLOD,还有其他什么思路吗?谢谢!

A:可以补充一下,目前我们这边尚未完善渲染等级模式,不过对于分级消耗的处理,其实没有提到的一点,就是根据手机型号自适应当前的分级,诊断如下:

需要建立一张表格:


类似这样的方式。然后客户端根据当前的手机型号,或者分配方式对应相应的调整,来自动化节省消耗。

另外,针对其参数,可以取当前的帧率来判断,保证游戏的流畅度,即当手机帧率下降时,主动提示玩家需要降低渲染等级,以保证平滑度。因为手机性能有时候会随着电池的发热而降低,是波动的。

由于篇幅有限,更多精彩回答,戳以下链接即可查看

感谢马古斯@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5acc208b425802635474fc7d

今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

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