Unity 性能优化四:UI耗时函数、资源加载、卸载API
UI耗时函数
1.1 Canvas.SendWillRenderCanvases
这个函数是由于自身UI的更新,产生的耗时
1. 这里更新的是vertex 属性,比如 color、tangent、position、uv,修改recttransform的position、scale,rotation并不会导致顶点属性改变,因为顶点的position是根据pivot的偏移决定的,而改变其size、pivot、anchor,则会修改UI的transform属性,从而引发重建,还包括替换图片,更新文本等
2. 优化建议:隔帧更新
1.2 Canvas.BuildBatch & EmitWorldScreenspaceCameraGeometry

网格重建包含了UI更新,比如recttransform位置的改变,虽然没有UI更新,但有网格重建
1. Canvas.BuildBatch:UI元素改变导致需要重新build mesh 时,主线程调用该函数发起网格合并。
2. 合并的过程在子线程中实现,如果网格过于复杂,出现了主线程的等待,则耗时会被统计到
EmitWorldScreenspaceCameraGeometry这个函数里面
3. unity 会把同一个canvas下的所有UI合并成一个mesh,根据层级的不同,分成多个submesh,所以尽可能合批,减少submesh,减少drawcall
4. 优化建议:增加合批、动静分离
1.3 SyncTransform
对于UI元素调用SetActive(false改成true)会导致:
该Canvas下所有的同级UI元素触发SyncTransform,从而导致较高的耗时。

