Unity 性能优化四:UI耗时函数、资源加载、卸载API

news2024/9/27 9:28:34

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 实例化和销毁对象

频繁大量的实例化和单次实例化过长都是可能困扰开发者的性能问题,而缓存池、分帧加载等策略和技巧可能获得良好的优化效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/809309.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

想测试入门就必须要懂的软件开发流程

从事软件测试行业,每天面对的被测对象都是软件。如果想要更好的去完成测试工作,首先需要对被测对象,也就是对软件要有基本的了解。 软件 与计算机系统操作有关的计算机程序、可能有的文件、文档及数据。 程序好理解,就是可以操…

JS正则表达式:常用正则手册/RegExp/正则积累

一、正则基础语法 JavaScript 正则表达式 | 菜鸟教程 JS正则表达式语法大全(非常详细) 二、使用场景 2.1、校验中国大陆手机号的正则表达式 正则 /^1[3456789]\d{9}$/解释 序号正则解释1^1以数字 1 开头2[3456789]第二位可以是 3、4、5、6、7、8、…

MybatisPlus拓展篇

文章目录 逻辑删除通用枚举字段类型处理器自动填充功能防全表更新与删除插件MybatisX快速开发插件插件安装逆向工程常见需求代码生成 乐观锁问题引入乐观锁的使用效果测试 代码生成器执行SQL分析打印多数据源 逻辑删除 逻辑删除的操作就是增加一个字段表示这个数据的状态&…

本地仓库推送至远程仓库

1. 本地生成ssh密钥对 ssh-keygen -t rsa -C 邮箱2. 添加公钥到gitlab/github/gitee上 打开C:\Users\用户名\.ssh目录下生成的密钥文件id_rsa.pub,把内容复制到如下文本框中 删除Expiration date显示的日期,公钥有效期变成永久,之后点Add K…

LeetCode 刷题 数据结构 数组 485 最大连续1的个数

给定一个二进制数组 nums , 计算其中最大连续 1 的个数。 示例 1: 输入:nums [1,1,0,1,1,1] 输出:3 解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.示例 2: 输入:nums […

ROS中使用RealSense-D435

文章目录 D435简介RealSense的SDK2.0安装方法1:直接利用安装源安装注册服务器公匙将服务器添加到存储库列表安装库 方法2:利用源码安装GitHub下载librealsense安装编译依赖运行脚本cmake编译 软件显示 ROS接口安装启动节点查看话题rviz显示点云 Python接…

MySQL中IN的取值范围较大时会导致索引失效

一:分析MySQL In查询为什么所有不生效 结论:IN肯定会走索引,但是当IN的取值范围较大时会导致索引失效,走全表扫描 navicat可视化工具使用explain函数查看sql执行信息 1.1 场景1:当IN中的取值只有一个主键时 我们只需要…

怎么在线制作证件?教你一键生成证件照

无论是申请身份证、护照、驾照还是学生证,都需要一张清晰、规范的证件照。但是,为了拍摄一张完美的证件照,需要付出不少时间和精力。而现在,我们可以使用压缩图网站提供的证件照制作工具,轻松制作出一张清晰、规范的证…

力扣刷题记录---利用python实现链表的基本操作

文章目录 前言一、利用python实现链表的基本操作1.节点的定义使用类实现:1.链表的定义使用类实现:3.判断是否为空函数实现:4.链表长度函数实现:5.遍历链表函数实现:6.头插法函数实现:7.尾插法函数实现&…

手把手一起上传本地项目至Gitee仓库

1、Gitee新建仓库 创建自己的Gitee账号,新建仓库,如图所示: 根据自己的项目情况,填写仓库信息,如图所示: 仓库创建完成,如图所示: 2、下载Git 下载地址可用链接: https://registry…

xxl-Job分布式任务调度

1.概述 1.1 什么是任务调度 我们可以先思考一下业务场景的解决方案: 某电商系统需要在每天上午10点,下午3点,晚上8点发放一批优惠券。某银行系统需要在信用卡到期还款日的前三天进行短信提醒。某财务系统需要在每天凌晨0:10结算前一天的财…

流数据湖平台Apache Paimon(一)概述

文章目录 第1章 概述1.1 简介1.2 核心特性1.3 基本概念1.3.1 Snapshot1.3.2 Partition1.3.3 Bucket1.3.4 Consistency Guarantees一致性保证 1.4 文件布局1.4.1 Snapshot Files1.4.2 Manifest Files1.4.3 Data Files1.4.4 LSM Trees 第1章 概述 1.1 简介 Flink 社区希望能够将…

新材料技术的优势

目录 1.什么是新材料技术 2.新材料技术给人类带来了哪些便利 3.新材料技术未来的发展趋势 1.什么是新材料技术 新材料技术指的是通过科学和工程技术的手段开发和应用全新的材料,以满足特定的需求和应用。新材料技术是材料科学和工程领域的重要研究方向&#xff0…

【Java】使用JDBC操作MySQL 8

文章目录 1. JDBC概述2. JDBC快速入门2.1 下载驱动jar包2.2 数据准备2.3 创建工程2.4 编写代码 3. JDBC API详解3.1 DriverManager3.2 Connection3.2.1 获取执行SQL对象3.2.1 管理事务 3.3 Statement3.3.1 执行DML语句3.3.2 执行DDL语句 3.4 ResultSet3.4.1 ResultSet对象方法3…

解读 Zebec Protocol 发布的最新路线图,向 Web2 世界跨越的野望

近期,流支付协议 Zebec Protocol 发布了最新的路线图,揭示了生态在未来一年的全新发展规划。目前, Zebec Protocol 生态打造了一套全新的产品矩阵,包括模块化 Layer3 链 Nautilus Chain 、流支付应用 Zebec APP 以及薪酬管理协议 …

小红书怎么推广 方法经验总结

大家好,我是网媒智星,今天跟大家分享一下小红书怎么推广,总结一些方法经验。 小红书上的引流变现逻辑包括以下步骤: 选题—封面标题—内容评论—钩子—私域—成交—裂变 如果你希望在小红书上进行正确、安全的引流,…

Virtualbox虚拟机中Ubuntu忘记密码

1、首先重新启动Ubuntu系统,鼠标快速点一下Virtualbox虚拟机窗口获取焦点,然后按住shift键,以调出grub启动菜单。 2、根据提示按下键盘E键进入编辑模式,向下移动光标,将如下"ro quiet splash $vt_handoff"部…

Java开发环境以及项目搭建案例汇总

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 友情提示 1、 假若你的设备已有可用的Java开发基础环境,则无需重新搭建 2、 假若你需重新搭建Java开发,请务必彻底卸载之前的环境 3、 请尽量保证与…

Reinforcement Learning with Code 【Code 1. Tabular Q-learning】

Reinforcement Learning with Code 【Code 1. Tabular Q-learning】 This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced such as ZhaoShiyu’s Mathematical Foundation o…

WIZnet W5100S-EVB-Pico 静态IP配置教程(二)

W5100S是一个硬连线TCP/IP封装以太网控制器W5100S支持间接并行总线和高速SPI接口2种方式与主机进行通信。其内部还集成了以太网数据链路层(MAC)和10Base -T/100Base -T 以太网物理层(PHY),支持自动协商(10/…