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. n年的一次聚会

    今日聚会有a,b,b1,c,d 五人一起吃饭. 先谈谈各自的变化吧. a 毕业之后,他爸给他买了一个京a的牌照,然后出印度留学,然后回到北京,现在算一个中层领导,不过比较忙,刚刚聚餐完毕就立马回去加班 ...

  2. linux指令 apt-grt指令使用

    apt-get 是linux的一条指令,主流的linux版本Debian和ubuntu都使用apt-get来安装软件.那么,需安装的软件都放在哪里呢??? apt-get 利用软件安装源来安装软件,其 ...

  3. Python:格式化操作符(%)

    原文作者:田小计划 原文出处:http://www.cnblogs.com/wilber2013/ (若转载,请标明原文出处) 在编写程序的过程中,经常需要进行格式化输出,每次用每次查.干脆就在这里整 ...

  4. 框架Mockito

    一.什么是mock测试,什么是mock对象? 先来看看下面这个示例: 从上图可以看出如果我们要对A进行测试,那么就要先把整个依赖树构建出来,也就是BCDE的实例. 一种替代方案就是使用mocks 从图 ...

  5. Solaris10安装配置LDAP(iPlanet Directory Server )

    Solaris10安装光盘自带了iPlanet Directory Server安装包,系统管理员可以利用iPlanet Directory Server在Solaris系统创建一个LDAP Serv ...

  6. 常见浏览器bug以及解决方法

    1.图片下方3像素: (1).描述:在div中插入图片时,图片会将div下方撑大三像素. (2).hack1:将</div>与<img>写在一行上(可以解决ie6/7): (3 ...

  7. getParameter的用法及含义

    equest.getparameter用来获取页面输入框输入的数据例如:jsp页面学员账户:<input type="text" name="username&qu ...

  8. import json

  9. tortoisesvn 本项目的忽略项

    https://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-propertypage.html Adding and Editing Pr ...

  10. android中finish和system.exit方法退出的区别

    finish只是将此activity推向后台,并没有释放资源. 而system.exit则是杀死进程,会释放资源