UWA本地资源检测说明

UWA本地资源检测说明

UWA本地资源检测是针对静态工程检测的自动化流水线,旨在帮助研发团队快速发现自身开发过程中存在的各种资源、代码和设置问题。以静态资源和代码分析为切入点,在项目早期可接入,秉持及时发现、及时解决的原则,大幅度节省项目研发的时间和人力成本。

为了帮助大家更快地上手,我们整理了这份完整版资源检测说明书,本文的结构分为三个部分:核心功能介绍、使用方法/优秀实践案例、知识点拓展【加餐】

当前最新版本支持的核心功能如下图所示,我们会在下文进行逐一说明:


一、核心功能介绍

1、基本资源检测

报告内将详细反馈主流资源(网格、纹理、音频、材质、Animation、Shader、Video、Prefab)的使用情况,包括检测资源的属性、是否合理、处理的优先级情况等一览无遗。

同时,本地资源检测还支持特效播放检测,可以批量测试粒子特效性能,自动扫描特效,一次运行,全部检测。(详情见UWA已支持批量检测粒子特效性能

而Shader分析模块可以针对项目中的Shader资源进行排查,Shader脚本一键扫描,Build变体全面分析。(详情见帮你把关Shader变体问题!UWA本地资源检测又更新!

在最新的2.0.2版本中,UWA本地资源检测添加了“美术资源检测”模块,帮助美术成员检查模型、贴图的质量,快速排查美术资源,规范美术研发流程。(详情见本地资源检测大更新——2.0全新上线 / 美术资源检测 — 让你的网格无可挑剔

2、场景、全局设置及C#代码检测

同样的,针对场景、Editor以及代码设置,我们也设定了相关的检测规则。

3、Lua脚本检测

UWA本地资源检测现已支持Lua代码扫描检测,来帮助开发团队方便地检测Lua代码不规范的问题,提高代码质量,从而提高开发的效率。详情请戳本地资源检测支持Lua检测!

4、贴心的Tips功能

结合UWA结合多年的优化经验,我们在数据检测面板中提供了对应的分析建议,所有的检测结果都有对应的说明注释,大大降低了用户的使用门槛,也帮助开发者及时作出合理的优化策略。

5、行业阈值和自定义阈值

尚处于研发早期阶段的团队常常关心一个问题:这个数据在行业水平中是怎么样,我们是不是超标了?或者我们还有多大的发挥空间?为了帮助大家更科学地树立研发规范,我们提供了10套官方阈值,对应10种不同的游戏类型。如下图,用户可以在切换阈值设定的下拉菜单中看到我们推荐的阈值选项。

这些阈值的来源为所有提交至UWA官网的大数据,我们会定期更新每种参数的阈值,以保证这些数据的时效性。

同时,研发团队也可以点击报告的右上角自定义阈值,现支持阈值方案多套保存的功能,便于大家制作更加精细的定制化需求。

6、自定义规则

大家都希望能为项目量身定制一套资源规范的规则,因此我们也为大家开放了自定义规则API,大家可自行开发适合自身项目的检测规则。(传送门:规则我说了算!自定义规则重磅上线

7、历史数据对比与报告数据导出

报告支持对同一个项目下的任意两份报告进行全量数据对比。以“优化后通过的资源”、“历史检测通过,当前失败的资源”,“当前检测删除的资源”这三个维度,来方便研发团队进行直观的比较。我们还提供了资源对比功能,从这几张表格内可以看到是否发生了误添加/删资源的情况。


同时,报告支持对线上报告的数据导出,也可以针对单个规则进行数据导出,方便开发人员对数据进行相应的应用与处理。

8、自动修复功能

针对Unity版的本地资源检测结果,在项目工程内直接根据问题资源进行自动修复,真正打通本地资源检测“开发-检测-修复”的自动化循环,彻底解放人力、提高效率。详情可戳《本地资源检测功能更新 — “自动修复”重磅上线》了解。


二、使用方法

为方便大家能快速上手,我们制作了一个简易的【奶奶级】教程,绝不让大家踩坑,传送门:本地资源检测之民间文档 | 仅需10分钟,我又上手了一个新技能!

SDK的下载链接在https://www.uwa4d.com/#download,找到Pipeline SDK下载即可。已经在用的小伙伴也要记得及时更新喔,不然就无法体验最新功能啦。

该服务自上线以来,已经受到不少游戏开团队的积极反馈,更有一位资深用户分享了他们完整的实践流程,从接入到分析排查到复测再到总结复盘,详尽又落地,可作为大家实践参考的攻略帖:优化不再秃头,这个优秀实践我们一点一点说


三、知识点拓展加餐【持续更新】

在今年的UWA DAY 2020的《轻量级流水线结合方案助力打造高品质游戏》一讲中,我们罗列了在UWA本地资源检测上检测未通过的触发规则。

无论是大家在开发时的疏忽,还是相关知识点的缺失,这些问题的积累最终都会反映到项目的性能表现上。为此,我们将这些规则曝光出来,并且以一个个知识点的形式逐一解读,从而让大家更深刻地明白,它们是如何对项目的整体性能情况产生影响的。

我们力图以浅显易懂的表达,让职场萌新或优化萌新深入理解。
本文会持续更新,欢迎加入收藏,定期翻阅充电。

资源篇
尺寸过大的纹理——97%的项目中招
面片数过大的网格——95%的项目中招
使用了纯色纹理——92%的项目中招

包含空纹理采样的材质——91%的项目中招
未开启OptimizeGameObjects的Animator组件——87%的项目中招
包含Scale曲线的动画片段组件——86%的项目中招

精度过高的动画片段——86%的项目中招
包含无用纹理采样的材质——79%的项目中招
粒子数上限超过30的粒子系统——79%的项目中招
引用纹理尺寸大于256的粒子系统——78%的项目中招

未使用Streaming加载的长音频
未使用PCM格式的音频
双声道的音频
尺寸过大的视频资源

包含Color属性的网格
未开启OptimizeMesh选项的网格
包含Tangent属性的网格
包含uv3或uv4属性的网格

包含Normal属性的网格
开启Read/Write选项的网格
蒙皮网格骨骼数过大

包含无效透明通道的纹理
过滤模式为Trilinear的纹理
开启Read/Write选项的纹理

开启Mipmap选项的Sprite纹理
使用非压缩格式的纹理
Wrap模式为Repeat的纹理

包含相同纹理采样的材质
包含纯色纹理采样的材质
纹理采样数过多的Shader

Compression != Optimal的动画资源
AnimationState数量过高的AnimatorController

网格发射数超过5的粒子系统
所使用的网格未开启Read/Write选项的粒子系统
引用网格面片数超过500的粒子系统
引用纹理数超过5的粒子系统

使用了MotionVector的SkinnedMeshRenderer
使用Tiled模式的Image组件
不可见的Image组件

可能生成变体数过多的Shader
全局关键字过多的Shader
Build后生成变体数过多的Shader

使用了Outline的Text组件
使用了默认纹理的RawImage组件
不可见的RawImage组件
开启Prewarm的粒子系统
开启Collision或Trigger的ParticleSystem

特效播放时平均Overdraw率过高
特效播放时DrawCall峰值过高
特效总贴图内存过大
使用了Standard Shader的材质

特效运行时包含的ParticleSystem组件数量过多
播放特效时最大粒子数量过多
特效总贴图数量过大
开启各向异性过滤的纹理

移动端场景雾效检测
UI子节点过多的Canvas
检测场景中的MeshCollider

挂载多个AudioListener的物体
检测场景物件与Prefab的连接是否正常
挂载RigidBody的静态物体

场景总顶点数过大/总面片数过大
阴影分辨率设置不规范的灯光
检测场景中的Rigidbody
场景中MeshCollider使用的总面片数过多

网格的枢点不在底部
网格的纹理的面密度均值过小
网格的纹理的面密度方差过大
网格的UV覆盖范围过大
网格的屏幕顶点密度过大
网格存在不可见面片
网格的硬边与UV边界不一致
网格存在UV Shell边距过小的问题

贴图中无用的透明区域过多
动画的导入设置未关闭Resample Curve
没有使用Optimize Sample Rate的PCM音频
该音频中使用了Quality过高的Vorbis和MP3压缩
该粒子系统中使用了Standard Shader
勾选了Apply Root Motion的Animator组件
缺失Renderer的LOD Group组件

代码篇
类中存在OnGUI方法
类中存在空的Update、LateUpdate和FixedUpdate方法
该类的方法中存在Camera.main的调用
该类的方法中存在ComputeBuffer.GetData调用
该类的方法中存在对纹理SetPixels的调用
该类的方法中存在GameObject.SendMessage调用
该类的方法中存在GetComponentsInChildren调用/该类的方法中存在GetComponentsInParent调用
该类的方法中存在FindObjectsOfType调用
该类的方法中存在Reflection相关函数的调用
该类的方法中存在对Renderer进行Material/Materials的获取

该类的方法中存在 .tag的调用
该类的方法中存在对纹理GetPixels()/GetPixels32()调用
该类的方法中存在 GetComponentsInChildren调用/该类的方法中存在 GetComponentsInParent调用
该类的方法中存在Linq相关函数的调用
该类的方法中存在对Renderer进行sharedMaterials的获取
该类的方法中存在 Input.touches调用
FindObjectsOfType调用
该类的方法中存在 TextAsset/WWW.bytes调用

设置一个未定义的全局变量
更改一个未定义的全局变量
访问一个未定义的全局变量
试图设置一个只读的全局变量
试图设置一个全局变量的只读域
未被使用的隐式定义的全局变量
试图设置一个全局变量的未定义域
试图访问一个全局变量的未定义域

该类的Update中存在引用类型的new操作
该类中存在造成堆内存分配的字符串操作
该类中存在对UnityEngine.Debug类的Log函数的调用
该类的方法中存在Find类函数调用
该类中调用的Unity函数可改为无堆内存分配版
该类中存在对特定容器的foreach遍历
全局各向异性设置为forcedOn
ProjectSettings中没有勾选Optimize Mesh Data
代码剔除设置未达到最优
场景中带阴影的实时光数量超过阈值
场景中有开启了Deferred Rendering的相机
场景开启了RealtimeGI

相关推荐
规则我说了算!| 自定义规则重磅上线
单规则多阈值设置功能上线
“自动修复”重磅上线
自定义规则 零基础上手指南
功能上新|本地资源检测 3.1.3版本