若愚

  • 首页
  • 书生意气
  • 随心杂谈
  • 技不压身
  • 游戏人生
  • 吾辈简介
    • 吾辈简介
    • 慷概解囊
独坐静思
半截薄衣轻推窗,灯火阑珊夜微凉; 独坐残床不思量,一盏昏灯照孤郎。
  1. 首页
  2. 技不压身
  3. 正文

UGUI优化注意

2021年3月27日 27点热度 0人点赞 0条评论

一、资源管理及命名规则

通用和各个功能区分,提高图集利用率

二、纹理格式的选择

Android

ETC1不带透明通道,ECT2带透明通道

Unity RGBA Crunched ETC2会比ETC2加载更快,而且包体会更小

通道分离,Unity还能将图片设置成alpha8格式

IOS

不带透明推荐PVRTC(也可透明)ASTC5x5,透明ASTC4x4

ASTC大小计算

像素大小 = 16-bytes / 分块宽高 * 8-bit

压缩率 = 原始像素大小(32-bit) / 像素块大小

图像大小 = 原始图片大小 / 压缩率

注:一张1024*1024图片原始为4M(RGBA32)32位

选择要求

ETC1、ETC2以及ASTC 4X4要求尺寸大小被4整除

PVRTC要求正方形2的幂

ETC2只支持OpenGL ES 3.0以上的Android(约2013年以后)

ASTC只支持苹果A8以后的设备(iphone6以后)

三、UI事件注意

取消掉UI中用不到的raycastTarget

取消没有事件响应的Canvas可以不用GraphicRaycaster

可以利用脚本查看是否有事件DebugUILine

#if UNITY_EDITOR
using UnityEngine;
using UnityEngine.UI;
public class DebugUILine : MonoBehaviour
{
		static Vector3[] fourCorners = new Vector3[4];
		void OnDrawGizmos()
		{
			foreach (MaskableGraphic g in GameObject.FindObjectsOfType<MaskableGraphic>())
			{
				if (g.raycastTarget)
				{
					RectTransform rectTransform = g.transform as RectTransform;
					rectTransform.GetWorldCorners(fourCorners);
					Gizmos.color = Color.blue;
					for (int i = 0; i < 4; i++)
						Gizmos.DrawLine(fourCorners[i], fourCorners[(i + 1) % 4]);

				}
			}
		}
}
#endif

 

可以给任意利用脚本给任意物体增加事件UIEventTriggerBox

using UnityEngine;
using UnityEngine.EventSystems;

public class UIEventTriggerBox : EventTrigger
{
    public System.Action onClick;
    public System.Action onDown;
    public System.Action onEnter;
    public System.Action onExit;
    public System.Action onUp;
    public System.Action onSelect;
    public System.Action onUpdateSelect;

    static public UIEventTriggerBox Get(GameObject go)
    {
        UIEventTriggerBox listener = go.GetComponent<UIEventTriggerBox>();
        if (listener == null) listener = go.AddComponent<UIEventTriggerBox>();
        return listener;
    }

    public override void OnPointerClick(PointerEventData eventData)
    {
        if (onClick != null) onClick();
    }
    public override void OnPointerDown(PointerEventData eventData)
    {
        if (onDown != null) onDown();
    }
    public override void OnPointerEnter(PointerEventData eventData)
    {
        if (onEnter != null) onEnter();
    }
    public override void OnPointerExit(PointerEventData eventData)
    {
        if (onExit != null) onExit();
    }
    public override void OnPointerUp(PointerEventData eventData)
    {
        if (onUp != null) onUp();
    }
    public override void OnSelect(BaseEventData eventData)
    {
        if (onSelect != null) onSelect();
    }
    public override void OnUpdateSelected(BaseEventData eventData)
    {
        if (onUpdateSelect != null) onUpdateSelect();
    }
}

 

四、控件扩展和优化

ScrollRect无限列表优化

Mask和RectMask2D选择,Mask用Image做裁切区域,RectMask2D用大小作为区域,多个RectMask2D之间不能合批

尽量少使用Layout组件

继承BaseMeshEffect重写ModifyMesh可以修改顶点数据,可以实现flip(反转),mirror(镜像)等效果

尽量不适用Text描边等效果

五、优化技巧

减少gameobject控制显示隐藏,可以利用Canvas的alpha控制显示隐藏

持续性的UI动效可以脱离UI通过粒子实现

动态UI和静态UI用新的Canvas区分开,避免不必要的重绘

多个联系不大的UI,如Tab切换UI的可以做多个UI,避免过多的加载,如角色管理UI

一次性加载过多图片的UI,可以进行分帧加载处理,如图鉴,立绘等加载

如果UI加载过慢,可以使用Profiler监测,查看代码效率

可以给UI统一的的Update机制增加一个SecondUpdate,用来处理倒计时等不需要每帧刷新的逻辑

如果上层是全屏UI,下层消耗大的UI可以关闭Canvas和GraphicRaycaster,如主UI或战斗UI

多个Image的显示隐藏,尽量不使用显示隐藏,而是替换Image的Sprite

血条如果可以可以使用SpriteRenderer或者3DText

本作品采用 知识共享署名-禁止演绎 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2021年3月27日

苹果蘸大蒜

有人看我志气昂,谁又听我半世伤; 只盼白发江渚上,执手泪眼话沧桑。

点赞
下一篇 >

文章评论

取消回复
最新 热点 随机
最新 热点 随机
减肥 大丈夫 UGUI自定义字体 Unity热更简单思路 名人冒险岛
UGUI优化注意名人冒险岛Unity热更简单思路UGUI自定义字体大丈夫
吾家有女 龙抬头 归去兮 减肥 Unity热更简单思路
文章类型
  • 书生意气 (8)
  • 技不压身 (3)
  • 游戏人生 (1)
  • 随心杂谈 (1)
  • 随心杂谈 (2)
最近评论
名人冒险岛

COPYRIGHT©2021 SiYu
隐私政策

豫ICP备19041692号