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) [ ...
随机推荐
- maven jetty 配置
对于jdk8增加如下配置: <plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jett ...
- Facebook开源的JavaScript库:React
React是Facebook开源的JavaScript库,采用声明式范例,可以传递声明代码,最大限度地减少与DOM的交互. React是Facebook开源的JavaScript库,用于构建UI.你可 ...
- 手机定位室内gps没信号
手机定位一般分3种,gps,手机信号基站,上网地点,其中gps信号一般只有户外有,所以在室外的时候只开启定位和gps就可以定位了,但是在室内没有gps的情况,就需要开网络定位了.
- Windows注册表各个作用
与注册表有关的术语1.注册表:是一个树状分层的数据库(如图).从物理上讲,它是System.dat和User.dat两个文件;从逻辑上讲,它是用户在注册表编辑器中看到的配置数据.2.HKEY :“根键 ...
- 监控和安全运维 1.6 nagios监控客户端-2
6. 继续添加服务服务端 vim /etc/nagios/objects/commands.cfg 增加: define command{ command_name check_nrpe comman ...
- 部署和调优 3.3 dns安装配置-3
只有一台DNS服务器是不保险的,现在给他配置个从服务器. 在另外一台虚拟机上安装配置DNS服务器.先查看虚拟机ip为:192.168.1.111 ifconfig 给从安装bind和dig命令 yum ...
- 部署和调优 2.7 mysql主从配置-1
MySQL 主从(MySQL Replication),主要用于 MySQL 的时时备份或者读写分离.在配置之前先做一下准备工作,配置两台 mysql 服务器,如果你的机器不能同时跑两台 Linux虚 ...
- [Python Study Notes]物体运动检测
基于opencv的cv2模块实现 ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...
- struts2学习笔记(2)action多个方法的动态调用
①在struts.xml中的action添加method <action name="addhelloworld" method="add" class= ...
- 【总结整理】关于ArcGIS中拓扑的理解
空间拓扑: https://www.baidu.com/link?url=f8fd1d75GhwtT1JuyPDZydZlWCgEXB9DeuTzDqGQIIRpq0bM-8t3MlC5tXYvEwQ ...