Unity UI内存泄漏优化

这篇具有很好参考价值的文章主要介绍了Unity UI内存泄漏优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目一运行,占用的内存越来越多,不会释放,导致GC越来越频繁,越来越慢,这些都是为什么呢,今天从UI方面谈起。

首先让我们来聊聊什么是内存泄漏呢?

一般来讲内存泄漏就是指我们的应用向内存申请了一块地址,然后这块地址的相关引用全部丢失了,这块内存无法再被分配,在计算机眼里,那就是丢了,找不回来了,除非重启。。。

不过,这里如果我们要去理解Unity中的内存泄漏,那我们首先要了解一下Unity的内存分配机制和GC机制,哇,不过说真的,要真是细说这两点,那真是几天都讲不完呀,还是算了,哈哈,这里大概聊一下,

程序在运行的时候,会先从计算机中申请一块内存,这时候如果我们需要去申请一块地址的时候,Unity会先去从堆内存中找合适大小的地址块给我们,但是这时候,如果堆内存用完了,这时候GC就出马了,会先清理一遍当前内存中无用的数据然后给我们分配所需要的内存块,那这个时候如果GC之后还是没有找到足够大小的内存给我们用怎么办呢,Unity只能去在申请一块之前内存2倍大小的内存了。

这时候来想想,如果在我们的项目中这如果不断重复上述步骤,那么这时候是不是就意味着内存泄漏了呢。。。  现在就让我们开始从实际情况来一探究竟吧!!!

一开始我们通过Unity的Profiler工具只能看到在我们的UI已经关闭销毁了可是UI里面用到的图集还在内存里面存在,不应该呀,如果图集不释放,那岂不是意味着我们如果打开很多UI的时候,这些图集资源就要占到很多内存,如何查看当前内存中图集情况,可以参考下图,先选中Memory模块,然后选择Detailed,点击Take Sample Playmode,这时候内存中的图集就出现在下面了,参考5的位置,这里说明一下位置4这个选项,如果不勾选,进行内存采样速度会快很多,勾选了会慢很多,但是会同时采样出对应资源当前的引用情况。

Unity UI内存泄漏优化,Unity,unity,性能优化

这时候我们通过对游戏中不同节点进行内存采样,便能分析出我们哪些图集没有随着预设的销毁而销毁。

问题已经找到了,那么如何解决呢,如何下手呢,这时候又不知道怎么办了,害!!!

Unity UI内存泄漏优化,Unity,unity,性能优化

 但是生活还要继续,问题还得解决呀,那么接下来就开始了问题分析,无数次Demo测试,从AB包加载卸载,到Unity内存分配管理,从GC的工作方式,到GC的底层实现原理,终于发现了这几个问题。

首先,如果我们的项目是通过AssetBundle方式加载的,那么在我们切场景或者进行阶段变化的时候我们需要处理一下无用资源的释放,调用一下下面的接口。

Resources.UnloadUnusedAssets();

 卸载未使用的资源

 这时候我们在进行内存对比分析的时候会发现会有一些内存被释放,可是图集不销毁的问题还在,害,还以为挺简单的,目前看来问题更复杂了。。。

这时候用上了另一个工具Memory Profiler,这个工具是在Unity2020之后的版本推出的功能,对当前内存进行快照,可视化的形式显示当前内存分配的大小,列出了每个托管对象的类型,值,占用大小,地址,被引用链等等信息,还可以进行快照对比,分析两次内存快照新增、删除和保持不变的内存对象,从而更方便快捷的定位项目内存的使用情况。

通过对内存进行快照,分析图集的引用链,屏蔽代码,重新快照测试,一次次的测试,慢慢缩小代码范围,定位图集不销毁的原因,最终发现原来是我们的UI使用了static实例来实现单例效果,在其他地方调用,但是在我们UI不需要的时候并没有将这个静态单例设置为null,导致整个UI资源的相关引用一直存在,无法释放,还有就是我们在对按钮进行事件注册的时候,使用了项目封装的接口,而项目封装的接口在拿到委托事件对象后,并没有在移除事件的时候去清除委托事件对象,导致引用一直存在,相关的资源也就无法释放。

Unity UI内存泄漏优化,Unity,unity,性能优化

相信经过上述步骤之后我们的图集不销毁问题已经解决了大部分了,具体还有哪些,后面有需要我们再补充,哈哈。

这里再说一个图片不销毁问题,在项目中我们经常会去动态替换某些图片来实现我们的功能,这时候有一个统一接口就很方便了,可是图片不销毁问题也正好跟这个动态替换接口有关,由于我们的统一接口会保存一份加载的图片的引用,在对应预设销毁的时候,由于图片引用一直存在,所以图片就无法被GC处理掉,这时候我们可以考虑对我们动态加载的图片进行场景管理,在合适的时候清空一次引用列表,还有由于我们动态图片加载是自己管理加载资源,所以我们在清空列表的时候要调用一次对应接口的卸载资源接口,否则,资源还是无法从内存中释放。

