本地资源检测,特效检测中overdraw相关问题
本文目录 3 个章节
本地资源检测,特效检测中overdraw相关问题
note · 我的 UWA 问答 本文收录我在 UWA 问答发表的公开回答。问题内容归原提问者;回答保留当时语境,技术结论可能受 Unity 版本、平台和项目条件限制。
问题
咱们这个特效资源检测 overdraw 和实际检测差距有点大。是不是统计峰值比较好一些? 有可能一个特效播放时间特别长 但是峰值就很短的时间 这样一平均 overdraw就很低了


- 提问者:一周闲七天
- 提问时间:2020-12-02 20:24:51
我的回答
首先要谈谈Overdraw的定义问题:
- Overdraw是一个描述像素重复绘制次数的概念。单个像素的重复绘制次数很容易理解,但是对于一个特效的Overdraw,笔者还没有找到什么公认的“标准”的计算公式,也不存在什么“官方”的定义。对于一帧来说,Overdraw值可以定义为 该帧总体绘制像素的次数 / 屏幕上实际绘制的像素数。而这个值也不能简单理解为"绘制的层数"。(试想如果总共在屏幕上绘制了1000个像素,其中只有一个像素绘制了10层,那这个重复绘制的像素对overdraw值得贡献也是可以忽略的,计算结果为 1009/1000=1.009)。而对于整个特效播放过程中的Overdraw,具体公式如何定义,又是一个问题。
- sunbrando的开源库(https://github.com/sunbrando/ParticleEffectProfiler)的计算方法:整个播放过程中

分子是对每一帧绘制像素的次数求和,分母是对每一帧屏幕上实际显示的像素数求和。这个公式确实可以从整体上衡量一个特效播放过程中的Overdraw。但是这样计算存在这样一个问题:在有些帧,特效占屏幕的比例很大,有些帧特效占屏幕的比例很小,而运算结果受屏幕占比大的帧影响比较大。比如第一帧绘制了1000个像素,只绘制了1层,而第二帧绘制了2个像素,绘制了10层,那么计算出的值为(1000x1 + 2x10) / (1000 + 2) = 1.018 。
UWA本地资源检测对特效Overdraw的计算与上述开源库计算公式是相同的。不同的是特效播放的逻辑与相机对准的方式。影响两个工具计算结果不同的因素有:
- 相机的对准方式不同。UWA的工具有一套相机自动对准的逻辑,相机的摆放不同,会造成overdraw不同。
- 播放的时机不同。UWA的工具会创建好场景后,自动加载并实例化特效,进行播放。而开源库ParticleEffectProfiler的方案是先把特效放到场景中,启动场景后再执行相关的逻辑,进行检测。
楼主的案例中,除了相机对准方式不同导致两个工具计算结果不同之外,很大程度上受到了获取的特效播放时机的影响。
使用开源库工具进行检测,发现抓取相机的Overdraw数据前,已经进行了三次Update,如下图所示。也就是说,特效的Overdraw是从第4帧开始统计的。这与该工具的代码逻辑有关,就不对原因进行分析了。

而前三帧恰恰又是在数值上贡献最大的帧,如图所示,前三帧特效中有一个面片占了很大的屏幕空间。

而第四帧开始,特效的像素占比就小了很多。

这是两个工具即使使用相同的对准方式,Overdraw计算结果也不相同的原因。
另外UWA 的特效检测还存在一个问题:相机视锥体的Size是不断调整的,那么不同的帧特效的屏幕占比会因此而改变,像素的绘制量也不同,对上述Overdraw值计算公式的贡献也就不一样。也就是说,相机的Size越小的帧,特效屏幕占比越大,对结果的影响越大。这里有两套解决方案——
- 换公式,每帧都计算出OverdrawRate,再求平均。
- 用户自定义相机,相机的视锥体保持固定,这样就是放弃自动对准,使相机的设置更接近用户的实际使用环境。
UWA的工具会不断迭代,根据需求尽可能找到一套最佳策略来帮助开发者对项目进行规范。
如果在优化中要使用工具进行检测,并衡量优化结果的话,建议使用一套工具即可,使用同一套标准至少可以对资源的性能进行一个排名,据此来选择优化的优先级,并使用同一套标准评估优化结果。
- 回答时间:2020-12-04 06:32:59
- 最后更新:2020-12-04 06:39:05
- 采纳状态:未采纳
来源与关系
- 上位集合:我的 UWA 问答
- UWA 标签:终端平台
- 原始问题:本地资源检测,特效检测中overdraw相关问题
- 源页最后更新:2021-09-01 22:29:40