Unity GC

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

本文由 简悦 SimpRead 转码, 原文地址 mp.weixin.qq.com

简略版本

在 Unity 中,垃圾回收(Garbage Collection,GC)采用的是基于标记-清除(Mark and Sweep)算法的自动内存管理机制。

基于标记-清除算法的垃圾回收包括以下步骤:

标记阶段(Mark): 在这个阶段,垃圾回收器会遍历程序中的对象,从根对象(如全局变量、活动线程的栈和静态变量等)开始,标记所有能够访问到的对象。这些被标记的对象被认为是“活跃”的,而未被标记的对象则被认为是“垃圾”。

清除阶段(Sweep): 在这个阶段,垃圾回收器会遍历整个堆内存,清除未被标记的对象,释放它们所占用的内存空间。这样就完成了垃圾的回收和内存的释放。

Unity 的垃圾回收器会自动管理内存,并在需要时执行垃圾回收。在游戏开发中,开发者通常不需要显式地调用垃圾回收,因为 Unity 的垃圾回收器会自动处理对象的分配和释放,以确保内存的有效使用和释放。

需要注意的是,虽然标记-清除算法是一种常见的垃圾回收算法,但它可能会产生一些性能上的开销,特别是在大型对象图和频繁的内存分配和释放时。因此,在编写 Unity 游戏时,需要注意内存的优化和对象的重复利用,以减少垃圾回收的频率,提高游戏的性能。

详细版本

在 Unity 游戏开发中,GC(垃圾回收)主要是为了自动管理内存,释放那些不再使用的对象所占的内存。当你在 Unity 中创建一个新的对象,如一个新的类、数组、列表或游戏对象,这需要占用部分内存。当这些对象不再被使用,例如从场景中移除、设置为 null、超出其活动范围等,它们就成为了 "垃圾",需要被清理。这个自动清理无用对象的过程就是垃圾回收。

Unity 的 GC 基于.NET 的内存管理和垃圾回收机制,其工作原理可以大致分为以下步骤:

  1. 标记:遍历所有的对象,找出哪些对象被引用,哪些对象没有被引用。具体做法是从根对象(例如全局对象、静态对象、栈上的对象)开始,寻找它们直接或间接引用的对象,被找到的对象被标记为 “活跃”。

  2. 清除:GC 清除那些被标记为 “非活跃” 的对象,也就是没有被任何地方引用的对象,这些对象占用的内存被认为是可以被安全回收的。清除的方式主要是将这部分内存标记为可用。

  3. 压缩:清除结束后,GC 会尝试将内存中的活跃对象压缩到一起,以减少内存碎片。这一步被称为压缩或整理。注意该步骤不是每次 GC 都会执行,因为它比标记和清除更耗时。

    C# 的 GC 是自动进行的,也可以手动调用 GC.Collect() 进行垃圾回收,但只有在需要处理大量未被引用的对象,或者需要马上释放大量内存时才建议这么做,因为 GC.Collect() 对性能的影响很大。

值得注意的是,GC 操作是非常消耗 CPU 资源的,特别是对于实时运行的游戏应用来说,任何 GC 操作都可能导致游戏卡顿。所以在开发游戏时,我们应尽可能避免频繁触发 GC,在 Unity 游戏开发中,可以通过以下方法尽可能避免或减少 GC:

  • 对象池:这是避免 GC 的最重要和最有效的方法。对象池的主要思想是重用对象,而不是创建新的对象并销毁旧的对象。例如,如果游戏中有很多敌人在不断地出现和消失,那么可以使用对象池来管理这些敌人的对象,而避免在每次需要一个新的敌人时都去创建一个新的对象。

  • 减少或避免在频繁调用的函数中创建对象:例如,在 Update、FixedUpdate、LateUpdate 等函数中如果每次都创建新的对象,则很容易引起 GC。

  • 避免使用 “+” 操作符拼接字符串:字符串是不可变的,使用 “+” 操作符拼接字符串会生成一个新的字符串对象,可以使用 System.Text.StringBuilder 来替代。

  • 使用值类型代替引用类型:值类型如 struct 在栈上分配,不会产生垃圾。尽可能地使用值类型可以减少垃圾的生成。

  • 尽量少使用 foreach 循环,在循环遍历的过程中,对于 IEnumerable 接口的对象,foreach 循环过程会产生垃圾。改用 for 循环是一种解决方法。

  • 减少 Lambda 表达式和闭包的使用:当它们引用局部变量时会生成垃圾。

  • 减少大型一次性内存分配,尽可能使用固定大小或者逐渐增长的数据结构。

  • 对于仍需要的大对象,避免经常设为 null,设为 null 后会产生大量垃圾回收。