目前为止,图集图片不销毁问题已经解决了大部分,至于项目中具体还有没有其他问题导致,有待后续研究,,,总结一下:

  • 使用了static静态类方式来实现单例的UI,在使用完之后一定记得将对应单例设置为null,让GC可以去释放对应的内存。
  • 在使用委托或者其他时候,拿到类对象的引用在使用完之后一定要记得释放引用。
  • 加载的资源在不适用的时候记得卸载掉,比如AssetBundle.Load()和AssetBundle.Unload()
  • 在适当的时机调用Resource.UnloadUnusedAssets()接口释放无用的资源

简而言之,言而简之,内存优化一直是项目开发中的重头戏,任重而道远呀。。。

Unity UI内存泄漏优化,Unity,unity,性能优化

 心怀梦想    奔向远方 文章来源地址https://www.toymoban.com/news/detail-653428.html

到了这里,关于Unity UI内存泄漏优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Android性能优化之修复游戏中内存泄漏(java层)

    游戏在bugly上内存OOM越来越严重,因此,近期对内存进行优化。从java层的内存进行优化开始,通过LeakCannary或者adb shell 获取到内存快照,发现好几处内存泄漏点。 1.单例类持有Activity : 查看内存快照,该闪屏页面Activity(包含引用对象)可回收3.8M的内存; LeakCannary的内存分析也

    2024年02月15日
    浏览(54)
  • Unity 性能优化四:UI耗时函数、资源加载、卸载API

    1.1 Canvas.SendWillRenderCanvases 这个函数是由于自身UI的更新,产生的耗时 1. 这里更新的是vertex 属性,比如 color、tangent、position、uv,修改recttransform的position、scale,rotation并不会导致顶点属性改变,因为顶点的position是根据pivot的偏移决定的,而改变其size、pivot、anchor,则会修改

    2024年02月14日
    浏览(39)
  • C# 性能优化和Unity性能优化

    C# 性能优化是一个非常广泛的话题,需要从各个方面来考虑,包括算法和数据结构、编译器优化、代码优化等等。下面是一些常见的 C# 性能优化技巧: 选择正确的数据结构:C# 提供了各种不同的数据结构,例如数组、列表、字典等等。选择正确的数据结构可以大大提高代码

    2024年02月10日
    浏览(39)
  • [Unity]⭐浅谈Unity内存优化,内存碎片?僵尸内存?以及什么是GC垃圾回收机制。

    目录 🟥 一、什么是内存? 1.物理内存   2.虚拟内存 🟧 二、Unity的内存 1.Unity的内存分类 2.游戏运行时内存占用情况 3.什么是MONO内存? 4.内存碎片、僵尸内存 🟨三、GC 垃圾回收 1.定义 2.一张图清晰得看一下流程~ 3.GC的作用及步骤 4.GC存在的问题及优化策略 🟩 四、内存优

    2024年02月03日
    浏览(41)
  • Unity内存优化技巧

            当涉及到Unity游戏的开发和优化时,内存管理是一个非常重要的方面。合理地管理和优化内存可以显著提高游戏性能并减少资源消耗。在本篇博客中,我们将探讨一些Unity内存优化的技术,并附带代码实现和注释,以帮助你更好地理解这些概念。         在游戏

    2024年02月07日
    浏览(39)
  • Unity内存分析与优化实践

    在移动端项目中,内存占用是一项非常重要的指标,一般都会被严格控制其大小,否则会导致内存占用过大而影响其他功能的使用。而在移动端Unity中,由于嵌入了Unity引擎,内存占用会一下子飙升,如果控制不好内存的增长,恐怕许多项目都不会允许Unity嵌入到移动端中,在

    2024年02月13日
    浏览(43)
  • Unity性能优化篇(十一) 动画优化

    1.恰当地设置Animator组件的Culling Mode。Always Animate表示如果该动画不可见,也会播放它。Cull Update Transformations表示如果该动画不可见,则不会渲染该动画,但是依然会根据该动画的播放来改变游戏对象的位置、旋转、缩放,这样是常用的选项。Cull Completely表示完全不会播放该动

    2024年03月11日
    浏览(42)
  • Unity 内存性能分析器 (Memory Profiler)

    安装有两种 方式一: add package : com.unity.memoryprofiler 方式二: From Packages : Unity Registry 搜索 Memory Profiler 打开:Windows - Analysis - Memory Profiler 打开MemoryProfiler界面,可以链接真机检测,也可以在Editor检测。 点击Capture 保存当下帧的内容。 Capture 完毕之后,会保存本地一个镜像 :

    2024年02月03日
    浏览(58)
  • Unity 性能优化基础

    首先贴出官方文档。 DrawCall 即绘制调用命令,CPU在准备好渲染数据并设置渲染状态后,会通过Drawcall命令通知GPU进行渲染。 Canvas Canvas是一个 Native 层实现的Unity组件,被 Unity 渲染系统用于在游戏世界空间中渲染分层几何体(layered geometry)。 Canvas 负责把它们包含的Mesh合批,

    2024年02月06日
    浏览(25)
  • Unity性能优化 - 动态图集

    Unity 动态图集是 Unity 引擎中用于处理游戏纹理优化的一种技术。它可以将多个纹理打包到一个图集中,减少游戏中需要加载的纹理数量,从而提高游戏性能。 在运行时,Unity 动态图集会根据游戏需要动态地生成纹理,并将它们打包到一个图集中,这样可以大幅降低游戏加载

    2024年02月13日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包