Unity 0GC或者最大限度降低GC方案

文章目录

  • GC带来的问题
    • 性能瓶颈
    • 玩家体验受损
  • 优化关键点
    • 1. **对象池技术**:
    • 2. **内存管理优化**:
    • 3. **UGUI优化**:
    • 4. **ECS架构下的优化**:
    • 5. **资源管理**:
    • 6. **自定义数据结构与算法**:
    • 7. **开启增量GC(Incremental GC)**:
    • 8. **代码审查与性能分析**:
    • 9. **重用组件与MonoBehaviour实例**:
    • 10. **静态化与缓存**:
    • 11. **资源预加载**:
    • 12. **避免大型集合的操作**:
    • 13. **使用StructLayout.Pack / StructLayout.Explicit**:
    • 14. **弱引用与事件处理**:
    • 15. **自定义内存管理**:

Unity中垃圾回收(GC)频繁发生,会给游戏带来以下显著问题:

GC带来的问题

性能瓶颈

GC暂停主线程执行:当.NET的垃圾回收器开始工作时,它会暂时挂起所有程序执行以进行内存清理和整理。这意味着游戏逻辑、物理计算、渲染等都会被迫暂停,这会导致帧率下降或卡顿,影响游戏流畅度。
帧时间不一致:
由于GC的发生不可预知,其带来的延迟可能导致每一帧的时间长度不稳定,这对于实时交互的游戏体验尤其不利,特别是在需要保持稳定刷新率(如60fps)的场景。

玩家体验受损

突然的卡顿会影响玩家沉浸感,并可能导致在关键的游戏时刻出现响应延迟,比如战斗中的操作反馈或者复杂场景加载时的视觉表现。
资源浪费:
频繁的内存分配与回收也会增加系统的内存管理开销,导致整体系统效率降低,可能消耗更多的CPU周期和其他系统资源。
潜在的内存泄漏:
如果因为编程习惯不良而导致大量短生命周期对象不断产生并触发GC,则可能存在未被正确释放的内存,久而久之可能会引发内存泄漏,使得可用内存逐渐减少,最终导致游戏崩溃或其他严重问题。
因此,在Unity开发中,开发者需要密切关注代码设计,采用合适的数据结构、内存管理和对象池技术来最小化临时对象的创建和销毁,从而最大限度地减少对GC的依赖。

在Unity中实现0GC(零垃圾回收)的目标,主要是为了避免频繁触发.NET的垃圾回收机制,因为垃圾回收会导致短暂的帧率下降和性能波动。

优化关键点

1. 对象池技术

  • 对于生命周期短但创建销毁频繁的对象,如子弹、特效等,可以使用对象池来复用这些对象而不是每次需要时都创建新的实例。

2. 内存管理优化

  • 避免临时字符串或数组的频繁拼接,可使用预分配缓冲区或者专门设计用于无GC操作的字符串库(例如zstring或OneString)。
  • 长期使用的数据结构尽可能预先分配足够的空间,并避免动态扩容导致的内存碎片和GC压力。

3. UGUI优化

  • 在Unity UGUI开发中,确保对UI组件进行适当的缓存和重用,减少动态创建和销毁GameObject的行为。
  • 使用容器组件(比如CanvasScaler, LayoutGroup)时注意它们可能引发的不必要的布局计算和重建,采用UpdatePanelZeroAlloc这样的工具或方法来避免更新视图过程中的临时对象生成。

4. ECS架构下的优化

  • 使用Entity Component System (ECS) 架构,如Unity DOTS,通过实体和组件的集合式处理来降低GC负担。
  • 在ECS框架下,避免使用托管引用类型作为组件内容,转而使用值类型或结构体以保持堆栈分配。

5. 资源管理

  • 合理加载和卸载资源,利用AssetBundle和对象池策略减少运行时资源加载带来的内存分配。
  • 尽量避免大量小型纹理合并为 atlases 或使用Texture Atlas来减少内存碎片和GC调用。

6. 自定义数据结构与算法

  • 有时需要设计特定的数据结构和算法,使得它们在执行过程中不产生中间临时对象,从而避免GC。

7. 开启增量GC(Incremental GC)

  • Unity引擎支持开启增量GC模式,在某些情况下可以将垃圾回收的工作分散到多个帧上,减轻单次回收带来的卡顿感。

8. 代码审查与性能分析

  • 使用Unity Profiler或其他性能分析工具追踪内存分配情况,定位并修复内存泄漏问题以及不必要的内存分配来源。

