在这首先回答一个问题就是:为什么我们需要实现一个描边的方案?Unity没有吗?

答:Unity肯定有自己的代替方案,只是性能看起来并没那么优越。Unity 的方案是挂载一个 OutLine 组件。

Outline

outline inherit Shadow:
【Unity】Source Code:

public class Outline : Shadow{protected Outline(){}public override void ModifyMesh(VertexHelper vh){if (!this.IsActive())return;List<UIVertex> uiVertexList = ListPool<UIVertex>.Get();vh.GetUIVertexStream(uiVertexList);int num = uiVertexList.Count * 5;if (uiVertexList.Capacity < num)uiVertexList.Capacity = num;int start1 = 0;int count1 = uiVertexList.Count;this.ApplyShadowZeroAlloc(uiVertexList, (Color32) this.effectColor, start1, uiVertexList.Count, this.effectDistance.x, this.effectDistance.y);int start2 = count1;int count2 = uiVertexList.Count;this.ApplyShadowZeroAlloc(uiVertexList, (Color32) this.effectColor, start2, uiVertexList.Count, this.effectDistance.x, -this.effectDistance.y);int start3 = count2;int count3 = uiVertexList.Count;this.ApplyShadowZeroAlloc(uiVertexList, (Color32) this.effectColor, start3, uiVertexList.Count, -this.effectDistance.x, this.effectDistance.y);int start4 = count3;int count4 = uiVertexList.Count;this.ApplyShadowZeroAlloc(uiVertexList, (Color32) this.effectColor, start4, uiVertexList.Count, -this.effectDistance.x, -this.effectDistance.y);vh.Clear();vh.AddUIVertexTriangleStream(uiVertexList);ListPool<UIVertex>.Release(uiVertexList);}}

上面的代码是Unity的源代码,我们可以发现,outline 是继承 Shadow 组件,实现的原理就是向四个方向扩张阴影部分。最主要的是

int num = uiVertexList.Count * 5;

这是不是就明了了?假设我只有一个字符时,那么我需要5倍的性能来完成这份工作。

我们看看使用Unity的方案会带来什么效果,我们上图:

5倍的数据(5 * 6),10个字符就达到了非常恐怖的300数据量。优化时非常有必要的。

下面开始进行优化。前提是先实现一套自己的描边(首先我们要复用左上和右下两个顶点)

优化方案一、网格顶点优化

主要变量:

    [SerializeField] private bool m_EnableOutLine = false;[SerializeField] private float m_OutLineWidth = 1;......//ModifyMesh(VertexHelper vh)private void _ProcessVertices(VertexHelper vh){if (!IsActive()){return;}var count = vh.currentVertCount;if (count == 0)return;for (int i = 0; i < count; i++){UIVertex vertex = UIVertex.simpleVert;vh.PopulateUIVertex(ref vertex, i);this.iVertices.Add(vertex);}vh.Clear();for (int i = 0; i < this.iVertices.Count; i += 4){UIVertex TL = GeneralUIVertex(this.iVertices[i + 0]);UIVertex TR = GeneralUIVertex(this.iVertices[i + 1]);UIVertex BR = GeneralUIVertex(this.iVertices[i + 2]);UIVertex BL = GeneralUIVertex(this.iVertices[i + 3]);vh.AddVert(TL);vh.AddVert(TR);vh.AddVert(BR);vh.AddVert(BL);}//添加三角面for (int i = 0; i < vh.currentVertCount; i += 4){vh.AddTriangle(i + 0, i + 1, i + 2);vh.AddTriangle(i + 2, i + 3, i + 0);}}

我们的思路看起来是这样的:

        /**  TL--------TR*  |          |^*  |          ||*  |          ||*  |          |v*  BL--------BR* **/

优化后(顶点下降了10点):

那么,这样的优化就可以了吗?
在用网格的方式来实现的情况下,我认为这应该算是差不多了,不排除有其他的算法。(蚊子再小也是块肉啊。)
那么还有其他方式优化吗?
有!

优化方案二、shader 描边

作者参考了网上许多的方案,觉得shader描边确实可行。参考博客:CSDN博客链接

该方案确实可行,唯一需要注意的是,它可能会导致你未描边和描边的的对象中断UI合批处理。

最后我们上一下最后Shader的优化后的效果:


我们可以看到在我们之前的优化基础上shader的描边会更加厚重和清晰,数据量也非常少。这不失为一种办法。

最后我们看下实现逻辑。
代码中有这么一些:

var v1 = graphic.canvas.additionalShaderChannels;
var v2 = AdditionalCanvasShaderChannels.TexCoord1;
if ((v1 & v2) != v2)
{base.graphic.canvas.additionalShaderChannels |= v2;
}v2 = AdditionalCanvasShaderChannels.TexCoord2;
if ((v1 & v2) != v2)
{base.graphic.canvas.additionalShaderChannels |= v2;
}v2 = AdditionalCanvasShaderChannels.TexCoord3;
if ((v1 & v2) != v2)
{base.graphic.canvas.additionalShaderChannels |= v2;
}v2 = AdditionalCanvasShaderChannels.Tangent;
if ((v1 & v2) != v2)
{base.graphic.canvas.additionalShaderChannels |= v2;
}v2 = AdditionalCanvasShaderChannels.Normal;
if ((v1 & v2) != v2)
{base.graphic.canvas.additionalShaderChannels |= v2;
}