该Canvas的父Canvas下的同级UI元素触发SyncTransform
该UI元素同级的canvas下的UI元素不会触发SyncTransform
一句话:同级及父级下的UI元素,除了canvas 都会SyncTransform
优化建议:通过设置local scale=0/1来实现相同的效果
1.4 EventSystem.Update
EventSystem组件主要负责处理输入、射线投射以及发送事件、UI的创建会自动创建相关组件处理UI点击事件。raycast target 不用就关闭它
DrawCall优化
2.1 合并图集
尽量整合并制作图集,从而使得不同U元素的材质图集一致。图集中的按钮、图标等需要使用图片的比较小的UI元素,完全可以整合并制作图集。当它们密集地同时出现时,就有效降低了DrawCall
2.2 重叠打断合批
在同一Canvas下、材质和图集一致的前提下,要避免重叠时的层级穿插。简单概括就是,应使得符合合批条件的UI元素的“层级深度”相同;
这里的重叠,是UI元素重叠,而不是Recttransform 的重叠
2.3 Z!= 0
当UI元素的Z!=0时,也会产生合批被打断的情况
加载卸载api
1.1 Shader 耗时
Shader的解析和编译耗时一般是指,在Shader资源被加载进内存后触发的Shader.Parse()和Shader.CreateGPUProgram两种API的耗时
shader在进入一个场景的时候,是把该场景的shader一次性全部加载进来,可以通过shader变体集来优化
如果一个shader 重复打进ab包内,当每个ab包被加载的时候,就会产生一种耗时
1.2 Resources.UnloadUnusedAssets
Resources.UnloadUnusedAssets为Unity遍历所有资源的(gameobject、mono对象)引用情况并卸载Unused对象的API,一般在场景切换时由Unity自动触发或由开发者手动调用。耗时主要体现在遍历上
优化方法:
1. 减少material和粒子数量,这样会减少mono对象的数量
2. 使用assetbundle.unload、resources.unloadasset 先卸载一部分资源
resources.unloadassets:只能用于卸载resource.load的单个资源,比如材质球,纹理,等不能用来卸载gameobject、assetbundle、component,因为它们是复杂的资源。
3. 如果不切换场景,尝试在每5-10分钟调用一次该方法,释放内存
1.3 异步加载优先级
异步加载是很多项目中场景切换时加载资源的做法,但往往受Application.backgroundLoadingPriority这一API的默认设置限制而效率低下
异步方法:
Scenemanager.LoadSceneSync、Scenemanager.UnLoadSceneSync
Assetbundle.LoadAssetSync、Resources.LoadAssetSync
异步加载优先级Application.backgroundLoadingPriority:限制主线程的集成时间,单帧内最长可用异步操作时间,unity 中默认设置为BelowNormal,异步加载是在后台加载线程中进行数据读取和反序列化,然后在主线程中对其调用,调用的方式,取决于加载的资源类型,比如Texture 、Meshes 是上传到GPU对其绘制, audio clips 准备 playing.
- ThreadPriority.Low - 2ms
- ThreadPriority.BelowNormal - 4ms
- ThreadPriority.Normal - 10ms
- ThreadPriority.High - 50ms
体现到profiler中的函数为Application.IntegrateAssetslnBackground的耗时
优化方向:
异步加载时处于战斗场景:设置调高会增加主线程耗时,可能影响性能
异步加载时处于加载界面:建议设置调高,尽量缩短加载时间
1.4 加载和卸载AssetBundle
加载assetbundle的方法:
Load From Memory:
Load From File:
Load From Stream:
DownLoadHandlerAssetBundle:
压缩格式:
BuildAssetBundleOptions.None:使用LZMA算法压缩
BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4算法压缩
LZMA:stream-based,只支持顺序读取,加载需要将整个包解压
LZ4:chunk-based,支持随机读取,加载速度快
1.5 实例化和销毁对象
频繁大量的实例化和单次实例化过长都是可能困扰开发者的性能问题,而缓存池、分帧加载等策略和技巧可能获得良好的优化效果。
相关文章:
Unity 性能优化四:UI耗时函数、资源加载、卸载API
UI耗时函数 1.1 Canvas.SendWillRenderCanvases 这个函数是由于自身UI的更新,产生的耗时 1. 这里更新的是vertex 属性,比如 color、tangent、position、uv,修改recttransform的position、scale,rotation并不会导致顶点属性改变…...
【Linux】用户相关内容
如果命令ll 出现以上信息,UID为具体的数字,代表之前UID为502的用户被删除了。 更改目录或文件所属用户和所属组 在Linux中,创建一个文件时,该文件的拥有者都是创建该文件的用户。 更改所属用户 chown 用户名 文件名/目录名 更…...
基于多场景的考虑虑热网网损的太阳能消纳能力评估研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
【动态规划part10】| 121.买卖股票的最佳时机、122.买卖股票的最佳时机II
目录 🎈LeetCode121. 买卖股票的最佳时机 🎈LeetCode122.买卖股票的最佳时机II 🎈LeetCode121. 买卖股票的最佳时机 链接:121.买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定…...
java 页面html常用写法总结
(注意:本文章默认base html中已经引入bootstrap.min.css、style.css等css样式) input :输入标签 <#input required"必填" id"cycle" name"周期" underline"true" style"width:75%" itype&quo…...
阿里云服务器全方位介绍_优势_使用_租用费用详解
阿里云服务器全方位介绍包括云服务器ECS优势、云服务器租用价格、云服务器使用场景及限制说明,阿里云服务器网分享云服务器ECS介绍、个人和企业免费试用、云服务器活动、云服务器ECS规格、优势、功能及应用场景详细你说明: 目录 什么是云服务器ECS&…...
【Kafka】常用操作
1、基本概念 1. 消息: Kafka是一个分布式流处理平台,它通过消息进行数据的传输和存储。消息是Kafka中的基本单元,可以包含任意类型的数据。 2. 生产者(Producer): 生产者负责向Kafka主题发送消息。它将消息…...
【Spring框架】SpringBoot配置文件
目录 配置文件作用application.properties中午乱码问题:配置文件里面的配置类型分类SpringBoot热部署properties基本语法properties配置文件的优缺点:yml配置文件说明yml基本语法配置对象properties VS yml 配置文件作用 整个项⽬中所有重要的数据都是在…...
部署问题集合(十八)Windows环境下使用两个Tomcat
下载Tomcat Tomcat镜像下载地址:https://mirrors.cnnic.cn/apache/tomcat/进入如下地址:zip的是压缩版,exe是安装版 修改第二个Tomcat配置文件 第一步:编辑conf/server.xml文件,修改三个端口,有些版本改…...
数据结构问答8
查找 1. 一些基本概念 关键字:能唯一标识该元素 查找:给定值k,在含n个元素的表中找出关键字==k的元素。找到返回其位置信息,否则返回-1。 动、静态查找表:查找同时对表进行修改(插入、删除等),相应的表为动态,否则为静态。 内、外查找:整个查找过程在内存中进行…...
行为型设计模式之观察者模式【设计模式系列】
系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦!!! 现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everythi…...
vue2企业级项目(四)
vue2企业级项目(四) 路由设计,过场动画设计 1、router 项目下载依赖 npm install --save vue-router3.5.3src目录下创建router/index.js import Vue from "vue"; import Router from "vue-router";Vue.use(Router);con…...
(树) 剑指 Offer 26. 树的子结构 ——【Leetcode每日一题】
❓剑指 Offer 26. 树的子结构 难度:中等 输入两棵二叉树 A 和 B,判断 B 是不是 A 的子结构。(约定空树不是任意一个树的子结构) B 是 A 的子结构, 即 A 中有出现和B相同的结构和节点值。 例如: 给定的树 A: 3/ \4 5/ \1 2给定的树 B&…...
Linuxcnc-ethercat从入门到放弃(1)、环境搭建
项目开源网站 LinuxCNChttps://www.linuxcnc.org/当前release版本2.8.4 Downloads (linuxcnc.org)https://www.linuxcnc.org/downloads/可以直接下载安装好linuxcnc的实时debian系统,直接刻盘安装就可以了 安装IgH主站,网上有很多教程可供参考 git clo…...
14.Netty源码之模拟简单的HTTP服务器
highlight: arduino-light 简单的 HTTP 服务器 HTTP 服务器是我们平时最常用的工具之一。同传统 Web 容器 Tomcat、Jetty 一样,Netty 也可以方便地开发一个 HTTP 服务器。我从一个简单的 HTTP 服务器开始,通过程序示例为你展现 Netty 程序如何配置启动&a…...
万年历【小游戏】(Java课设)
系统类型 Java实现的小游戏 使用范围 适合作为Java课设!!! 部署环境 jdk1.8Idea或eclipse 运行效果 更多Java课设系统源码地址:更多Java课设系统源码地址 更多Java小游戏运行效果展示:更多Java小游戏运行效果展…...
ad+硬件每日学习十个知识点(9)23.7.20
文章目录 1.正点原子fpga开拓者无gui检查项目2.排针连接器A2541WR-XP-2P3.肖特基二极管反接在LDO的输出端,是什么用?4.在AD中如何实现批量元器件的移动?5.在PCB中,如何让元器件以任意角度旋转?6.接口设计都要做静电防护…...
ipmitool 配置BMC的ip
要使用ipmitool配置BMC的IP地址,可以按照以下步骤进行操作: 确保已安装ipmitool工具。如果尚未安装,可以使用以下命令进行安装: |复制代码 sudo yum install ipmitool连接到BMC:使用IPMI-over-LAN(通过网…...
C++设计模式::小结(creation)
creation:隐藏创建逻辑. 1) 抽象工厂模式(Abstract Factory Pattern):多层次"任选"创建对象; 实现: 1) cShape:抽象对象; cShape*:具体对象; 2) cColor:抽象对象; cColor*:具体对象; 3) cFacto…...
运维工程师第一阶段windows的学习
文章目录 计算机硬件组成计算机历史计算机硬件组成最重要的三个硬件冯诺依曼体系:组装一台电脑:虚拟机和装系统虚拟机VMware安装系统搭建局域网本地安全策略用户本地安全策略共享文件删除操作系统操作系统分类系统优化常用命令系统的启动和密码破解winodws启动过程windows系统…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