总之,实现0GC是一个持续性的性能优化过程,需要结合具体项目情况进行细致的设计和调整。同时,虽然追求0GC是提升性能的一个手段,但在实际开发中往往难以完全避免GC,关键是合理管理和控制GC的影响范围及频率。

9. 重用组件与MonoBehaviour实例

  • 尽量复用MonoBehaviour脚本实例,避免在Update或FixedUpdate等频繁调用的方法内创建新对象。
  • 对于需要动态添加行为到游戏对象上的场景,可以考虑使用单例模式或者事件驱动机制代替临时对象。

10. 静态化与缓存

- 静态变量和全局缓存可以用于存储那些在整个游戏生命周期内都不会改变或只需创建一次的对象或数据结构。

11. 资源预加载

- 在游戏启动阶段预先加载所有必要的资源,并保持它们在内存中,而不是等到运行时再根据需求加载,这样可以减少因加载资源产生的临时对象。

12. 避免大型集合的操作

- 大型列表、数组或字典的添加、删除操作可能引发内部数组的重新分配。对于经常变动的数据集,可以采用合适的数据结构(如链表)或手动管理其容量来控制GC压力。

13. 使用StructLayout.Pack / StructLayout.Explicit

- 当使用结构体表示连续内存块时,可以利用`System.Runtime.InteropServices.StructLayoutAttribute`特性进行内存布局优化,确保没有空隙以防止GC对小对象池的影响。

14. 弱引用与事件处理

- 使用弱引用来监听事件可以减少由于强引用导致的对象无法被垃圾回收的问题。但要注意过度依赖弱引用可能导致逻辑复杂度增加,应在必要时谨慎使用。

15. 自定义内存管理

- 在极少数情况下,为了达到极致性能,可能需要通过unsafe代码或接口直接操作非托管内存,但这将极大地增加开发复杂性,且需具备深厚底层知识。

最后,请务必注意,尽管追求0GC有助于提升性能,但在实际项目中应权衡优化成本与收益,遵循“先做正确的事,再做快的事”的原则。同时,也要考虑到GC是.NET生态的重要组成部分,适当的GC工作对长期运行的程序是有益的,一味追求零GC并不总是最优解决方案。

python学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络嗅探器的设计与实现(2024)-转载

1.题目描述 参照 raw socket 编程例子,设计一个可以监视网络的状态、数据流动情况以及网络上传输 的信息的网络嗅探器。 2.运行结果 3.导入程序需要的库 请参考下面链接: 导入WinPcap到Clion (2024)-CSDN博客 4.参考代码 #define HAVE_REMOTE #define LINE_LEN …

一起玩儿物联网人工智能小车(ESP32)——24. 变量与函数(二)

摘要:本文介绍变量和函数的基本知识 在前面一篇中了解了变量,接着就来了解一下函数。函数是程序中的一个关键概念,它可以简化程序的编写,使代码更加模块化、可复用,提高程序的可读性。其实在之前已经多次遇到函数了&am…

VELO维乐携手【晓饰记】创始人胡晓,引领潮流新饰界!

不知道大家还记不记得2023年维乐带着自己满满的诚意闪现英伦时尚之都为全世界带来了一场无与伦比的视觉盛宴!而依照维乐固有的执念,从不会让自己止步的精神,维乐又带着自己的维乐坐垫找到了CoCo胡晓,【晓饰记】的首饰品牌创始人、…

Video classification with UniFormer基于统一分类器的视频分类

本文主要介绍了UniFormer: Unified Transformer for Efficient Spatial-Temporal Representation Learning 代码:https://github.com/Sense-X/UniFormer/tree/main/video_classification UNIFormer 动机 由于视频具有大量的局部冗余和复杂的全局依赖关系&#xf…

Matplotlib for C++不完全手册

matplotlib-cpp是Matplotlib(MPL)为C提供的一个用于python的matplotlib绘图库的C包装器。它的构建类似于Matlab和matplotlib使用的绘图API。 However, the function signatures might differ and Matplotlib for C does not support the full functional…

Java学习苦旅(二十六)——反射,枚举和lamda表达式

本篇博客将讲解反射,枚举和lamda表达式。 文章目录 反射定义用途反射基本信息反射相关的类Class类Class类中相关的方法 反射示例反射的优缺点优点缺点 枚举背景及定义常用方法枚举优缺点优点缺点 Lambda表达式背景语法函数式接口定义基本使用 变量捕获Lambda在集合…

