https://hackmd.io/s/S1z1ByaGb#UGUI-%E6%B7%B1%E5%BA%A6%E5%84%AA%E5%8C%96%E6%8F%90%E5%8D%87%E6%89%8B%E9%81%8A%E6%95%88%E8%83%BD

  • UI 基礎
  • UI 優化工具
  • UI-Canvas
  • UI 控制項優化
  • 其他

UI 基礎

術語

  1. Canvas or Canvases?
  2. dirty?
  3. Re-batch
  4. Sub-canvas
  5. Graphic : UI 的基礎類別
  6. Layout : UI 佈局,影響 UI 在畫布上的佈局
  7. The updates of Layout and Graphic components is called a rebuild

渲染細節

  1. Transparent 佇列
  2. Back-to-front with alpha blending
  3. tex2D
  4. High level of overdraw
  5. 填充率

Re-Batch

1. 保存結果,重用 Batching,直到 dirty
2. 任何組成網格發生變化
3. 如何計算 Batching
I. 網格排序
a. 深度
b. 檢查覆蓋關係
c. 材質
II. 多執行緒

Re-build

  1. Layout rebuilds
  2. Graphic rebuilds
  3. PerformUpdate() :: CanvasUpdateRegistry invoked by WillRenderCanvases 事件
    a. Dirty Layout
    b. Clipping components (such as Masks)
    c. Dirty Graphic components

Layout rebuilds

  1. UI 元素的位置、大小發生改變
  2. 優先計算靠近 root 節點
  3. 根據層級深度、排序

Graphic rebuilds

  1. 頂點數據 has been marked as dirty the mesh is rebuilt
  2. 材質或貼圖資料 has been marked as dirty
    the attached Canvas Renderer’s material will be updated

UI 優化工具

  1. Unity Profiler
  2. Unity Frame Debugger
  3. Xcode’s Instruments or Intel Vtune
  4. Xcode’s Frame Debugger or Intel GPA

Unity Profiler

  1. Canvas.BuildBatch:計算 Canvas Batch 過程
  2. Canvas.SendWillRenderCanvases
    a. 包括部分 C# scripts 調用的消耗。例 willRenderCanvases
    b. Dirty UI components will update their

Unity Frame Debugger

Screen Space - Overlay:Canvas.RenderOverlays group
Screen Space - Camera:Camera.Render group
World Space:Render.TransparentGeometry group

UI-Canvas

UI Canvas 重建
a. 子物件次序
b. 多級 Canvas
c. 一般準則
d. 輸入和射線(Raycasting)
e. 射線(Raycast)優化

UI Canvas 重建

  1. 生成 UI 組件,包括 Layout,字體多邊形
  2. Batch
  3. 重建會是性能貧頸嗎?
    a. 同一個 Canvas 包含了大量的 UI 元素,需要計算 batch,排序等
    b. 某個或某些 Canvas 太過平凡的 dirty

子物件次序

  1. 影響 batch 的結果
  2. 避免出現中間層

多級 Canvas

  1. 同級 Canvases
  2. Sub-Canvases
  3. 不會跨越 Canvas 進行合批
  4. 最少的重建消耗,最少的 DrawCall 消耗

一般準則

  1. 一個 Canvas
    包含所有靜態和不會改變的 UI 組件
  2. 另一個 Canvases
    存放所有動態 UI 組件
    如果動態 UI 元件數量較大,可以繼續細分

輸入和射線(碰撞檢測)

  1. Graphic Raycaster 處理輸入
  2. 每個 Canvas 綁定 Graphic Raycaster,每幀檢測滑鼠的位置
  3. 5.4 之後的版本更加優化
  4. 開發者可以訂製 InputManager

射線(Raycast)優化

  1. 必要的 UI 組件才開啟 Raycast Target
  2. 開啟 Raycast Target 的 UI 元件越少,層級越淺,性能越好
  3. 對於複雜的控制項,盡量在根節點開啟 Raycast Target
  4. OverrideSorting 屬性會打斷射線,可以降低層級遍歷的層本