以上就是 Unity 游戏开发中 GC 产生的一些常见原因,理解和遵循这些原则可以实现有效的内存管理,编写更优化的代码,减少垃圾产生,提升游戏性能。文章来源地址https://www.toymoban.com/news/detail-830567.html

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

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

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

相关文章

  • unity GC机制简单介绍

    GC全称是garbage collection,即垃圾回收,顾名思义就是一种释放内存垃圾的机制。这种机制主要作用在堆空间上。 堆上的变量在存储的时候,主要分为以下几步: 1)首先,unity检测是否有足够的闲置内存单元用来存储数据,如果有,则分配对应大小的内存单元; 2)如果没有足

    2024年02月04日
    浏览(32)
  • Unity 减低GC和优化

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

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

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

    2024年02月03日
    浏览(53)
  • 初学unity开发学习笔记----第一天

    以下是学习unity知识的心得,类似备忘录,肯定是存在有漏洞的地方或者专业名词使用不恰当的地方。。。 目标:编写小球wasd移动的效果 1.下载unity hub和unity引擎: (1).前往官网:Unity实时内容开发平台 -实时3D引擎、2D、VRAR可视化数据 | Unity中国官网 (2).选择unity选项卡,选择下载

    2024年02月09日
    浏览(49)
  • 【unity】Pico VR 开发笔记(基础篇)

    XR Interaction Tooikit 版本 2.3.2 一、环境搭建 其实官方文档已经写的很详细了,这里只是不废话快速搭建,另外有一项官方说明有误的,补充说明一下,在开发工具部分说明 插件安装——安装pico的sdk和XR Interaction Tooikit 环境配置——在场景里添加头显和手柄,并进行配置和项目

    2024年02月14日
    浏览(53)
  • Pico Unity Integration SDK开发笔记

    ​ ​官方文档比较详细。 在“升级XR Interaction Toolkit”时,package manager找不到,参考文档Installation | XR Interaction Toolkit | 2.1.1,我的unity版本是2021.3.1f1,则需要“Add package by name”,搜“com.unity.xr.interaction.toolkit”即可 XR Origin的PXR_Manager中勾选“Open Screen Fade”,在Camera中就会自动

    2023年04月08日
    浏览(60)
  • 【unity】Pico VR 开发笔记(视角移动)

    视角移动是简单的基础功能,这里区别于头显定位获得的小范围位移,是长距离不影响安全边界的位移方式。的 常见的位移方式有两种 ,其一是触发后 瞬间传送 到指定位置,其次是 摇杆控制视角实时移动 。XR Interaction Toolkit提供了两种位移方式的脚本,正确配置就可以实现

    2024年02月14日
    浏览(41)
  • unity开发笔记#230821-手搓一个虚拟摇杆

    做unity游戏时,如果是做手机端则需要加一个虚拟摇杆以便玩家控制角色移动(做pc端则直接获取键值即可较方便)。原理就是用Image制作一个大圆圈住一个Image小圆,玩家拖拽小圆控制角色移动。 中心思想是,以小圆中心为(0,0),获取拖拽的偏移量即可。 首先将图片资源拉入

    2024年02月12日
    浏览(41)
  • Unity插件开发笔记IMGUI-持续记录中

    插件特点,无需运行可进行编译。 1.MenuItem菜单项插件 (0)选项出现位置:编辑器上方菜单栏 。 (1)脚本放置的目录:Assets/Editor(该目录不会被打到包里)。 (2)创建如下方代码:需要命名空间UnityEditor;可自定义入口路径和自定义快捷键;MenuItem对应的自定义方法必须

    2024年01月16日
    浏览(43)
  • Unity2D RPG开发笔记 P1 - Unity界面基础操作和知识

    按下 QWERTY 可以选择不同的工具进行 旋转、定位、缩放 按下 Ctrl + D 可以复制物体 16:9 为最常见的分辨率 Transform 组件 物体在空间中的位置、缩放、旋转 点击这里可以进行 reset 操作,位置将会被重置 不知道算不算冷知识的冷知识:鼠标拖动这里可以移动该数值 Sprite Renderer

    2024年02月13日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包