Unity 减低GC和优化

文章目录


在Unity中,垃圾收集(Garbage Collection, GC)是一项重要的内存管理机制,但过度的GC活动可能会导致性能瓶颈。优化Unity项目中的GC涉及减少不必要的对象分配和生命周期管理。以下列举了五个实例来详细说明如何降低GC负担并进行优化:

  1. 对象池

    • 实例:频繁创建和销毁大量临时对象,如游戏中的子弹、特效等,会引发大量的GC操作。为避免这种情况,可以使用对象池技术。当一个对象不再需要时,不立即销毁它,而是将其放入池中待复用,这样可以显著减少新对象的创建和旧对象的销毁带来的内存分配与回收。
    public class BulletPool : MonoBehaviour
    {private Queue<Bullet> availableBullets = new Queue<Bullet>();public void GetBullet(out Bullet bullet){if (availableBullets.Count > 0){bullet = availableBullets.Dequeue();bullet.gameObject.SetActive(true);}else{bullet = Instantiate(bulletPrefab);}}public void ReturnBullet(Bullet bullet){bullet.gameObject.SetActive(false);availableBullets.Enqueue(bullet);}
    }// 在使用时:
    Bullet bullet;
    bulletPool.GetBullet(out bullet);
    // 使用完后:
    bulletPool.ReturnBullet(bullet);
    
  2. 字符串操作优化

    • 实例:频繁拼接字符串会生成新的字符串对象,从而触发GC。改用StringBuilder类进行动态字符串构建。
    // 非优化版本
    string result = "";
    for (int i = 0; i < 1000; i++)
    {result += "Value: " + i.ToString(); // 每次循环都会创建新的字符串对象
    }// 优化版本
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 1000; i++)
    {sb.Append("Value: ").Append(i); // 使用StringBuilder避免每次循环都创建新字符串
    }
    string result = sb.ToString();
    
  3. 避免大型结构体数组的临时创建

    • 实例:访问Unity引擎内部组件或属性时,有时会返回托管堆上的数组,例如Mesh.normals。这类访问可能导致意外的对象分配。应该尽量缓存这些结果以供后续重复使用。
    // 非优化版本
    Vector3[] normals = mesh.normals; // 每次访问可能重新分配数组// 优化版本
    private Vector3[] cachedNormals;
    void Awake()
    {cachedNormals = mesh.normals;
    }
    void SomeMethodRequiringNormals()
    {// 使用缓存的数组foreach (var normal in cachedNormals){// ...}
    }
    
  4. 预初始化集合大小

    • 实例:对于List或其他可变大小的集合,如果知道大概的元素数量,提前设置容量能防止自动扩容时产生的多余内存分配和GC压力。
    // 非优化版本
    List<int> list = new List<int>();
    for (int i = 0; i < 10000; i++) 
    {list.Add(i); // 可能多次自动扩容
    }// 优化版本
    List<int> optimizedList = new List<int>(10000);
    for (int i = 0; i < 10000; i++) 
    {optimizedList.Add(i); // 不会发生自动扩容
    }
    
  5. 重用单例和静态变量

    • 实例:在场景切换、全局计算或一次性初始化时,避免使用瞬态对象。通过单例模式或静态变量存储一些长期使用的对象或数据结构。
    // 单例示例
    public sealed class GameManager : MonoBehaviour
    {private static GameManager _instance;public static GameManager Instance{get { return _instance ?? (_instance = FindObjectOfType<GameManager>()); }}private readonly Dictionary<string, GameObject> prefabCache = new Dictionary<string, GameObject>();void Awake(){if (_instance != null && _instance != this){Destroy(gameObject);return;}_instance = this;// 预加载并缓存prefabs,防止运行时反复加载资源导致GCforeach (var prefabPath in prefabNames){var prefab = Resources.Load<GameObject>(prefabPath);prefabCache[prefabPath] = prefab;}}public GameObject GetCachedPrefab(string path){return prefabCache.TryGetValue(path, out var prefab) ? prefab : null;}
    }
    

通过上述实例可以看出,Unity中的GC优化主要围绕着减少临时对象的创建、有效利用已存在的对象和结构以及合理管理内存分配来进行。同时,在编写代码时应遵循内存安全编程的原则,注意引用类型与值类型的合理使用,以及避免使用可能导致装箱操作的API。

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

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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Typora+PicGO+腾讯云COS做图床

文章目录 Typora&#xff0b;PicGO&#xff0b;腾讯云COS做图床一、为什么使用图床二、Typora、PicGO和腾讯云COS介绍三、下载Typora和PicGOTyporaPicGO 四、配置Typora、PicGO和腾讯云COS腾讯云COS配置PicGO配置Typora配置 Typora&#xff0b;PicGO&#xff0b;腾讯云COS做图床…

伦敦金和现货黄金是一回事吗?

想进入黄金市场的朋友&#xff0c;在网上一搜相关的讯息&#xff0c;可能就懵了。这个市场中好像有几个品种&#xff0c;又是伦敦金又是现货黄金什么的。很多新手投资者想知道&#xff0c;这些伦敦金、现货黄金分别是指什么&#xff0c;下面我们就来讨论一下。 实际上&#xff…

微信小程序独立分包与分包预下载

官网链接 独立分包配置方法 独立分包使用限制 独立分包中不能依赖主包和其他分包中的内容&#xff0c;包括 js 文件、模板、wxss、自定义组件等&#xff1b;App 只能在主包内定义&#xff0c;独立分包中不能定义 App&#xff0c;会造成无法预期的行为独立分包中暂时不支持使用…

java面试微服务篇

目录 目录 SpringCloud Spring Cloud 的5大组件 服务注册 Eureka Nacos Eureka和Nacos的对比 负载均衡 负载均衡流程 Ribbon负载均衡策略 自定义负载均衡策略 熔断、降级 服务雪崩 服务降级 服务熔断 服务监控 为什么需要监控 服务监控的组件 skywalking 业务…

KNN算法总结

概述 邻近算法&#xff0c;或者说K最邻近&#xff08;KNN&#xff0c;K-NearestNeighbor&#xff09;分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻&#xff0c;就是K个最近的邻居的意思&#xff0c;说的是每个样本都可以用它最接近的K个邻近值来代表。近邻算法…

移动机器人的控制逻辑全解析。

你是否曾对那些在工厂中穿梭自如的移动机器人感到好奇&#xff1f;它们是如何准确无误地执行任务的&#xff1f;这一切都归功于移动机器人的控制逻辑&#xff01;今天&#xff0c;就让我们深入探讨一下移动机器人控制逻辑的重点。 一、环境感知与建模技术是移动机器人实现自主导…

【鸿蒙系统学习笔记】开发工具安装

一、准备开发环境 1.1、安装IDE 鸿蒙应用开发需要使用配套的IDE——HUAWEI DevEco Studio。 DevEco Studio基于IntelliJ IDEA Community&#xff08;IDEA社区版&#xff09;构建&#xff0c;为鸿蒙应用提供了一站式开发环境&#xff0c;集成了开发、运行、调试以及发布应用的…

Springboot返回给前端的日期变成时间戳问题处理

问题&#xff1a; 解决方案 在对应的Entity类中&#xff0c;给对应属性添加JsonFormat​注解 ​JsonFormat​注解用于将Date日期格式化为指定格式的字符串。由于在序列化时间时是按照国际标准时间GMT进行格式化的&#xff0c;最后接受到的数据会早8个小时&#xff0c;所以应该…

Android下SF合成流程重学习之onMessageInvalidate

Android下SF合成流程重学习之onMessageInvalidate 引言 虽然看了很多关于Android Graphics图形栈的文章和博客&#xff0c;但是都没有形成自己的知识点。每次学习了&#xff0c;仅仅是学习了而已&#xff0c;没有形成自己的知识体系&#xff0c;这次趁着有时间&#xff0c;这次…

三种vcruntime140.dll丢失解决方法,有效解决vcruntime140.dll文件丢失

vcruntime140.dll作为一个动态链接库文件&#xff0c;具有重要的功能和用途。它是由Microsoft Visual C Redistributable软件包提供的一个重要组件&#xff0c;用于支持运行在Windows操作系统上的应当vcruntime140.dll文件丢失时&#xff0c;将会对计算机系统产生一系列的影响。…

央视龙年春晚沈腾马丽第八度联手,紧张到嘴瓢引发全场哄笑。

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 除夕夜&#xff0c;华灯初上&#xff0c;央视龙年春晚的舞台上…

达梦数据库——数据迁移sqlserver-dm报错问题整理

报错情况一&#xff1a;Sql server迁移达梦连接报错’驱动程序无法通过使用安全套接字Q层(SSL)加密与SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client preferencesITLS127‘ 原因&#xff1a;历史版本的SOL SERVER服务…