使用 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

project下载:

http://pan.baidu.com/s/1c02KTfq
http://download.csdn.net/detail/cp790621656/8779193

转载于:https://www.cnblogs.com/clnchanpin/p/7147284.html

慎用Outline ,UGUI Outline实现原理分析相关推荐

  1. 慎用Outline UGUI Outline实现原理分析

    使用 UGUI 制作背包的时候,同事发现如果背包中添加了大量的物品,比如两百个,Unity就会出错,提示 Canvas element contains more than 65535 vertice ...

  2. 可视化拖拽组件库一些技术要点原理分析(三)

    本文是可视化拖拽系列的第三篇,之前的两篇文章一共对 17 个功能点的技术原理进行了分析: 编辑器 自定义组件 拖拽 删除组件.调整图层层级 放大缩小 撤消.重做 组件属性设置 吸附 预览.保存代码 绑 ...

  3. java signature 性能_Java常见bean mapper的性能及原理分析

    背景 在分层的代码架构中,层与层之间的对象避免不了要做很多转换.赋值等操作,这些操作重复且繁琐,于是乎催生出很多工具来优雅,高效地完成这个操作,有BeanUtils.BeanCopier.Dozer. ...

  4. Select函数实现原理分析

    转载自 http://blog.chinaunix.net/uid-20643761-id-1594860.html select需要驱动程序的支持,驱动程序实现fops内的poll函数.select ...

  5. spring ioc原理分析

    spring ioc原理分析 spring ioc 的概念 简单工厂方法 spirng ioc实现原理 spring ioc的概念 ioc: 控制反转 将对象的创建由spring管理.比如,我们以前用 ...

  6. 一次 SQL 查询优化原理分析(900W+ 数据,从 17s 到 300ms)

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:Muscleape jianshu.com/p/0768eb ...

  7. 原理分析_变色近视眼镜原理分析

    随着眼镜的发展,眼镜的外型变得越来越好看,并且眼镜的颜色也变得多姿多彩,让佩戴眼镜的你变得越来越时尚.变色近视眼镜就是由此产生的新型眼镜.变色镜可以随着阳光的强弱变换不同的色彩. 变色眼镜的原理分析 ...

  8. jieba分词_从语言模型原理分析如何jieba更细粒度的分词

    jieba分词是作中文分词常用的一种工具,之前也记录过源码及原理学习.但有的时候发现分词的结果并不是自己最想要的.比如分词"重庆邮电大学",使用精确模式+HMM分词结果是[&quo ...

  9. EJB调用原理分析 (飞茂EJB)

    EJB调用原理分析 EJB调用原理分析 作者:robbin (MSN:robbin_fan AT hotmail DOT com) 版权声明:本文严禁转载,如有转载请求,请和作者联系 一个远程对象至少 ...

最新文章

  1. 【Android 异步操作】Handler 机制 ( MessageQueue 消息队列的阻塞机制 | Java 层机制 | native 层阻塞机制 | native 层解除阻塞机制 )
  2. 图解OpenLayers-2.13.1入门实例
  3. c#web页面显示弹窗_C#中三种弹出信息窗口的方式
  4. java.lang包—枚举类Enum
  5. 嵌入式C开发中用到的位域结构体
  6. Effective Java~23. 类层次优于标签类
  7. JavaScript-数据类型
  8. Java开发十大常用网站
  9. Spark 学习(十一) spark使用hive的元数据信息
  10. Spring cloud 微服务架构之Ribbon/Fegin连接超时ReadTimeout问题
  11. oracle关于时间的处理,如计算间隔天数、获取本年第一天、上月第一天、上月最后一天
  12. 增值税怎么用计算机算,增值税计算器
  13. 工作那些事(十)谈谈技术主管(总监)
  14. JAVA 清理垃圾文件简单实现
  15. 网络安全系列之二十六 EFS加密
  16. [转]自定义Drawable实现灵动的红鲤鱼动画(上篇)
  17. 关键应用在超融合环境下的实践
  18. 码支付源码完整版-安装环境配置
  19. 网络爬虫-爬取有效机构查询网(CNAS)全量数据
  20. synergy使用方法和安装包

热门文章

  1. MySQL 性能优化的 9 种姿势,面试再也不怕了!
  2. 撸了个低代码开发平台,爽!
  3. SpringBoot 线程池,也太好用了叭!
  4. 一份 Spring Boot 项目搭建模板
  5. 监控神器Prometheus用不对,也就是把新手村的剑
  6. 拨开云雾见天日:剖析单机事务原理
  7. 李沐:用随机梯度下降来优化人生!
  8. 一图胜千言!数据可视化多维讲解
  9. 谷歌发布最新看图说话模型,可实现零样本学习,多类型任务也能直接上手
  10. 北大博士干了半年外卖骑手,写出 AI 伦理论文登上顶刊,“系统知道一切”