UGUI 深度優化提升手遊效能
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 基礎
術語
- Canvas or Canvases?
- dirty?
- Re-batch
- Sub-canvas
- Graphic : UI 的基礎類別
- Layout : UI 佈局,影響 UI 在畫布上的佈局
- The updates of Layout and Graphic components is called a rebuild
渲染細節
- Transparent 佇列
- Back-to-front with alpha blending
- tex2D
- High level of overdraw
- 填充率
Re-Batch
1. 保存結果,重用 Batching,直到 dirty
2. 任何組成網格發生變化
3. 如何計算 Batching
I. 網格排序
a. 深度
b. 檢查覆蓋關係
c. 材質
II. 多執行緒
Re-build
- Layout rebuilds
- Graphic rebuilds
- PerformUpdate() :: CanvasUpdateRegistry invoked by WillRenderCanvases 事件
a. Dirty Layout
b. Clipping components (such as Masks)
c. Dirty Graphic components
Layout rebuilds
- UI 元素的位置、大小發生改變
- 優先計算靠近 root 節點
- 根據層級深度、排序
Graphic rebuilds
- 頂點數據 has been marked as dirty the mesh is rebuilt
- 材質或貼圖資料 has been marked as dirty
the attached Canvas Renderer’s material will be updated
UI 優化工具
- Unity Profiler
- Unity Frame Debugger
- Xcode’s Instruments or Intel Vtune
- Xcode’s Frame Debugger or Intel GPA
Unity Profiler
- Canvas.BuildBatch:計算 Canvas Batch 過程
- 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 重建
- 生成 UI 組件,包括 Layout,字體多邊形
- Batch
- 重建會是性能貧頸嗎?
a. 同一個 Canvas 包含了大量的 UI 元素,需要計算 batch,排序等
b. 某個或某些 Canvas 太過平凡的 dirty
子物件次序
- 影響 batch 的結果
- 避免出現中間層
多級 Canvas
- 同級 Canvases
- Sub-Canvases
- 不會跨越 Canvas 進行合批
- 最少的重建消耗,最少的 DrawCall 消耗
一般準則
- 一個 Canvas
包含所有靜態和不會改變的 UI 組件 - 另一個 Canvases
存放所有動態 UI 組件
如果動態 UI 元件數量較大,可以繼續細分
輸入和射線(碰撞檢測)
- Graphic Raycaster 處理輸入
- 每個 Canvas 綁定 Graphic Raycaster,每幀檢測滑鼠的位置
- 5.4 之後的版本更加優化
- 開發者可以訂製 InputManager
射線(Raycast)優化
- 必要的 UI 組件才開啟 Raycast Target
- 開啟 Raycast Target 的 UI 元件越少,層級越淺,性能越好
- 對於複雜的控制項,盡量在根節點開啟 Raycast Target
- OverrideSorting 屬性會打斷射線,可以降低層級遍歷的層本
UI 控制項優化
- UI 字體
- 滾動視圖
UI字體
- 字體網格重建
- 動態字體和字體集
- 後備字體和記憶體
- Best Fit 和效能
- 每個字體都是獨立的四邊形
- 預留足夠的空間,避免字體出框
- 避免因字體打斷批次處理
字體網格重建
- UI Text 組件發生變化
- 父物件發生變化
- Disable 和 Re-enabled UI Text 或父物件
Enable/Disable 包含大量 UI 元件的組件,會導致掉幀
動態字體和字體集
- 運行時,根據 UI Text 元件的內容,動態生成字體圖集
- 不同的字體庫維護不同的 texture 圖集
- 字型的 size、大小寫等,都會保存不同的字型在字體集中
- 當前 Front texture 不包含 UI Text 需要顯示的字體時,當前 Font texture 需要重建
- 如果當前 Font 圖集太小,系統將嘗試重建,並加入需要使用的字型
- 如何重建字體圖集
a. 第一步,使用當前 Font 圖集的大小,並且只包含有效 UI Text 元件的字型,如果成功則結束
b. 如果當前 Font 圖集大小不滿足需求,則擴展 Font 圖集大小 - 圖集的大小只增不減
- Font.RequestCharactersInTexture 可以有效降低啟動時間
- Font 圖集重建時ㄝ只會保存當前 active UI Text component
備用字體和記憶體
- 備用字體都會被載入到記憶體
- 如果字體庫特別大,記憶體會有很大的壓力
- 字體庫裁剪
Best Fit and performance
- 自我調整到最大的整數大小
- Font 圖集壓力較大
- 一般不建議開啟
滾動視圖
- 列出所有需要顯示的 UI 組件
a. 產生實體大量的 UI
b. 重建滾動視圖
c. 只適用於少量 UI 元件的情況 - 緩存(池)所有元件
a. 適用於複雜的 UI 系統
b. 需要申請足夠大的記憶體
c. 添加 RectMask2D 元件,可以提升性能
其他
- Layout 組件很昂貴
- Disable Canvas Component
- 避免 UI 組件重疊
- 優化 UI Shader,移除多餘的特性
Unity UI Profiling Tools :
https://unity3d.com/learn/tutorials/temas/best-practices/unity-ui-profiling-tools
UGUI 深度優化提升手遊效能的更多相关文章
- web頁面優化以及SEO
轉載:https://blog.csdn.net/xustart7720/article/details/79960591 浏览器访问优化浏览器请求处理流程如下图: Etag:實體標籤.ETag是HT ...
- 一次 C# 查詢數據庫 算法優化的案例
最近有次在修改某段程式時,發現一段程式算法看起來簡單. 但背後因為多次查詢數據庫,導致效能問題. 這段程式主要是利用 EPPLUS 讀取 Excel 資料,檢查資料是否已存在數據庫中,若有就將已存在的 ...
- 阿里云移动研发平台 EMAS 助力银行业打造测试中台,提升发版效能
随着移动互联网的发展,手机银行凭借低成本.操作简单.不受时间空间约束等优势,正逐步替代传统的网银交易方式.越来越多的银行开始了“业务移动化”转型之路,“手机APP”已经成为企业价值传递和关系维护的关键 ...
- bzoj 1096: [ZJOI2007]仓库建设 斜率優化
1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2242 Solved: 925[Submit][Statu ...
- 深度学习之 mnist 手写数字识别
深度学习之 mnist 手写数字识别 开始学习深度学习,先来一个手写数字的程序 import numpy as np import os import codecs import torch from ...
- oracle批量插入優化方案
今天聽DBA説如果從一個表批量查詢出一批數據之後批量插入另外一張表的優化方案: 1)不寫歸檔日誌: 2)採用獨佔 關於insert /*+ append */我們需要注意以下三點: a.非歸檔模式下, ...
- 网易云基于 Kubernetes 的深度定制化实践
本文由 网易云发布. 2017 年,Kubernetes 超越 Mesos 和 Docker Swarm成为最受欢迎的容器编排技术.网易云从 2015 下半年开始向 Kubernetes 社区贡献代 ...
- 【深度学习系列】手写数字识别卷积神经--卷积神经网络CNN原理详解(一)
上篇文章我们给出了用paddlepaddle来做手写数字识别的示例,并对网络结构进行到了调整,提高了识别的精度.有的同学表示不是很理解原理,为什么传统的机器学习算法,简单的神经网络(如多层感知机)都可 ...
- 【ML】Predict and Constrain: Modeling Cardinality in Deep Structured Prediction -预测和约束:在深度结构化预测中建模基数
[论文标题]Predict and Constrain: Modeling Cardinality in Deep Structured Prediction (35th-ICML,PMLR) [ ...
随机推荐
- 【转载】Linux 进程调度时间测量
测试Context Switch time(进程上下文切换时间) -------------------------------------------------- 创建两个进程(实时进程) ...
- pom.xm首行报错Failure to transfer org.codehaus.plexus:plexus-components:pom:1.1.20
从SVN导出一个Maven项目,pom.xml首行报错: Failure to transfer org.codehaus.plexus:plexus-components:pom:1.1.20 fr ...
- 构建工具:webpack与grunt/gulp
1. webpack 官网:http://webpack.github.io/docs/ 中文文档:http://www.css88.com/doc/webpack2/ Webpack 是一个模 ...
- 问题:oracle long 与 clob;结果:long类型比clob到底差在什么地方?
long类型比clob到底差在什经常看到9i以上的文档,说以后 clob会逐步取代long,一直想不出, 而我在8.1.7上也测试2个字段好像 在存储上也看不出什么区别?么地方? 差别还是很大的, 比 ...
- C#调用带返回值的存储过程
()在SQL Server中建立如下的存储过程: set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[GetNa ...
- elastic(7)bulk
转自:https://www.cnblogs.com/xing901022/p/5339419.html bulk批量导入 批量导入可以合并多个操作,比如index,delete,update,cre ...
- Python操作远程机器
操作远程机器主要使用的有paramiko,WMI(Windows Management Instrumentation),SMBConnection. paramiko paramiko使用SSH2协 ...
- python之数据库的操作(课前准备)
数据库(Database)是按照数据结构来组织.存储和管理数据的仓库. 上面的就是数据库的定义. 何为数据库,简单的来说,就是我们的大型数据的存放地点. 而我们学习的呢就是数据库的访问层的制作. 何为 ...
- sed对指定行添加或删除注释
如下文本 zimu.txt aaaaa #bbbbbb cccccc dddddd 以下命令如果需要在文本中更改 需要加 -i 或者 -ri参数 用sed在aaa前加#注释 sed 's/^ ...
- ionic 页面乱码
是文本编辑器的问题.文本编辑器保存时默认保存成Encoding:ANSI编码格式,保存成utf-8就好了