如何读懂UWA性能报告?—物理篇

简介:

抛砖引例

打开物理模块的界面,我们可以看到更详细的性能数据,下图所示的是某卡牌回合制手游在红米2上的性能表现:
UWA Tech Doc
我们可以看到报告中的四个考核值为:“CPU均值”、“Contacts数量峰值”、“静态碰撞体峰值” 和 “动态碰撞体峰值”。需要说明的是动态碰撞体是指带有RigidBody的Collider,而静态碰撞体指不带有RigidBody的Collider。

“CPU均值” 目前主要是Physics.Simulate每帧的平均CPU耗时,一般我们建议在3ms以下。但同时我们也需要关注测试的主体范围(5%~95%)内的数值,通过UWA报告右上角的“分析 & 建议”即可查看,该游戏的主体范围值集中在0.1~3.5ms之间,相对偏高了。

UWA Tech Doc
另外,我们可以在报告中看到物理函数Physics.Simulate的趋势图,即Unity引擎中物理引擎的主要性能体现(Unity 5.x版本中多了个Processing,其实就是把Simulate拆开了)。对于Unity引擎而言,其4.x版本所使用的物理引擎为Nvidia PhysX 2.8,5.x版本所使用的物理引擎为Nvidia PhysX 3.3。


引起 Physics.Simulate 开销较大的几个因素

1.Rigidibody
该组件可使得游戏对象在物理系统的控制下运动。对于移动设备而言,建议Rigidibody数量控制在50以下。同时需要注意的是,大家常常会用Rigidbody组件配合CapsuleCollider,通过RigidBody.velocity来移动。这些会造成物理计算,特别是网格有很多Mesh Colider的时候,物理计算相当高。因此,我们建议尽量用Transform.Position代替物理计算。如果大家的地形是凹凸不平又要有重力的表示,也可以用Navmesh去做,它所引起的工作量在于烘焙Navmesh,并且尽可能地贴合地表 ,但是可以完全不用物理计算。

2.Contacts & Colider
Contacts数量为碰撞对(Contact Pair)数量。任意两个发生碰撞的碰撞体都会产生一个“碰撞对”。一般来说,Contacts数量越大,则表明碰撞物体的数量越多,即物理系统的CPU开销越大。那么碰撞体数量控制在多少以下比较合适呢? 一般来说,碰撞体数量(静态碰撞体和动态碰撞体两者)均控制在100以下,当然越低越好。


几个注意点

1. 如果你是用NGUI制作UI,则在NGUI界面打开后,往往会有Physics一下涨高的情况。这是因为NGUI为了实现点击事件的检测,在每个UI上都设有Rigidbody,所以当UI Widgets摆在同一深度并存在相互叠加的情况时,会造成较多不必要的Contacts。但实际上UI根本不需要任何物理计算,所以大家需要看看能否把UI层之间的碰撞检测关掉。那是否有方法确定这些开销是NGUI造成的呢?推荐的做法是:通过报表,看到趋势图中的较高值后去找它对应的场景图,如果发现对应的场景都是UI,就可以判断Physics的碰撞矩阵中UI和UI之间是相互碰撞的。

2. OntriggerXXX(如OntriggerEnter)。这种情况一般是在脚本中触发了其他的逻辑调用,例如在主角被碰撞从而受到伤害时,创建一个伤害数字的UI,这些均有些实例化的逻辑计算,当然这些也会算到Physics开销中。所以如果你报告中的物理模块的数据都是正常的,但是物理开销依然很大,则需要大家再着重检测这个部分逻辑代码了。





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

目录
相关文章
|
2月前
|
存储 监控 算法
【C++ 软件设计思路】高效管理历史任务记录:内存与磁盘结合的策略解析
【C++ 软件设计思路】高效管理历史任务记录:内存与磁盘结合的策略解析
58 0
|
10月前
|
算法 Docker Python
二十七 | 案例篇:为什么我的磁盘I/O延迟很高?
二十七 | 案例篇:为什么我的磁盘I/O延迟很高?
227 0
|
10月前
|
存储 缓存 NoSQL
缓存(1) —— 总述:分级存储
缓存(1) —— 总述:分级存储
341 0
|
消息中间件 Arthas 运维
日志瘦身骚操作:从 5G 优化到 1G,牛逼!!
日志瘦身骚操作:从 5G 优化到 1G,牛逼!!
|
Java 测试技术 图形学
|
异构计算 图形学 编解码

相关实验场景

更多