让不可见的UGUI组件,只响应Raycast但是不参与GPU绘制的方法,有效降低OverDraw的产生

来源:互联网 发布:试卷生成软件 编辑:程序博客网 时间:2024/05/22 00:41

张博士他们搞的那个UWA公司在对unity的性能优化方面确实是6的不行呀,分享了好多很棒的方法呀。

原文地址,主要分享了2个降低ugui填充率的方法:http://blog.uwa4d.com/archives/fillrate.html

我们一般会做一些不可见的ugui组件,用来屏蔽在它后面的ui窗口的操作,但是这样的窗口其实也是会参与绘制的,这样的窗口多了以后,就会导致Overdraw的上升,降低效率,这里有一个十分巧妙的方法,可以让这个不可见的控件压根不参与绘制!让它彻底的消失,但是还能够阻挡后面ui的操作。

我们增加这样一个控件出来就可以了,代码:

using UnityEngine;using System.Collections;namespace UnityEngine.UI{    public class Empty4Raycast : MaskableGraphic    {        protected Empty4Raycast()        {            useLegacyMeshGeneration = false;        }        protected override void OnPopulateMesh(VertexHelper toFill)        {            toFill.Clear();        }    }}

然后我们来看看对比图!
这是我们打算用来做测试的ui

这里写图片描述

这是旧的遮挡方法:

这里写图片描述

这里我们用image组件来显示一张透明的图片,阻挡按钮的点击,我们来看看OverDraw

这里写图片描述

看到那一大块正方形了吗,这就是这块遮挡区域的绘制像素。
然后我们再来试试新的组件:

这里写图片描述

OverDraw:

这里写图片描述

那块矩形的像素区域消失了!现在不管我们加多少用来做全屏阻挡的组件,都不用担心它会参与ui的绘制了!当然如果你的阻挡区域是带颜色的,那这个小方法就不适合你了,我们需要根据项目的实际情况来进行选用。

文章里还有一个用顶点数来换填充率的方法,Polygon Mode Sprites,大家有兴趣的话也可以看看,不过希望unity自己能赶紧把这个特性搞进ugui里呀,就省大事了~

再次感叹一下,高手在民间呀,群众的力量是很强大的!

0 0
原创粉丝点击