慎用Outline ,UGUI Outline实现原理分析

使用 UGUI 制作背包的时候,同事发现如果背包中添加了大量的物品,比如两百个,Unity就会出错,提示 Canvas element contains more than 65535 vertices. This is not supported 。意思就是 Canvas下面的顶点数过多。

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

如下图:


但是一个物品 的GameObject 难道有300个顶点不成?

不看不知道一看吓一跳,一个物品 居然有 500个Verts。

在对 物品的 GameObject 下面的子 物体 一个一个 禁用然后查看顶点后发现,当把Text 禁用之后,Verts 会锐减几百个。

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

没有禁用 Text 时的顶点数


禁用 Text 的顶点数


于是,继续,在Text 上发现挂了 Outline 组件,把Outline 禁用之后,发现Verts 锐减。才确定是 Outline的原因。

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

禁用Outline 之前


禁用Outline 之后


Ok,就是 Outline的原因。

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

那为什么Outline 会增加这么多顶点数呢?


查看UGUI的 Outline的源代码,如下:

using System.Collections.Generic;

namespace UnityEngine.UI
{
    [AddComponentMenu("UI/Effects/Outline", 15)]
    public class Outline : Shadow
    {
        protected Outline()
        {}

        public override void ModifyVertices(List<UIVertex> verts)
        {
            if (!IsActive())
                return;

            var start = 0;
            var end = verts.Count;
            ApplyShadow(verts, effectColor, start, verts.Count, effectDistance.x, effectDistance.y);

            start = end;
            end = verts.Count;
            ApplyShadow(verts, effectColor, start, verts.Count, effectDistance.x, -effectDistance.y);

            start = end;
            end = verts.Count;
            ApplyShadow(verts, effectColor, start, verts.Count, -effectDistance.x, effectDistance.y);

            start = end;
            end = verts.Count;
            ApplyShadow(verts, effectColor, start, verts.Count, -effectDistance.x, -effectDistance.y);
        }
    }
}

代码中的意思是 执行 ApplyShadow 4次,而且传过去的参数分别是 (x,y) (x,-y) (-x,y) (-x,-y) 。看到这四个值,好像感觉到了什么。。

来看看 这个函数做了什么。

protected void ApplyShadow(List<UIVertex> verts, Color32 color, int start, int end, float x, float y)
        {
            UIVertex vt;

            var neededCpacity = verts.Count * 2;
            if (verts.Capacity < neededCpacity)
                verts.Capacity = neededCpacity;

            for (int i = start; i < end; ++i)
            {
                vt = verts[i];
                verts.Add(vt);

                Vector3 v = vt.position;
                v.x += x;
                v.y += y;
                vt.position = v;
                var newColor = color;
                if (m_UseGraphicAlpha)
                    newColor.a = (byte)((newColor.a * verts[i].color.a) / 255);
                vt.color = newColor;
                verts[i] = vt;
            }
        }


简单的就是说:

1、把原来的顶点 Copy出来一份,并且根据编辑器中设置的偏移量 来设置 Copy 出来的顶点的位置

2、根据编辑器中设置的 Shadow 颜色设置定点色

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

执行了4次,每一次都Copy了一份顶点。。这难道是 复制了4份 Text ?这和我们自己再另外添加 4个Text性质差不多吧。。


想到一个很好验证的方法,把偏移量设置的很大,我们来看看。



我们知道 1个字 = 1张图片 = 2个三角形 =4 个顶点。

本来用 Text ,定点数量就会比较多,而 Outline 却在这个 值上 乘以 5 。

所以

慎用 Outline

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

工程下载:

http://pan.baidu.com/s/1c02KTfq

http://download.csdn.net/detail/cp790621656/8779193



  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值