对象池模板类(基类)和c#手动回收

深入了解C#中的垃圾回收(Garbage Collection) 在计算机科学中,内存管理是一项至关重要的任务。在传统的编程语言中,程序员必须手动分配和释放内存,这往往会导致内存泄漏或者悬挂指针等严重问题。为了解决这些问题,现代编程语言如C#引入了自动内存管理机制,其中最核心的部分就是垃圾回收。垃圾回收是一种自动管理内存的机制,它的主要目标是在程序运行时自动检测和释放不再被程序使用的内存,从而减少内存泄漏和提高程序的性能和稳定性。C#中的垃圾回收机制为开发人员提供了方便、安全且高效的内存管理方式。 阅读详情

一、对象池
在一款游戏中,我们不止有一个对象池,为了方便对对象池的创建,由此写了一个模板类。当然,也可以实现全功能的对象池,不管什么类型都可以。在此就不在阐述了。

在此模板类中,使用了委托,系统自带的委托函数,以及堆栈的使用。

using System.Collections.Generic;
using UnityEngine.Events;
using UnityEngine;

public class ObjectPool<T> where T : new()
{
//最好改为只读的
    private   Stack<T> m_Stack = new Stack<T>(); //使用栈进行创建。
    private  UnityAction<T> m_ActionOnGet; 
    private   UnityAction<T> m_ActionOnRelease;

    public int countAll { get; private set; } 	//池中对象的总个数
    public int countActive { get { return countAll - countInactive; } }	//活跃的对象
    public int countInactive { get { return m_Stack.Count; } }	//失活的对象,即可以进行回收的对象

 	public T CreateObject()
    {
        T element;
        if (m_Stack.Count == 0)
        {
            element = new T();
            countAll++;
        }
        else
        {
            element = m_Stack.Pop();
        }
        if (m_ActionOnGet != null)
            m_ActionOnGet(element);
        return element;
    }

    public ObjectPool(UnityAction<T> actionOnGet, UnityAction<T> actionOnRelease)  	
    {
        m_ActionOnGet = actionOnGet;
        m_ActionOnRelease = actionOnRelease;
    }

  
    public void Release(T element)
    {
        if (m_Stack.Count > 0 && ReferenceEquals(m_Stack.Peek(), element))
        //输出错误日志,可以使用自己写的日志进行输出
            Debug.LogError("Internal error. Trying to destroy object that is already released to pool."); 	
        if (m_ActionOnRelease != null)
            m_ActionOnRelease(element);
        m_Stack.Push(element);	//弹栈
    }
}


二、C#手动回收
在Net中,由GC垃圾回收线程掌握对象资源的释放,程序员无法掌控析构函数的调用时机。对于一些非托管资源,比如数据库链接对象等,需要实现IDisposable接口进行手动的垃圾回收。
在此模板类中,使用了委托,系统自带的委托函数,以及堆栈的使用。

    
    //
    // 摘要:
    //     Defines a method to release allocated resources.
    [ComVisible(true)]
    public interface IDisposable
    {
        //
        // 摘要:
        //     Performs application-defined tasks associated with freeing, releasing, or resetting
        //     unmanaged resources.
        void Dispose();
    }

C#内存管理与垃圾回收实践教程 在.NET框架中,垃圾回收器(GC)利用可达性分析来确定哪些托管对象是活跃的,即哪些对象是应用程序仍在使用的,以及哪些已经变为垃圾(即不再被引用的对象)。GC通过遍历所有的托管堆上的对象,从一组称为“根”的对象开始,通常是全局对象、静态字段、线程栈上的局部变量以及CPU寄存器中的引用。可达性分析的过程可以被视为一个图遍历问题。GC将这些根视为起点,然后递归地遍历所有能够从这些起点直接或间接到达的对象。 阅读详情

相关推荐

VCSA 上的 vmware-vpxd 服务失败,Web端提示503 服务不可用 (503 Service Unavailable)

昨晚VCSA碰到一个很诡异的问题: 使用 vSphere Web Client 连接到 vCenter Server Appliance时失败,提示: 503 服务不可用 (503 Service Unavailable) 无法连接端点 (Failed to connect to endpoint):[N7Vmacore4Http20NamedPipeServiceSpecE:0x00007f975808ee30] _serverNamespace = / action = Allow _pipeNam

徐华的博客 2万+

C#中对象的销毁和内存回收

在C++中,在堆上分配的内存必须手动回收。即new和delete操作符是要成对使用的。这种方式给程序员提供了强大而灵活的控制能力,程序员可以控制何时销毁对象,回收内存 。这种控制能力,令C++程序员感到自己对程序具有很强的驾驭能力,因此对此功能津津乐道。但是,这种手动回收机制,非常的难以控制,即使经验丰富的C++程序员,也难免疏漏,导致程序中发生内存泄露,轻则导致系统运行越来越慢,重则最终崩溃。这

4753

PCB工艺-SI9000使用教程

