返回「计算机、信息技术与工程」

本地资源检测,特效检测中overdraw相关问题

更多
Markdown 结构化数据
本文目录 3 个章节

本地资源检测,特效检测中overdraw相关问题

note · 我的 UWA 问答 本文收录我在 UWA 问答发表的公开回答。问题内容归原提问者;回答保留当时语境,技术结论可能受 Unity 版本、平台和项目条件限制。

问题

咱们这个特效资源检测 overdraw 和实际检测差距有点大。是不是统计峰值比较好一些? 有可能一个特效播放时间特别长 但是峰值就很短的时间 这样一平均 overdraw就很低了

image.png

image.png

  • 提问者:一周闲七天
  • 提问时间:2020-12-02 20:24:51

我的回答

首先要谈谈Overdraw的定义问题:

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

MommyTalk1607005585466.png

分子是对每一帧绘制像素的次数求和,分母是对每一帧屏幕上实际显示的像素数求和。这个公式确实可以从整体上衡量一个特效播放过程中的Overdraw。但是这样计算存在这样一个问题:在有些帧,特效占屏幕的比例很大,有些帧特效占屏幕的比例很小,而运算结果受屏幕占比大的帧影响比较大。比如第一帧绘制了1000个像素,只绘制了1层,而第二帧绘制了2个像素,绘制了10层,那么计算出的值为(1000x1 + 2x10) / (1000 + 2) = 1.018 。

UWA本地资源检测对特效Overdraw的计算与上述开源库计算公式是相同的。不同的是特效播放的逻辑与相机对准的方式。影响两个工具计算结果不同的因素有:

  1. 相机的对准方式不同。UWA的工具有一套相机自动对准的逻辑,相机的摆放不同,会造成overdraw不同。
  2. 播放的时机不同。UWA的工具会创建好场景后,自动加载并实例化特效,进行播放。而开源库ParticleEffectProfiler的方案是先把特效放到场景中,启动场景后再执行相关的逻辑,进行检测。

楼主的案例中,除了相机对准方式不同导致两个工具计算结果不同之外,很大程度上受到了获取的特效播放时机的影响。

使用开源库工具进行检测,发现抓取相机的Overdraw数据前,已经进行了三次Update,如下图所示。也就是说,特效的Overdraw是从第4帧开始统计的。这与该工具的代码逻辑有关,就不对原因进行分析了。

log.png

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

big.png

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

smal.png

这是两个工具即使使用相同的对准方式,Overdraw计算结果也不相同的原因。

另外UWA 的特效检测还存在一个问题:相机视锥体的Size是不断调整的,那么不同的帧特效的屏幕占比会因此而改变,像素的绘制量也不同,对上述Overdraw值计算公式的贡献也就不一样。也就是说,相机的Size越小的帧,特效屏幕占比越大,对结果的影响越大。这里有两套解决方案——

  • 换公式,每帧都计算出OverdrawRate,再求平均。
  • 用户自定义相机,相机的视锥体保持固定,这样就是放弃自动对准,使相机的设置更接近用户的实际使用环境。

UWA的工具会不断迭代,根据需求尽可能找到一套最佳策略来帮助开发者对项目进行规范。

如果在优化中要使用工具进行检测,并衡量优化结果的话,建议使用一套工具即可,使用同一套标准至少可以对资源的性能进行一个排名,据此来选择优化的优先级,并使用同一套标准评估优化结果。

  • 回答时间:2020-12-04 06:32:59
  • 最后更新:2020-12-04 06:39:05
  • 采纳状态:未采纳

来源与关系