[Unity]⭐浅谈Unity内存优化,内存碎片?僵尸内存?以及什么是GC垃圾回收机制。

这篇具有很好参考价值的文章主要介绍了[Unity]⭐浅谈Unity内存优化,内存碎片?僵尸内存?以及什么是GC垃圾回收机制。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

🟥 一、什么是内存?

1.物理内存  

2.虚拟内存

🟧 二、Unity的内存

1.Unity的内存分类

2.游戏运行时内存占用情况

3.什么是MONO内存?

4.内存碎片、僵尸内存

🟨三、GC 垃圾回收

1.定义

2.一张图清晰得看一下流程~

3.GC的作用及步骤

4.GC存在的问题及优化策略

🟩 四、内存优化的具体建议

1.本机内存的优化

2.优化托管内存

3.图像的一些优化建议

4.UI的一些优化建议

5.其他的一些优化建议


🟥 一、什么是内存?

内存分为物理内存、虚拟内存

1.物理内存  

也就是我们真是的硬件设备,例如内存条。

****这里引出一个概念:我们需要知道,CPU访问内存是一个慢速过程。***

访问过程具体为:先访问CacheCache包含L1L2L3,也就是一级缓存,二级缓存和三级缓存,若在这些缓存里全没找到我们要的数据,再去访问内存,接着会把找到的数据存放到Cache中,完成一次操作。

Cache中没有找到数据,我们称之为Cache Miss。因此过多的Cache Miss就会导致大量的内存和CacheIO交换,浪费大量时间

因此我们需要尽量减少Cache Miss,来提高访问速度,Unity为此提出了ECS方案,它们可以将存储在内存中的不连续数据,变为连续的数据,从而降低Cache Miss的概率。

2.虚拟内存

虚拟内存是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(Swap Space)。

🟧 二、Unity的内存

1.Unity的内存分类

unity 内存碎片如何解决,Unity,unity,游戏引擎

2.游戏运行时内存占用情况

unity 内存碎片如何解决,Unity,unity,游戏引擎

3.什么是MONO内存?

unity 内存碎片如何解决,Unity,unity,游戏引擎

4.内存碎片、僵尸内存

这里我引用了Unity官方视频里的两张图片及以为说明

Unity官方浅谈内存管理

unity 内存碎片如何解决,Unity,unity,游戏引擎

unity 内存碎片如何解决,Unity,unity,游戏引擎

A.采用分区式存储管理的系统,在储存分配过程中产生的、不能供用户作业使用的主存里的小分区称成“内存碎片”。例: 现在可用内存空间为3,但是,这3个空闲空间,并不是连续的。 所以,如果程序现在申请长度为3的内存空间,同样会申请不了,会出现内存不够的情况。

B.内存泄漏(僵尸内存)产生的原因比较简单明确,就是申请的内存已经不需要再次被使用了,但是并没有归还给内存分配器(管理器)或者系统。

🟨三、GC 垃圾回收

1.定义

在Unity中,GC(Garbage Collection,垃圾回收)是一种自动内存管理机制,它负责在运行时检测和清理不再使用的对象,以便释放内存资源。

2.一张图清晰得看一下流程~

unity 内存碎片如何解决,Unity,unity,游戏引擎

3.GC的作用及步骤

GC的主要作用在于从已用内存中找出那些不再需要使用的内存并进行释放

Mono中的GC主要有以下几个步骤:
1.停止所有需要mono内存分配的线程
2.遍历所有已用内存,找到那些不再需要使用的内存,并进行标记。
3.释放被标记的内存到空闲内存。
4.重新开始被停止的线程。

4.GC存在的问题及优化策略

unity 内存碎片如何解决,Unity,unity,游戏引擎

🟩 四、内存优化的具体建议

1.本机内存的优化

Scene

导致Native Memory增长的原因,最常见的就是Scene。因为是c++引擎,所有的实体最终都会反映在c++上,

而不会反映在托管堆上。所以当我们构建一个GameObject的时候,实际上在Unity的底层会构建一个或多个object来存储这一个GameObject的信息(Component信息等)。所以当一个Scene里面有过多GameObject存在的时候,Native Memory就会显著的上升,甚至可能导致内存溢出

注:当我们发现Native Memory大量上升时,可以先着重检查我们的Scene

Resource

Resource文件夹里的内容被打进包的时候会做一个红黑树(R-B Tree)用做索引,即检索资源到底在什么位置。所以Resource越大,红黑树越大,它不可卸载,并在刚刚加载游戏的时候就会被一直加在内存里,极大的拖慢游戏的启动时间,因为红黑树没有分析和加载完,游戏是不会启动的,并造成持续的内存压力。所以建议不要使用Resource,使用AssetBundle

unity 内存碎片如何解决,Unity,unity,游戏引擎

unity 内存碎片如何解决,Unity,unity,游戏引擎

2.优化托管内存

Destroynull

Destroy,别用null,显示的调用Destroy才能真正的销毁掉。

Destroy与null
用Destroy,别用null,显示的调用Destroy才能真正的销毁掉。

减少装箱拆箱操作

例如LINQ和常量表达式以装箱的方式实现,String.Format()也常常会产生装箱操作等

对象池

虽然VM自己有内存池,但是我们还是需要自己使用内存池来管理。

闭包和匿名函数

所有的匿名函数和闭包在c#IL代码时都会被new成一个Class(匿名class),所以在里面所有函数,变量以及new的东西,都是要占内存的。

