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. DataX安装环境搭建

    DataX环境搭建 环境搭建 Java安装(java>=1.6) JDK下载地址: http://www.oracle.com/technetwork/java/javase/downloads ...

  2. mysql update不支持子查询更新

    先看示例: SELECT uin,account,password,create_user_uin_tree FROM sys_user 结果: 表中的create_user_uin_tree标识该条 ...

  3. maven 学习 十 关于打包

    clean package -Dmaven.test.skip=true -P product 这个命令干的活: 清class文件,打包构建,跳过测试,注意最后一个 -P product, 会激活项目 ...

  4. highcharts图表显示鼠标选择的Y轴提示线

    tooltip: { shared: true, crosshairs: [true, false] },

  5. 微信小程序基础语法总结

    本文介绍微信小程序语法 配置文件 app.json的配置(全局) { // 用来配置页面的路径 "pages":[ "pages/index/index", / ...

  6. nginx 限制solr

    server { listen 80; server_name bai.com  www.bai.com; location /solr/ { allow 192.168.0.0/24; allow ...

  7. C语言学习笔记--指针概念

    指针也是一种变量,占有内存空间,用来保存内存地址,在32位系统中指针的占用的内存大小为4个字节 1.*号的意义 (1)在指针声明时,*号表示所声明的变量为指针 (2)在指针使用时,*号表示取指针所指向 ...

  8. spring整合mybatis的事物管理配置

    一.基本配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:/ ...

  9. php5.6,curl上传的变化

    $ch = curl_init ();curl_setopt ( $ch, CURLOPT_SAFE_UPLOAD, false); //php5.6要加上这个 $fields = array(); ...

  10. ???Struts2框架03 session的使用、登录逻辑【session工作原理】

    1 登录逻辑 1.1 获取登录数据(例如:用户名.密码) 1.2 在控制层调用业务层来验证数据信息 1.3 登录成功:保存用户信息(服务器用session.浏览器用cookie),跳转到主页面 1.4 ...