Unity Ugui 优化 OverDraw

在渲染上,GPU、CPU两者的性能瓶颈往往是CPU;GPU的性能瓶颈往往是像素点填充率(Overdraw导致),CPU的性能瓶颈往往是Drawcall。所以,渲染性能排查,几项指标关注优先级应该是:Drawcall > Overdraw > 面片

Overdraw是指屏幕上的某个像素在同一帧的时间内被绘制了多次。UWA分析报告中,以总填充总数来表达一帧内渲染的像素数量,过多Overdraw可能会引起GPU过载,影响动画的播放和界面响应速度。

如果你使用了九宫格 那么 Fill center 的效果是不一样的
这是不勾选
在这里插入图片描述
勾选后就变成这样了
在这里插入图片描述
这个会影响overdraw

Mask组件,它自带两层OverDraw. 在这里插入图片描述
上面的是mask 双层overdraw 下面是被遮的图 会发现 他依然被overdraw了 即使是完全不显示

rect mask 2d 就是一层
在这里插入图片描述
如果有一个完全不显示 那么完全没有overdraw 这一点比mask强不少
在这里插入图片描述

Text组件的OutLine和Shadow,Shadow会增加一层OverDraw,而OutLine是复制了四份Shadow实现的
在这里插入图片描述
在这里插入图片描述
这个就是偏移后的overdraw
确实是4个

对于弹出窗口,位于底层的窗口如果被上层遮挡,请将它从Camera渲染层级里移除并将不可见的Canvas设置enable = false,不在Camera渲染层级里的Canvas.enable = true,它下面的UI仍然会产生OverDraw;

UI上的特效粒子,请尽量简单,如果可以请用序列帧动画实现

有一些特殊的图 周围一大圈都是透明的
在这里插入图片描述
类似这样的图
大片渲染都是无效的 增加了over draw
可以让图片设置成
在这里插入图片描述
在这里插入图片描述
设置一下他的轮廓
在这里插入图片描述
让他自动生成

使用的时候
在这里插入图片描述
需要勾住这个
你会发现 他的overdraw
变成了这个
在这里插入图片描述
之前在Profile手头项目的时候发现红米上一个奇怪的现象:战斗界面维持60fps没问题;进入UI界面之后瞬间掉到45fps,甚至有的复杂界面掉到30fps。但战斗场景的Tris/Verts比UI高不少。

通过工具很方便的就定位到了瓶颈在于FillRate爆了,最后发现新手教学部分用了很多“不可见”的Image作为交互响应的控件;但这些东西虽然画上去没有效果,依然占用了显卡资源,特别是有很多大块的区域…找到问题之后就解决起来很方便:实现一个只在逻辑上响应Raycast但是不参与绘制的组件即可,改完之后帧率瞬间正常。

using UnityEngine;
using System.Collections;

namespace UnityEngine.UI
{
    
    
    public class Empty4Raycast : MaskableGraphic
    {
    
    
        protected Empty4Raycast()
        {
    
    
            useLegacyMeshGeneration = false;
        }

        protected override void OnPopulateMesh(VertexHelper toFill)
        {
    
    
            toFill.Clear();
        }
    }
}

顺便一提
TexturePacker
也有这个功能
在这里插入图片描述
会大大降低打包纹理的大小
十分方便

还有一个小技巧 以后出现卡顿的时候能用到
在这里插入图片描述
在这里插入图片描述
如果你的mask特别多
可以试试这个 也许能帮到你
https://github.com/leoin2012/Unity-MeshMask

猜你喜欢

转载自blog.csdn.net/qq_38913715/article/details/122537287