慎用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
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实现原理分析相关推荐
- 慎用Outline UGUI Outline实现原理分析
使用 UGUI 制作背包的时候,同事发现如果背包中添加了大量的物品,比如两百个,Unity就会出错,提示 Canvas element contains more than 65535 vertice ...
- 可视化拖拽组件库一些技术要点原理分析(三)
本文是可视化拖拽系列的第三篇,之前的两篇文章一共对 17 个功能点的技术原理进行了分析: 编辑器 自定义组件 拖拽 删除组件.调整图层层级 放大缩小 撤消.重做 组件属性设置 吸附 预览.保存代码 绑 ...
- java signature 性能_Java常见bean mapper的性能及原理分析
背景 在分层的代码架构中,层与层之间的对象避免不了要做很多转换.赋值等操作,这些操作重复且繁琐,于是乎催生出很多工具来优雅,高效地完成这个操作,有BeanUtils.BeanCopier.Dozer. ...
- Select函数实现原理分析
转载自 http://blog.chinaunix.net/uid-20643761-id-1594860.html select需要驱动程序的支持,驱动程序实现fops内的poll函数.select ...
- spring ioc原理分析
spring ioc原理分析 spring ioc 的概念 简单工厂方法 spirng ioc实现原理 spring ioc的概念 ioc: 控制反转 将对象的创建由spring管理.比如,我们以前用 ...
- 一次 SQL 查询优化原理分析(900W+ 数据,从 17s 到 300ms)
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:Muscleape jianshu.com/p/0768eb ...
- 原理分析_变色近视眼镜原理分析
随着眼镜的发展,眼镜的外型变得越来越好看,并且眼镜的颜色也变得多姿多彩,让佩戴眼镜的你变得越来越时尚.变色近视眼镜就是由此产生的新型眼镜.变色镜可以随着阳光的强弱变换不同的色彩. 变色眼镜的原理分析 ...
- jieba分词_从语言模型原理分析如何jieba更细粒度的分词
jieba分词是作中文分词常用的一种工具,之前也记录过源码及原理学习.但有的时候发现分词的结果并不是自己最想要的.比如分词"重庆邮电大学",使用精确模式+HMM分词结果是[&quo ...
- EJB调用原理分析 (飞茂EJB)
EJB调用原理分析 EJB调用原理分析 作者:robbin (MSN:robbin_fan AT hotmail DOT com) 版权声明:本文严禁转载,如有转载请求,请和作者联系 一个远程对象至少 ...
最新文章
- 【Android 异步操作】Handler 机制 ( MessageQueue 消息队列的阻塞机制 | Java 层机制 | native 层阻塞机制 | native 层解除阻塞机制 )
- 图解OpenLayers-2.13.1入门实例
- c#web页面显示弹窗_C#中三种弹出信息窗口的方式
- java.lang包—枚举类Enum
- 嵌入式C开发中用到的位域结构体
- Effective Java~23. 类层次优于标签类
- JavaScript-数据类型
- Java开发十大常用网站
- Spark 学习(十一) spark使用hive的元数据信息
- Spring cloud 微服务架构之Ribbon/Fegin连接超时ReadTimeout问题
- oracle关于时间的处理,如计算间隔天数、获取本年第一天、上月第一天、上月最后一天
- 增值税怎么用计算机算,增值税计算器
- 工作那些事(十)谈谈技术主管(总监)
- JAVA 清理垃圾文件简单实现
- 网络安全系列之二十六 EFS加密
- [转]自定义Drawable实现灵动的红鲤鱼动画(上篇)
- 关键应用在超融合环境下的实践
- 码支付源码完整版-安装环境配置
- 网络爬虫-爬取有效机构查询网(CNAS)全量数据
- synergy使用方法和安装包