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) [ ...
随机推荐
- Java-API-Package:java.math
ylbtech-Java-API-Package:java.math 1.返回顶部 1. Package java.math Provides classes for performing arbit ...
- oracle 启动停止过程
oracle 主要由两部分组成:instance和database .instance是指一组后台进程/线程和一块共享内存区域,而database是指存储在磁盘上的一组物理文件. 数据库启动包括三个步 ...
- 控制器对应view生命周期
一.控制器view创建的六种方式 1.有没有同名xib创建2.通过 storyboard 创建3.有指定xib情况下创建4.有同名xib情况5.有同名去掉controll的情况6.loadveiw ...
- Shell编程实战 1.1 监控思路架构介绍
监控思路,架构介绍 需求:使用shell定制各种个性化的告警工具,但需要统一化管理,规范化管理. 思路:指定一个脚本包,包含主程序,子程序,配置文件,邮件引擎,输出日志等. 主程序:作为脚本的入口,是 ...
- openGL一些概念02
着色器程序 着色器程序对象(Shader Program Object)是多个着色器合并之后并最终链接完成的版本. 如果要使用刚才编译的着色器我们必须把他们链接为一个着色器程序对象,然后在渲染对象的时 ...
- javaScript之节点操作
javaScript程序员避免不了要操作页面中的DOM,除了经常使用的: appendChild()向childNodes列表的末尾添加一个节点. insertBefore(),接受两个参数,要插入的 ...
- java定时器控制时间打印
public class test2 { public static void main(String []args){ Timer timer=new Timer(); timer.schedule ...
- hibernate学习笔记(6)组件属性以及单表操作
组件属性:实体类中的某个属性属于用户自定义类的对象: 作用:将两个实体类合并在一起组建成一个表 在hbm.xml文件中配置: 格式: <component name="取的名字&quo ...
- 每天一道算法题(32)——输出数组中第k小的数
1.题目 快速输出第K小的数 2.思路 使用快速排序的思想,递归求解.若键值位置i与k相等,返回.若大于k,则在[start,i-1]中寻找第k大的数.若小于k.则在[i+1,end]中寻找第k+st ...
- windows 获取本机(全部)IPv4、IPv6、MAC地址方法 (C/C++)
windows下获取IP地址的两种方法: 一种可以获取IPv4和IPv6,但是需要WSAStartup: 一种只能取到IPv4,但是不需要WSAStartup: 如下: 方法一:(可以获取IPv4和I ...