在drawio中使用BPMN2.0绘制详细的业务流程图和编排模型

在drawio中使用BPMN2.0绘制详细的业务流程图和编排模型 drawio是一款强大的图表绘制软件,支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用,则直接输入网址draw.io或者使用drawon(桌案), drawon.cn内部完整的集成了drawio的所有功…

Qt pro文件

1. 项目通常结构 2.pri文件 pri文件可定义通用的宏,例如创建一个COMMON.pri文件内容为 COMMON_PATH D:\MyData 然后其它pri或者pro文件如APPTemplate.pro文件中通过添加include(Common.pri) ,QtCreator就会自动在项目结构树里面创建对应的节点 3.变量…

如何信任机器学习模型的预测结果?

在本篇中,我将通过一个例子演示在 MATLAB 如何使用 LIME 进行复杂机器学习模型预测结果的解释。 我使用数据集 carbig(MATLAB 自带的数据集)训练一个回归模型,用于预测汽车的燃油效率。数据集 carbig 是 70 年代到 80 年代生产的汽…

Android AIDL 创建的DEMO

使用AIDL创建一个demo 主要参考文件, 以及其他地址 Android 接口定义语言 (AIDL) | Android 开发者 | Android Developers 绑定服务概览 | Android 开发者 | Android Developers Android 接口定义语言 (AIDL) Android 接口定义语言 (AIDL) 与您可能使用…

倍思科技红海突围要义:紧随新趋势,“实用而美”理念从一而终

移动数码周边市场始终不缺热度。 销售端是业绩的节节高升,如在2023年京东双十一,移动数码周边产品销售成果丰硕,根据京东战报,大功率充电器成交额同比提升 200%,65W以上移动电源成交额同比提升 150%,自带线…

服务器内存不足怎么办?会有什么影响?

服务器内存,也被称为RAM(Random Access Memory),是一种临时存储设备,用于临时存放正在运行的程序和数据。它是服务器上的超高速存储介质,可以快速读取和写入数据,提供给CPU进行实时计算和操作。…

Python基础入门第八课笔记(自定义函数 lambda)

什么时候用lambda表达式? 当函数有一个返回值,且只有一句代码,可以用lambda简写。 2、lanbda语法 lambda 形参 : 表达式 注意: 1、形参可以省略,函数的参数在lambda中也适用 2、lambda函数能接收任何数量的参数但只能…

Dockerfile的EXPOSE

文章目录 环境总结测试使用EXPOSE测试1:不做端口映射测试2:-p 8080:80测试3:-P测试4:--networkhost 不使用EXPOSE 参考 环境 RHEL 9.3Docker Community 24.0.7 总结 如果懒得看测试的详细信息,可以直接看结果&#…

MYSQL篇--sql优化高频面试题

sql优化 1 如何定位及优化SQL语句的性能问题?创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因? 其实对于性能比较低的sql语句定位,最重要的也是最有效的方法其实还是看sql的执行计划,而对于mysql来说 它…

228. 汇总区间

给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中的每个区间范围 [a,b] 应该按…

[C#]使用onnxruntime部署yolov8-onnx实例分割模型

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 YOLOv8 是一个 SOTA 模型,它建立在以前 YOLO 版本的成功基础上,并引入了新的功能和改进,以进一步提升性能和灵活性。具体创新包括一个新的骨干网络、一个新…

OpenCV图像处理|1.1 OpenCV介绍与环境搭建

1.1.1 介绍 OpenCV(Open Source Computer Vision Library)开放源代码计算机视觉库,主要算法涉及图像处理、计算机视觉和机器学习相关方法。OpenCV 其实就是一堆 C 和 C语言的源代码文件,这些源代码文件中实现了许多常用的计算机视…

智慧医院预约及支付平台—智慧支付

医保支付流程 自费支付流程 智慧医院支付业务介绍 社保卡绑定(身份认证) 认证方案:银行身份已验证客户,可通过本人银行登记的手机号码登录医院APP后,在完善APP注册身份信息时,将相关信息发送苏州银行,由银行核对客户身份信息正确性并将社保卡绑定本人手机。核实后的身份…

Java:File类详解

文章目录 1、概述2、创建File实例3、常用方法3.1 获取功能的方法3.2 绝对路径和相对路径3.3 判断功能的方法3.4 创建删除功能的方法3.5 文件过滤功能的方法 4、文件夹的遍历5、综合练习5.1 创建文件夹5.2 查找文件(不考虑子文件夹)5.3 查找文件&#xff…