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

news2024/9/25 1:25:44

文章目录

  • 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)
————————————————

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分布式事务理论及Seata实践

分布式事务简介 事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。事务的四个特征(ACID) …

算法第十三天-组合总和Ⅱ

组合总和Ⅱ 题目要求 解题思路 按顺序搜索,设置合理的变量,在搜索的过程中判断是否会出现重复集结果。重点理解对输入数组排序的作用和参考代码中 大剪枝和小剪枝 的意思 这道题域上一问的区别在于: 第39题:candidates中的数字…

构建异地企业网络互联的高效路径

在当今数字化浪潮中,企业的业务拓展已不再受限于地理位置。为了在全球竞争中立于不败之地,越来越多的企业选择在不同城市设立分支机构,构建异地网络,实现高效的协同办公。本文将深入探讨在北上广等经济发达地区,如何通…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第二天-Linux开发板外设开发(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…

PLC水箱液位控制、神经网络、PID模糊控制等Factory IO仿真

水箱液位控制的PLC仿真程序。TIA Portal V17 中的代码。该水箱在 Factory IO 3D 仿真软件中建模,将控制算法写入PLC,与Factory IO联合仿真进行实验。项目包括一个简单的自动化系统、一个带有两个泵的液罐和一个液位传感器。从 HMI 中,我们可以…

2024阿里云优惠_阿里云活动中心

2024年阿里云优惠活动大全,包括阿里云服务器优惠活动清单、配置价格表、域名优惠活动、阿里云建站活动、阿里云优惠代金券免费领取、对象存储OSS活动、企业邮箱优惠、无影云电脑优惠、CDN特惠等等,阿里云百科aliyunbaike.com分享2024阿里云优惠活动大全_…

Docker给容器添加新端口映射

Docker容器添加新端口映射 查看运行的容器 docker ps查看容器挂载目录 docker inspect [容器id]我这里是[容器name] 停止容器 docker stop pythonWarning: Stopping docker.service, but it can still be activated by: docker.socket 停止docker服务 systemctl stop dock…

el-table魔改样式出现BUG,表格内容区域出现滚动条

问题:el-table表格内容区域在高度自适应的情况下冒出滚动条 解决办法: 代码排查后发现时我设置了fixed:“xxx” 属性就会导致滚动条出现的问题,不设置则无。 [{ type: index, label: 序号, fixed: left },{ prop: enterprisesName, label: …

数据库的连接

连接数据库 我们使用WinR输入cmd打开运行窗口 输入:sqlplus并回车 输入用户名和密码,我用的是Scott,密码我自己设置的123456,Scott默认的密码是tiger,回车 这种情况表示登录成功 在连接Scott成功的情况下创建一些数据,在我的资源里面有个Oracle数据基础可以下载,直接复制粘…

09.简单工厂模式与工厂方法模式

道生一,一生二,二生三,三生万物。——《道德经》 最近小米新车亮相的消息可以说引起了不小的轰动,我们在感慨SU7充满土豪气息的保时捷设计的同时,也深深的被本土品牌的野心和干劲所鼓舞。 今天我们就接着这个背景&…

Debezium发布历史49

原文地址: https://debezium.io/blog/2019/02/19/reliable-microservices-data-exchange-with-the-outbox-pattern/ 欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯. 使用发件箱模式进行可靠的微服务数…

JSP内置对象:forward动作标记和sendRedirect()方法实现页面跳转的区别

1.forward为服务器跳转,浏览器的地址栏不变; sendRedirect()为客户端跳转,浏览器的地址栏改变变新页面的URL。 2.执行到forward标记出现处停止当前JSP页面的继续执行,而转向标记中的page属性指定的页面&am…

【Matplotlib】基础设置之图像处理05

图像基础 导入相应的包: import matplotlib.pyplot as plt import matplotlib.image as mpimg import numpy as np %matplotlib inline导入图像 我们首先导入上面的图像,注意 matplotlib 默认只支持 PNG 格式的图像,我们可以使用 mpimg.im…

一文搞定JVM内存模型

鲁大猿,寻精品资料,帮你构建Java全栈知识体系 www.jiagoujishu.cn 运行时数据区 内存是非常重要的系统资源,是硬盘和 CPU 的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM 内存布局规定了 Java 在运行过程中内存申请、…

56K star!一键拥有跨平台 ChatGPT 应用:ChatGPT-Next-Web

前言 现在围绕 openai 的客户端层出不穷,各路开发大神可以说是各出绝招,我也试用过几个国内外的不同客户端。 今天我们推荐的开源项目是目前我用过最好的ChatGPT应用,在GitHub超过56K Star的开源项目:ChatGPT-Next-Web。 ChatGP…

Java分布式锁理论(redis、zookeeper) 详解

目录 一、分布式锁有哪些应用场景? 二、分布式锁的实现方案 三、zookeeper实现分布式锁 一直不释放锁怎么办? 如何避免分布式锁羊群效应问题? 四、redis实现分布式锁 一、分布式锁有哪些应用场景? 1、定时任务 2、秒杀抢购…

XAgent调研

文章目录 1 简介2 快速测试 Quick Start3 结构分析 1 简介 XAgent(链接)是一个开源的,基于大语言模型的agent构建框架;其目标是构建出能够辅助人类处理各类任务的自动助手 定位:一个全能的,自动的辅助agen…

智邦国际ERP GetPersonalSealData.ashx接口存在SQL注入漏洞 附POC软件

@[toc] 智邦国际ERP GetPersonalSealData.ashx接口存在SQL注入漏洞 附POC软件 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…

【普中开发板】基于51单片机的温度报警器LCD1602_可调上下限( proteus仿真+程序+设计报告+讲解视频)

基于51单片机的温度报警器LCD1602_可调上下限 1.主要功能:资料下载链接: 普中开发板实物演示图:2.仿真3. 程序代码4. 设计报告5. 设计资料内容清单 【普中】基于51单片机的温度报警器LCD1602_可调上下限 ( proteus仿真程序设计报告讲解视频&a…

安全基础~信息搜集3

文章目录 知识补充APP信息搜集php开发学习理解漏洞 知识补充 端口渗透总结 python Crypto报错:https://blog.csdn.net/five3/article/details/86160683 APP信息搜集 1. AppInfoScanner 移动端(Android、iOS、WEB、H5、静态网站)信息收集扫描工具 使用教程 演示&…