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) [ ...
随机推荐
- MySQL 查询数据表里面时间字段为今天添加的计数
一: 下面这条语句查出来的count值 . 查询类型ID(category_id)为18的,今天插入的数据数, created_on: 为数据表中一字段 datetime类型, 记录此条数据添加的时 ...
- JSF中使用f:ajax标签无刷新页面改变数据
ajax本是用在前端的一种异步请求数据的操作,广泛用于js中,一般的js框架如jq都有被封装好的方法,用于发起异步请求操作.异步操作可以增强用户体验和操作,越来越多的程序都在使用ajax.JSF的fa ...
- ThreadPoolTaskExecutor异常收集
ThreadPoolTaskExecutor ipFinderThreads = new ThreadPoolTaskExecutor(); ipFinderThreads.setCorePoolSi ...
- 第九课 go的循环语句
1 for语句的三种形式 /* for 循环 */ ; a < ; a++ { fmt.Printf("a 的值为: %d\n", a) } var a, b int = 1 ...
- 2015.1.3 DataGridView中嵌入其它控件
1.按正常方法绑定待嵌入列的值,先赋值为空也行. 2.添加combbox到datagrivdview中 dvaw.Controls.Add(cb_dir); 3.添加DataGridView Mous ...
- 2015.1.10 解决DataGridView SelectionChanged事件自动触发问题
DataGridView SelectionChanged事件总是在数据源更改时自动触发,这点很讨厌. 可用CellClick和KeyUp事件和一个函数替代SelectionChanged事件 pri ...
- apache重写规则详解
RewriteEngine on 为重写引擎开关,如果设为off,则任何重写规则定义将不被应用,该开关的另一好处就是如果为了临时拿掉重写规则,则改为off再重启动Apache即可,不必将下面一条条的重 ...
- 【总结整理】AMAP学习AMAP.PlaceSearch()
http://lbs.amap.com/api/javascript-api/reference/search#m_AMap.PlaceSearch http://lbs.amap.com/api/j ...
- linux 监控内存介绍
一:系统监控:1.对cpu的监测:查看进程占用内存情况 top pid user PRI NI size RSS share stat 进程号 进程所属用户 优先级 优先级 进程所占空间 使用物理内存 ...
- ngx-bootstrap使用03 Alerts组件、利用Object.assign复制对象
1 Alerts 该组件用于给用户操作提供反馈信息或者提供一些警告信息 2 用法 2.1 下载ngx-bootstrap依赖 参考博文:点击前往 2.2 在模块级别导入AlertModule模块 技巧 ...