协程

协程属于闭包和匿名函数的特例,游戏开始启动一个协程直到游戏结束才释放,错误的做法。因为协程只要没被释放,里面的所有变量,即使是局部变量(包括值类型),也都会在内存里。建议用的时候才生产一个协程,不用的时候就丢掉

配置表

一个游戏,策划往往会通过excel配置很多的配置表,然后我会在游戏中加载这些excel来读取其中的数据。但是如果excel数量非常的庞大,我们最好不要一下子全丢到内存里,建议分关加载等。

单例

慎用单例,且不要什么都往里放,因为里面的变量会一直占用内存。

3.图像的一些优化建议

unity 内存碎片如何解决,Unity,unity,游戏引擎

4.UI的一些优化建议

unity 内存碎片如何解决,Unity,unity,游戏引擎

5.其他的一些优化建议

避免在AwakeStart中添加大量的逻辑

这对游戏启动很重要,Unity会在AwakeStart方法执行后渲染第一个画面,某些情况可能会导致启动画面或是载入画面需要花更长的时间渲染,因为你必须等每个游戏对象都完成AwakeStart的执行。同时若游戏启动时,黑屏太久,提包时可能会被退审。

数据结构

也就是ArrayListDictionary等,例如在ArrayList中使用索引的成本很低,那么就适合要经常通过索引读取的情况。而要频繁增加和移除对象时,使用Dictionary是最合适的。

感谢大家的观看,您的点赞和关注是我最大的动力文章来源地址https://www.toymoban.com/news/detail-773226.html

到了这里,关于[Unity]⭐浅谈Unity内存优化,内存碎片?僵尸内存?以及什么是GC垃圾回收机制。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Unity 减低GC和优化

    对象池 : 实例:频繁创建和销毁大量临时对象,如游戏中的子弹、特效等,会引发大量的GC操作。为避免这种情况,可以使用对象池技术。当一个对象不再需要时,不立即销毁它,而是将其放入池中待复用,这样可以显著减少新对象的创建和旧对象的销毁带来的内存分配与回

    2024年02月21日
    浏览(21)
  • Unity-GC优化相关笔记

    创建对象、字符串或数组时,用于存储它的内存是从称为 堆 的中央池分配的。当此项不再使用时,其先前占用的内存可被回收并用于其他目的。在过去,通常由程序员通过适当的函数调用显式地分配和释放这些堆内存块。如今,Unity 的 Mono 引擎等运行时系统会自动为您管理

    2024年02月19日
    浏览(23)
  • Linux:进程等待究竟是什么?如何解决子进程僵尸所带来的内存泄漏问题?

     进程等待通常是指: 父进程通过wait()/waitpid()的方式,让父进程对子进程进行资源回收的等待过程!!  进程等待通常是为了解决以下两种情况: 解决子进程僵尸所带来的内存泄漏问题,对僵尸子进程进行资源回收! 原因在于当子进程僵尸后,便“刀枪不入”了。即使是

    2024年04月16日
    浏览(31)
  • 【Linux从入门到放弃】进程状态的理解以及什么是僵尸进程和孤儿进程?

    🧑‍💻作者: @情话0.0 📝专栏:《Linux从入门到放弃》 👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢! 此篇博客依然是在之前的学习基础之上继续探究关于进程的知识。   首先大家可以思考一个问题,当电脑打开一个

    2024年02月13日
    浏览(31)
  • Redis 内存碎片

    一、Redis 内存碎片 内存碎片 是指在 内存分配的时候,产生的不能重复利用的空间 。例如,内存空间还有3K,应用程序想申请连续的3K空间,虽然内存空间够,但是空间分配为2K,1K,总空间够,但是不连续,导致应用程序申请失败,这种无法利用的内存空间称之为\\\"内存碎片\\\"。

    2024年01月21日
    浏览(20)
  • Linux drm内存管理(一) 浅谈TTM与GEM,为什么我们需要TTM和GEM?

    @[TOC](Linux drm内存管理(一) 为什么我们需要TTM和GEM?) 系列文章(更新中): Linux drm内存管理(二) TTM内存管理基础概念   目前Kernel中DRM中GPU的VRAM(GPU片上显存)的管理框架是有GEM和TTM,其中TTM早于GEM出现,GEM的出现是为了解决TTM复杂的使用方法,将大部分的VRAM管理实现逻辑交由

    2023年04月20日
    浏览(32)
  • Unity内存优化技巧

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

    2024年02月07日
    浏览(37)
  • 记一次 .NET某培训学校系统 内存碎片化分析

    前些天有位朋友微信上找到我,说他们学校的Web系统内存一直下不去,让我看下到底是怎么回事,老规矩让朋友生成一个dump文件丢给我,看一下便知。 要想看托管还是非托管,可以用 !address -summary 观察下内存段。 从卦中信息的 MEM_COMMIT 和 Heap 来看,应该就是托管内存的问题

    2024年02月14日
    浏览(27)
  • SpringBoot 项目启动内存占用过高优化以及内存查看

    在使用SpringBoot 开发过程中,发现不管是本地还是测试环境只要一启动,动不动就占用1G内存,然而本地和测试环境的访问量却并没有多少,导致资源浪费; 2.1、启动命令示例(具体配置可根实际情况调整) nohup java -jar -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -Xms128m -Xmx128m -Xmn

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

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

    2024年02月13日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包