---
title: "本地资源检测，特效检测中overdraw相关问题"
author: "石心.Yong"
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/uwa-answer-effect-overdraw-in-local-resource-check/
type: note
content_role: source
source_type: "source"
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/05-游戏图形与运行时/我的UWA问答/2020-12-04 - 本地资源检测，特效检测中overdraw相关问题.md"
content_hash: 7bdf471d91eafc8cfb3eef7bc774f6fb7d1eb34523d32df2e2e0366ae96c4b80
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# 本地资源检测，特效检测中overdraw相关问题

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

## 问题

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

![image.png](/media/8f1ec5438181128225d2.png)

![image.png](/media/6188336631270ed38615.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](/media/886335b467fe05d5dfb9.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](/media/73101c45573bacc1ded1.png)

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

![big.png](/media/3d8a756b3742ff544e66.png)

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

![smal.png](/media/b5a065c1e4ddbd32dddc.png)

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

###

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

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

-------------------------------------

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

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

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

## 来源与关系

- 上位集合：[我的 UWA 问答](https://www.pystone.net/notes/my-uwa-answers/)
- UWA 标签：终端平台
- 原始问题：[本地资源检测，特效检测中overdraw相关问题](https://answer.uwa4d.com/question/5fc7171310a17c6c2b09d47b)
- 源页最后更新：2021-09-01 22:29:40