这里的作用就是把 对应的 UIVertex 里面的对应信息开启,让对应的通道可以通过Shader开启/获取数据,然后通过这样对应的通道,提交一些描边颜色宽度等数据,提交到Shader上面,而shader通过语意来获取如 TEXCOORD0等等。Unity默认好像只开启部分,不一定全开。

shader 接到数据后就开始描边。也不是特别复杂。最后奉献上代码(含有颜色渐变喔):码云 Unity-TextOutline-and-Color-Gradient

Unity 文本颜色描边性能优化方案相关推荐

  1. Unity移动端游戏性能优化简谱之 以引擎模块为划分的CPU耗时调优

    <Unity移动端游戏性能优化简谱>从Unity移动端游戏优化的一些基础讨论出发,例举和分析了近几年基于Unity开发的移动端游戏项目中最为常见的部分性能问题,并展示了如何使用UWA的性能 ...

  2. 小猿圈web前端之网站性能优化方案

    现在前端不仅要能做出一个网站页面,还要把这个页面做的炫酷,那需要很大程度的优化,那么怎么优化才更好呢?小猿圈总结了一下自己优化的方案,感兴趣的朋友可以看一下. 一般网站优化都是优化后台,如接口的响应时 ...

  3. Unity移动端游戏性能优化简谱之 常见游戏内存控制

    <Unity移动端游戏性能优化简谱>从Unity移动端游戏优化的一些基础讨论出发,例举和分析了近几年基于Unity开发的移动端游戏项目中最为常见的部分性能问题,并展示了如何使用UWA的性能 ...

  4. Mysql性能优化方案

    2019独角兽企业重金招聘Python工程师标准>>> 内容简介:这是一篇关于mysql 性能优化的文章.网上有不少mysql 性能优化方案,不过,mysql的优化同sql serv ...

  5. kvm性能优化方案---cpu/内存/磁盘/网络

    kvm性能优化方案 kvm性能优化,主要集中在cpu.内存.磁盘.网络,4个方面,当然对于这里面的优化,也是要分场景的,不同的场景其优化方向也是不同的,下面具体聊聊这4个方面的优化细节. cpu 在介 ...

  6. 人人都能掌握的Java服务端性能优化方案

    转载自 人人都能掌握的Java服务端性能优化方案 作为一个Java后端开发,我们写出的大部分代码都决定着用户的使用体验.如果我们的代码性能不好,那么用户在访问我们的网站时就要浪费一些时间等待服务器的响 ...

  7. react性能优化方案_React灵敏且性能卓越的Spray + Akka解决方案,以“在Java和Node.js中发挥并发性和性能”...

    react性能优化方案 在我以前的文章中,我研究了一个虚拟的交易引擎,并将基于Java的阻止解决方案与基于Node.js的非阻止解决方案进行了比较. 在文章的结尾,我写道: 我怀疑随着Node.js的 ...

  8. mysql 性能优化方案

    网 上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果 ...

  9. 用友u8服务器优化,用友U8erp软件运行的性能优化方案图文教程

    今天一定要给大家分享一下用友U8erp软件运行的性能优化方案图文教程,以下方案来自用友软件官方维护工程师反馈在在处理客户问题的时候,有一类问题较为挠头,就是诸如用友U8服务器效率低下的问题.比如用友U ...

最新文章

  1. 免费教材丨第47期:业界大牛中文教学视频《深度学习:进阶》第21-24讲
  2. java string问题_Java关于String的问题?
  3. [android] 百度地图开发 (一).申请AK显示地图及解决显示空白网格问题
  4. UDP内网和外网连接通信的问题
  5. 为什么PCB板通常是绿色的?
  6. 【混淆矩阵】matlab画混淆矩阵
  7. community 计算模块度_燃气模块炉使用信息采集表
  8. 【分享】如何长时间高效学习
  9. Flask + Vue 搭建简易系统步骤总结
  10. python和java的区别-java和python的区别
  11. C#编程(二十三)----------实现继承
  12. 华为手机怎么查看ip 网关
  13. 科密考勤机RS485接头接线方法和加班计算公式
  14. support vector regression(SVR)支持向量回归
  15. html中设置背景图片为平铺,html背景图片怎么设置平铺方式
  16. C#实现给图片加边框的方法
  17. C#中的线程池使用方法
  18. SAP 各种适配器配器
  19. 清空计算机窗口记录,win7系统怎么能够清除运行对话框历史记录
  20. 「题解」关于sizeof陷阱,无符号整形,变种水仙花数

热门文章

  1. 反向传播与梯度下降详解
  2. 快乐地使用Kate编辑器进行开发(kate作为ide攻略)
  3. 怎样一键上传照片制作电子杂志?
  4. luogu插件:鼠标点击特效
  5. 802.1x认证详细剖析
  6. 数据建模(Data Modeling)是什么?
  7. XSS攻击及AntiSamy防御
  8. 股价暴涨59%后,美股二手车平台Carvana在短期内还会进一步上涨?
  9. 计算机二级Python公共基础要点+真题题库考试系统下载
  10. 蓝牙耳机什么牌子好?四大品牌蓝牙耳机推荐