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

这篇具有很好参考价值的文章主要介绍了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 

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

 网格重建包含了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,从而导致较高的耗时。

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

 

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

频繁大量的实例化和单次实例化过长都是可能困扰开发者的性能问题,而缓存池、分帧加载等策略和技巧可能获得良好的优化效果。文章来源地址https://www.toymoban.com/news/detail-623459.html

到了这里,关于Unity 性能优化四:UI耗时函数、资源加载、卸载API的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity 性能优化之GPU和资源优化

    众所周知,我们在unity里编写Shader使用的HLSL/CG都是高级语言,这是为了可以书写一套Shader兼容多个平台,在unity打包的时候,它会编译成对应平台可以运行的指令,而变体则是,根据宏生成的,而打包运行时,GPU会根据你设置的宏切换这些打包出来的代码,而不是我们书写那

    2024年02月02日
    浏览(47)
  • Unity 之 一些资源标准、性能优化点整合整理

    目录 Unity 之 一些资源标准、性能优化点整合整理 零、总起 一、模型 二、图片 三、音频资源 四、灯光 五、碰撞体 六、font 七、UGUI 八、移动端性能优化心得 优化思路: 1)和美术指定好相关资源的规范 2)代码框架,合理的管理资源、多线程使用、对象池的使用、算法的优

    2024年02月05日
    浏览(34)
  • Unity性能优化笔记——UI优化

    NGUI: UGUI: 元素更新方式: NGUI: UIPanel.LateUpdate 1.轮询 2.UIPanel.UpdateWidgets UGUI: Canvas.SendWillRenderCanvas 1.队列 2.m_LayoutRebuildQueue 3.m_GraphicRebuildQueue UGUI如果Canvas没有变化Canvas.SendWillRenderCanvas是完全没有开销的 处理隐藏显示元素方式 NGUI:        1.大量的SetActive(false),       2.适量

    2024年02月08日
    浏览(31)
  • Unity 性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法

    点击封面跳转下载页面 在Unity开发中,性能优化是一个非常重要的方面。一个常见的性能优化技巧是使用ShaderUtil.GetShaderGlobalKeywords函数来获取着色器的全局。本文将介绍如何正确使用该函数,并提供一个实例代码来演示其用法。 ShaderUtil.GetShaderGlobalKeywords是Unity引擎中

    2024年02月09日
    浏览(30)
  • Webpack5构建性能优化:构建耗时从150s到60s再到10s

    作者:京东科技 牛志伟 近期对Webpack5构建性能进行了优化,构建耗时从150s到60s再到10s,下面详细讲解下优化过程。 1.历史项目基于Vue3 + Webpack5技术栈,其中webpack配置项由开发者自己维护(没有使用@vue/cli-service),并且做了环境分离。 2.项目体量大约5000个modules左右,每次本

    2024年02月03日
    浏览(38)
  • Unity 性能优化之Shader分析处理函数ShaderUtil.HasProceduralInstancing: 深入解析与实用案例

    点击封面跳转到Unity国际版下载页面 在Unity中,性能优化是游戏开发过程中非常重要的一环。其中,Shader的优化对于游戏的性能提升起着至关重要的作用。本文将深入解析Unity中的Shader处理函数 ShaderUtil.HasProceduralInstancing ,并提供一些实用案例来展示其用法。 ShaderUtil.HasProce

    2024年02月09日
    浏览(30)
  • 【Unity】AssetBundle加载与卸载

    需要注意的是同一个ab包一次只能加载一个,不可以同时加载, 报错: The AssetBundle \\\'xxxxx\\\' can\\\'t be loaded because another AssetBundle with the same files is already loaded. 如果AB包已经加载过则先进行卸载: 1、卸载全部的目前没有使用的资源: Resources.UnloadUnusedAssets() 2、卸载 AssetBundle 释放其

    2024年04月25日
    浏览(21)
  • Unity 场景加载和资源加载

    一个游戏往往都是由很多场景组成的,例如会有主界面场景、战斗场景…等,不同的场景也是由若干的资源组合而成,在游戏的制作过程中,场景和资源的加载是不可或缺的。不管是场景还是资源都会涉及到加载的问题,在什么时候进行场景或资源的加载?场景的加载和资源

    2024年02月04日
    浏览(29)
  • Unity使用 Addressables 预加载所有资源,提现加载资源,发布webgl加载缓慢问题

    Addressables 我也是刚接触,知道的不是很多,基本的用法还是知道一些的 1 .在Window–Package Manager里找到Addressables进行安装   2.选择资源,点击Assets中的一个资源,在Inspector面板上就会出现一个勾选Assressable,也就是是否加入资源打包的分组,和AssetBundle分组是一个性质。选上以

    2023年04月08日
    浏览(36)
  • Unity资源加载方式

    Resources:逻辑资源目录,这个目录中的资源会 打入到包 中, 不允许热更 。在打包时会被压缩和加密。 加载方式:Resources.Load(常用) 、 AssetDatabase.LoadAssetAtPath等加载接口 StreamingAssets:Raw资源目录,这个目录中的资源也会 打入到包 中,且允许程序通过Application.streamingAsse

    2023年04月09日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包