UI 控制項優化

  1. UI 字體
  2. 滾動視圖

UI字體

  1. 字體網格重建
  2. 動態字體和字體集
  3. 後備字體和記憶體
  4. Best Fit 和效能
  5. 每個字體都是獨立的四邊形
  6. 預留足夠的空間,避免字體出框
  7. 避免因字體打斷批次處理

字體網格重建

  1. UI Text 組件發生變化
  2. 父物件發生變化
  3. Disable 和 Re-enabled UI Text 或父物件

Enable/Disable 包含大量 UI 元件的組件,會導致掉幀

動態字體和字體集

  1. 運行時,根據 UI Text 元件的內容,動態生成字體圖集
  2. 不同的字體庫維護不同的 texture 圖集
  3. 字型的 size、大小寫等,都會保存不同的字型在字體集中
  4. 當前 Front texture 不包含 UI Text 需要顯示的字體時,當前 Font texture 需要重建
  5. 如果當前 Font 圖集太小,系統將嘗試重建,並加入需要使用的字型
  6. 如何重建字體圖集
    a. 第一步,使用當前 Font 圖集的大小,並且只包含有效 UI Text 元件的字型,如果成功則結束
    b. 如果當前 Font 圖集大小不滿足需求,則擴展 Font 圖集大小
  7. 圖集的大小只增不減
  8. Font.RequestCharactersInTexture 可以有效降低啟動時間
  9. Font 圖集重建時ㄝ只會保存當前 active UI Text component

備用字體和記憶體

  1. 備用字體都會被載入到記憶體
  2. 如果字體庫特別大,記憶體會有很大的壓力
  3. 字體庫裁剪

Best Fit and performance

  1. 自我調整到最大的整數大小
  2. Font 圖集壓力較大
  3. 一般不建議開啟

滾動視圖

  1. 列出所有需要顯示的 UI 組件
    a. 產生實體大量的 UI
    b. 重建滾動視圖
    c. 只適用於少量 UI 元件的情況
  2. 緩存(池)所有元件
    a. 適用於複雜的 UI 系統
    b. 需要申請足夠大的記憶體
    c. 添加 RectMask2D 元件,可以提升性能

其他

  1. Layout 組件很昂貴
  2. Disable Canvas Component
  3. 避免 UI 組件重疊
  4. 優化 UI Shader,移除多餘的特性

Unity UI Profiling Tools :
https://unity3d.com/learn/tutorials/temas/best-practices/unity-ui-profiling-tools

