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. AD的差分输入与单端输入

    AD的差分输入与单端输入 单端输入,输入信号均以共同的地线为基准.这种输入方法主要应用于输入信号电压较高(高于1V),信号源到模拟输入硬件的导线较短(低于15 ft,1ft=304.8mm),且所有的 ...

  2. myelipse中部署路径deploy location出现错误

    背景: 因java_web项目中的所有代码以及资源文件突然无法提交,在尝试过诸多方法无果后,果断删除项目重新将down下来.启动Tomcat无问题,使用原来的访问连接报错.经检查发现加载至Tomcat ...

  3. Rails的静态资源管理(五)—— 自定义 Asset Pipeline

    官方文档:http://guides.ruby-china.org/asset_pipeline.html http://guides.rubyonrails.org/asset_pipeline.h ...

  4. linux命令-mount挂载umount卸载

    格式化完成之后想写数据 要先挂载 //////////////////////////////////////////////////////////////////// [root@wangshao ...

  5. Hbase批量插入优化记录

    2016年5月11日10:08:29 hbase原本的put方式是一条一条的put,在客户端修改 AutoFlush 将HTable的setAutoFlush设为false,可以支持客户端批量更新.即 ...

  6. IDEA创建MAVEN 无骨架WEB 项目

    Idea创建maven带有骨架的web项目的时候,会缺少必要文件夹,而且会多出来一些我们不需要的东西 详见:IDEA创建Maven Web项目 所以我们也可以创建无骨架项目: 创建maven项目 不选 ...

  7. CDN原理解析

    首先,让我们来看一下传统的Internet网络的基本结构和数据传输情况,如下图所示 根据传统的网络结构,用户的访问流程基本如下:  用户在自己的浏览器中输入要访问的网站的域名  浏览器向本地DNS请求 ...

  8. 保研机试训练[bailianoj]

    site:http://bailian.openjudge.cn/xly2018/ 1.计算任意两天之间的天数 思路:以0为起始点计算天数,然后相减即可.这样的编码复杂度会减少很多. #include ...

  9. gym - 101673I Twenty Four, Again (表达式树枚举)

    题意及思路 模拟场上用一般方法枚举非常麻烦,一个小时没写出来,还是自己太菜了...用表达式树枚举有一个好处,判断需不需要加括号非常方便,只有当前节点运算符的优先级高于子节点的时候,才需要给子节点加一个 ...

  10. codeforces 1064D 双端队列BFS

    双端队列BFS解决的就是路径权值可能为0的图最短路问题,权值为0插入队头,否则插入队尾. 对于这个题,可以看作上下移动的路径的权值为0,左右移动权值为1,而且不能超过规定的步数. 直接广搜求覆盖的点的 ...