Unity UGUI图文混排源码--优化版

来源:互联网 发布:空间如何绑定域名 编辑:程序博客网 时间:2024/05/21 07:08

前言

因为有不少同学反应在使用图文混排的时候,出现很大的性能问题,导致画面帧率不稳定,甚至极低。博主对此非常抱歉,当时仅凭兴趣,在一个个功能上不断叠加,几乎没有考虑到性能的优化。这次有几天的空余时间,就针对图文混排做了一次整理和优化。其实,这篇博客比较发得比较晚,在github上博主都是及时更新了代码,有兴趣的同学欢迎关注。不过,博主对图文混排并没有实际的使用机会,可能有些地方还有考虑不完善的地方,博主会尽量优化。

强制优化

  • 动态表情的帧数能少则少,我这里测试因为是使用的网络资源,每个动态表情有八张图片,在实际项目中建议两张就应该足够了。
  • 能使用静态表情,就放弃动态表情。因为动态表情是在update里计时更新图片的uv来做表情切换,如果使用静态表情就省下了很大的循环计算量。
  • 表情能少则少,不管在每个Text里,或者在整个聊天框内。根据项目的需求,可以限制Text的表情数量,或者使用对象池动态增删,不过我这里并没有去封装对象池,需要自定义。
  • 能使用单图集就不使用多图集,理由同上。
  • 如果不使用表情,肯定性能会更好,这就是一句废话。这里的强制优化都是从最直观的去节省性能,简单粗暴,而且效果较好。

配置文件替换字符解析

  • 之前的版本是将表情名称,大小,比例等一系列参数,放在Text里面通过SetVerticesDirty函数在最开始解析获得。现在将这些参数都写到了SpriteAsset里面,并且在编辑器中可编辑。然后只需要在最开始读取一下SpriteAsset的文件,就知道当前信息,比如表情的名称,每个表情里有哪些Sprite,每个Sprite的大小,uv等相关信息。
  • 示例截图:
    这里写图片描述
  • 这里还新增加了一个标签的变量,在前期需要配置的,就是把一个动态表情的所有Sprite都统一选择到同一标签下
    这里写图片描述

简化正则表达式

  • 转化对比:<quad name=test Size=24 Wdith=1 />->[#test]
支持多图集
  • 支持多图集:[图集ID#表情名称],图集ID对应SpriteAssets的ID,表情名称对应SpriteAssets的标签,ID为0时,可省略不写
    这里写图片描述
支持超链接
  • 支持超链接,图集ID输入为-1时,就默认为超链接,后面则为链接名称,示例[-1#超链接名称],并且在InlineText有一个OnHrefClick事件可以监听点击
    这里写图片描述

避免sprite的重复绘制

  • 将之前版本的世界坐标信息,转化为本地坐标,只要相对父物体的位置信息不变,也可以避免重复绘制。在之前版本,因为这个原因拖动Scroll View会造成大量多余的计算,导致帧率极低。
  • 增加SpriteGraphic模型的对比封装,以标签和位置信息作为对比参数,如果一样,就不再进行图片绘制

    #region 模型数据信息private class MeshInfo{    public string[] _Tag;    public Vector3[] _Vertices;    public Vector2[] _UV;    public int[] _Triangles;    //比较数据是否一样    public bool Equals(MeshInfo _value)    {        if (_Tag.Length!= _value._Tag.Length|| _Vertices.Length!= _value._Vertices.Length)            return false;        for (int i = 0; i < _Tag.Length; i++)            if (_Tag[i] != _value._Tag[i])                return false;        for (int i = 0; i < _Vertices.Length; i++)            if (_Vertices[i] != _value._Vertices[i])                return false;        return true;    }}#endregion

重写文本所占宽高

因为文本会根据正则增加一些其他的字符串到text中,于是默认的preferredWidth和preferredHeight就不再准确,这里根据实际的text内容重新计算,方便做聊天气泡等功能的文本所占宽高获取

增加层级管理

增加一个InlineManager脚本,由它来管理子物体中所有的SpriteGraphic和InlineText,并保证两者的正确联系与层级管理。
这里也就可以创建多个InlineManager,来保证每一个之间的互不干扰。

新增快捷创建

你可以像创建其他UI一样,点击GameObject/UI/TextInline,直接创建默认的UI预设。

源码链接

github:https://github.com/coding2233/TextInlineSprite

问题遗留

  • 在编辑器中,会造成系统的异常卡顿,在另一台win7系统没有影响,有影响的系统为win10;
  • 对于在编辑模式下表情的预览绘制逻辑整理;
  • 对于在运行模式下的逻辑流程的整理;
  • 偶尔可能会出现一些非正常的表现;
原创粉丝点击