UGUI 深度優化提升手遊效能的更多相关文章

  1. web頁面優化以及SEO

    轉載:https://blog.csdn.net/xustart7720/article/details/79960591 浏览器访问优化浏览器请求处理流程如下图: Etag:實體標籤.ETag是HT ...

  2. 一次 C# 查詢數據庫 算法優化的案例

    最近有次在修改某段程式時,發現一段程式算法看起來簡單. 但背後因為多次查詢數據庫,導致效能問題. 這段程式主要是利用 EPPLUS 讀取 Excel 資料,檢查資料是否已存在數據庫中,若有就將已存在的 ...

  3. 阿里云移动研发平台 EMAS 助力银行业打造测试中台,提升发版效能

    随着移动互联网的发展,手机银行凭借低成本.操作简单.不受时间空间约束等优势,正逐步替代传统的网银交易方式.越来越多的银行开始了“业务移动化”转型之路,“手机APP”已经成为企业价值传递和关系维护的关键 ...

  4. bzoj 1096: [ZJOI2007]仓库建设 斜率優化

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2242  Solved: 925[Submit][Statu ...

  5. 深度学习之 mnist 手写数字识别

    深度学习之 mnist 手写数字识别 开始学习深度学习,先来一个手写数字的程序 import numpy as np import os import codecs import torch from ...

  6. oracle批量插入優化方案

    今天聽DBA説如果從一個表批量查詢出一批數據之後批量插入另外一張表的優化方案: 1)不寫歸檔日誌: 2)採用獨佔 關於insert /*+ append */我們需要注意以下三點: a.非歸檔模式下, ...

  7. 网易云基于 Kubernetes 的深度定制化实践

    本文由  网易云发布. 2017 年,Kubernetes 超越 Mesos 和 Docker Swarm成为最受欢迎的容器编排技术.网易云从 2015 下半年开始向 Kubernetes 社区贡献代 ...

  8. 【深度学习系列】手写数字识别卷积神经--卷积神经网络CNN原理详解(一)

    上篇文章我们给出了用paddlepaddle来做手写数字识别的示例,并对网络结构进行到了调整,提高了识别的精度.有的同学表示不是很理解原理,为什么传统的机器学习算法,简单的神经网络(如多层感知机)都可 ...

  9. 【ML】Predict and Constrain: Modeling Cardinality in Deep Structured Prediction -预测和约束:在深度结构化预测中建模基数

    [论文标题]Predict and Constrain: Modeling Cardinality in Deep Structured Prediction   (35th-ICML,PMLR) [ ...

随机推荐

  1. 如果有多个集合的迭代处理情况【使用MAP】

    在SQL开发过程中,动态构建In集合条件查询是比较常见的用法,在Mybatis中提供了foreach功能,该功能比较强大,它允许你指定一个集合,声明集合项和索引变量,它们可以用在元素体内.它也允许你指 ...

  2. 【转】 Pro Android学习笔记(八九):了解Handler(3):延迟执行小例子

    目录(?)[-] 小例子 Handler的处理 Activity的代码片段 后台线程和UI的互动 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://b ...

  3. Mybatis 一对一(OneToOne)关系映射__INSERT

    今天测试Ibatis的一对一的关联映射时总是出现错误,其中很多的错误都是自己不小心写错的..现把整个Ibatis源代码记录下来,以便以后熟记: 1.数据库脚本: CREATE TABLE t_pers ...

  4. Java-API:java.util百科

    ylbtech-Java-API:java.util百科 包含集合框架.遗留的 collection 类.事件模型.日期和时间设施.国际化和各种实用工具类(字符串标记生成器.随机数生成器和位数组.日期 ...

  5. 开源JS代码前面加!,+的意义

    我们都知道,函数的声明方式有这两种 function fnA(){alert('msg');}//声明式定义函数 var fnB = function(){alert('msg');}//函数赋值表达 ...

  6. openGL 预定义变量04

    OpenGL4.0 GLSL预定义变量 GLSL为不同的渲染阶段定义了一些特定的变量.这些预定义(也叫做内置变量)有特定的属性. 所有的预定义变量都以gl_开头.用户定义的变量不能以此开头. 下面分类 ...

  7. LinearLayout线性布局搭配权重属性的使用

    在开发中,我们是通过布局来完成应用界面的搭配的,通过各种布局,我们可以完成各种复杂的界面设计.而LinearLayout也就是我们说的线性布局,这个比较简单而且使用很广泛的一种布局.下面我们通过一个D ...

  8. hadoop再次集群搭建(5)-CDH Install

       登录 http://node1.com:7180/.用户名和密码都是admin.启动服务命令是 service  cloudera-scm-server start 最开始两个页面直接conti ...

  9. 基于ActiveMQ的Topic的数据同步——消费者持久化

    前面一章中介绍了activemq的初步实现:基于ActiveMQ的Topic的数据同步——初步实现 下面来解决持久化订阅的问题: (1)使用queue,即队列时,每个消息只有一个消费者,所以,持久化很 ...

  10. 无法解决 equal to 操作中 "Chinese_PRC_CI_AS" 和 "Chinese_PRC_BIN" 之间的排序规则冲

    在两个数据库之间进行复合查询时有时会出现如下错误: 无法解决 equal to 操作中 "Chinese_PRC_CI_AS" 和 "Chinese_PRC_BIN&qu ...