本文介绍了阻抗计算工具SI9000的使用方法,重点讲解了微带线与带状线的区别、共面阻抗概念及参考面选择。通过USB差分走线实例,详细说明了如何选择计算模型、填写参数并确定线宽线距。文章还提供了层叠设计资料和工厂常规阻抗表格作为参考,建议制板时标注需控阻抗的线路供板厂调整。最后简单提及了嘉立创阻抗计算工具作为备选方案。

weixin_50120208的博客 2024

C# 垃圾回收机制(GC) 的概述 资源清理 内存管理

在编写程序时,会产生很多的数据 比如:int string 变量,这些数据都存储在内存里,如果不合理的管理他们,就会内存溢出导致程序崩溃C#内置了自动垃圾回收GC,在编写代码时可以不需要担心内存溢出的问题 变量失去引用后 GC会帮我们自动回收,但不包括数据流,和一些数据库的连接,这就需要我们手动的释放资源总结:让内存利用率更高。

生产队的驴 9581

手把手教你排查libstdc++.so.6版本问题:从GLIBCXX缺失到完美解决

本文深入解析Linux系统中常见的GLIBCXX版本缺失问题,以`ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6: version 'GLIBCXX_3.4.29' not found`为例,从动态链接原理入手,提供使用`strings`和`find`命令的诊断方法,并详细对比了四种解决方案的优缺点。文章重点推荐通过设置`LD_LIBRARY_PATH`或更新系统库的安全策略,并最终建议使用Docker容器化技术实现环境依赖的根治与统一管理。

j7k8l的博客 300

STM32CubeMX | HAL库实战:ADC多通道采集模式深度解析(轮询、DMA、TIM触发)

本文深度解析了基于STM32CubeMX与HAL库实现ADC多通道数据采集的三种核心模式:轮询、DMA以及TIM触发DMA。文章通过对比分析,详细阐述了各模式的配置要点、适用场景与潜在陷阱,旨在帮助开发者根据实时性、CPU占用及采样精度等需求,选择并实现高效稳定的多通道数据采集方案。

postgres8guard的博客 971

C#内存管理和垃圾回收机制

C#内存管理和垃圾回收机制 数据类型 垃圾回收机制 一、数据类型 C#中的数据类型分为值类型(Value type) 和引用类型(reference type), 值 类 型: 所有的值类型都集成自 System.ValueType 上,除非加声...

dayanyun4518的博客 664

风-车-桥耦合随机振动预测框架:从物理模型到高效代理

本文提出了一种风-车-桥耦合随机振动预测的混合框架,结合物理模型与代理模型实现高效计算。该框架的核心数学本质是时变参数-随机激励-高维动力系统,主要解决三大计算难点:自由度规模悬殊、时变特性和随机性传播。系统采用分层解耦-代理加速的技术路线,底层基于物理模型建立车辆运动方程和桥梁运动方程,上层通过深度学习代理实现随机激励到响应的端到端映射。文中详细介绍了随机激励建模(包括脉动风速和路面不平度)、子系统建模、耦合求解方法,并提供了可运行的Python代码实现。该框架可显著提高风-车-桥系统随机振动分析的效率,

huanghm88的专栏 102

C#回收机制

理解C#垃圾回收机制我们首先说一下CLR(公共语言运行时,Common Language Runtime)它和Java虚拟机一样是一个运行时环境,核心功能包括:内存管理、程序集加载、安全性、异步处理和线程同步。 CTS(Common Type System)通用类型系统,它把.Net中的类型分为2大类,引用类型与值类型。.Net中所有类型都间接或直接派生至System.Obj...

weixin_33967071的博客 171

SST专题(2-2)MMC-SST 输入级的工作原理及数学模型

本文研究了MMC-SST和iMMC-SST的电路结构及工作原理。系统由前级MMC电路和后级DC/DC电路组成,MMC负责电能转换和能量存储,DC/DC电路进行电压电流调节。重点分析了半桥型子模块(SM)的开关组态和工作原理,建立了平均值模型,推导了上下桥臂电压方程和环流特性。研究表明,通过合理控制子模块充放电模态可维持端口电压平衡,上下桥臂电压调控可影响网侧功率吸收,而环流特性对中压直流侧电压具有重要影响。

嵌入式老牛的博客 772

ERROR: Ignored the following yanked versions: 0.8.3, 0.10.19.dev18 的解决办法

关于这个问题,博主是在进行项目中的python依赖包安装的时候遇见的,遇到的异常:关于这个问题,是在。

Spring Boot-Common On With You 642

C# 对象和Unity3d GameObject缓冲对象池模版类

之前项目在使用对象的时候 就考虑到 如果频繁的创建对象或者销毁对象的话 对性能会有影响 所以就自己写了个对象池 代码比较简单 项目亲测实用 喜欢的朋友拿走吧 using UnityEngine; using System.Collections; using System.Collections.Generic; //一个模板类,定义缓存的基本类 public class GCKiller

fieldchao的博客 2285

基于龙虾Claw的会议纪要自动提取与重点内容总结办公场景实践

本文介绍如何使用龙虾Claw构建会议纪要自动提取与重点内容总结系统,实现会议内容的智能处理。

一键难忘的博客 253

Unity之C#学习笔记(17):对象池模式 Object Pooling

前篇链接:Unity之C#学习笔记(16):单例模式及单例模板类 Singleton and MonoSingleton 在游戏中,有一些生命周期很短,需要频繁创建和销毁的物体,例如

アルタイル 944

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

U3D客户端框架之类对象池技术优化C#语言GC

Unity3d框架搭建 使用 类对象池技术 优化 C#语言 GC

qq_33531923的博客 932

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Unity性能优化实战:内存管理与GC垃圾回收机制深度解析

在游戏开发中,内存管理与垃圾回收(GC)是影响性能的核心机制。托管内存环境通过自动内存分配与回收简化了开发,但不当使用会导致频繁的GC操作,引发卡顿。理解托管堆的工作原理、代际回收与增量GC机制,是优化性能的基础。通过减少短期对象分配、复用长期对象,可以显著降低GC压力,提升游戏流畅度。在Unity开发中,字符串操作、装箱、Lambda表达式以及不当的API调用是常见的内存陷阱。掌握对象池技术、值类型使用与内存泄漏排查,能够有效管理内存生命周期。这些优化策略对于移动端游戏、大型开放世界等需要高实时性的应用场

weixin_30402343的博客 441

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

定长内存池设计ConcurrentMemoryPool

内存块自身进行链接,前四个字节存下一个的地址。

qq_53022035的博客 325

Unity游戏模板架构解析:从打地鼠案例学习模块化设计与性能优化

在游戏开发中,模块化设计和性能优化是构建可维护、高性能项目的核心基础。模块化通过职责分离(如MVC模式)实现高内聚低耦合,使游戏逻辑、UI与数据管理相互独立,便于扩展与维护。性能优化则涉及对象池、Draw Call合并等技术,能有效减少GC卡顿、提升渲染效率,对移动端和WebGL项目尤为重要。这些工程实践能显著提升开发效率与游戏体验,广泛应用于各类休闲游戏、教育应用和商业项目中。本文以Unity打地鼠游戏模板为例,深入解析其架构设计、事件通信机制及针对多平台适配的优化方案,为开发者提供一套可复用的工程化解决

weixin_34269583的博客 487

ch05与游戏世界交互——鼠标打飞碟小游戏

Unity3D实现打飞碟小游戏,单实例的使用

yesor_not的博客 820

Godot GDExtension C++插件开发:安全绑定与高性能异步寻路实践

在游戏开发中,性能优化是核心挑战之一,尤其是在处理复杂物理模拟、实时地形生成或高频AI计算时。原生代码绑定技术允许开发者将关键模块用C++等高性能语言重写,通过插件形式集成到游戏引擎中,从而突破脚本语言的性能瓶颈。其核心原理在于建立脚本语言与原生代码之间的安全、高效通信桥梁,涉及类型系统映射、内存生命周期管理和线程安全模型。这项技术的价值在于能显著提升计算密集型任务的执行效率,同时确保引擎的稳定性。其典型应用场景包括游戏中的高性能寻路系统、粒子模拟、音视频处理等模块。本文以Godot引擎的GDExtensi

weixin_30647065的博客 411

C#【必备技能篇】垃圾回收机制(GC)的理解(资源清理+内存管理)

C#【必备技能篇】垃圾回收机制(GC)的理解(资源清理+内存管理)

星Yeah 的博客 1万+

C# 垃圾回收机制深度解析

详细的讲述了C#的GC机制

2401_82413779的博客 1482

程序的并发设计(线程的回收、取消、清理、互斥锁、读写锁、死锁)

在Linux中,互斥锁并不占用任何资源,因此LinuxThreads中的 pthread_mutex_destroy()除了检查锁状态以外(锁定状态则返回EBUSY)没有其他动作。否则写者将等待,直到没有读者和写者。读写锁出于写锁状态时,所有试图对读写锁加锁的线程,不管是读者试图加读锁,还是写者试图加写锁,都会被阻塞。读写锁处于读锁状态时,有写者试图加写锁时,之后的其他线程的读锁请求会被阻塞,以避免写者长时间的不写锁。注意:线程的取消要有取消点才可以,不是说取消就取消,线程的取消点主要是阻塞的系统调用。

qq_36091214的博客 825

C#设计模式-窗体基类模板方法定义

源代码: http://www.vjsdn.com/bbs/bbsTopicDetails.aspx?pid=112271241 模板方法模式(Template Method Pattern)模版方法中的方法可以分为两大类:模版方法(Template Method)和基本方法(Primitive Method)。   a.模版方法   一个模版方法是定义在抽象类中的,把基本操作方法...

weixin_30480651的博客 444
上一篇: unity检出安卓工程后报错
下一篇: 单例模式(模板类)C#
Gxy_w
博客等级 码龄7年 129粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gxy_w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值