对象池模板类(基类)和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将这些根视为起点,然后递归地遍历所有能够从这些起点直接或间接到达的对象。 阅读详情

相关推荐

S32K系列之PDB框图详解及PDB触发ADC

可编程延迟模块PDB,PDB可提供从内部或外部触发或可编程间隔信号到ADC硬件触发输入的可控制延迟。 PDB可以选择提供脉冲输出,用作CMP块中的采样窗口。 S32K系列的PDB资源如下表: PDB功能框图 在下图中,以下字母表示的意义: N:PDB通道的总数 n:PDB通道号,范围从0到N-1 M:每个PDB通道的总可用预触发 m:预触发编号,范围从0到M-1 Y:脉冲输出的总数 y:脉冲数...

zz56z56的博客 1万+

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

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

4753

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

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

生产队的驴 9581

2. Netty使用JSerialComm进行串口读取(二)

现在开始处理这些问题 第一个问题:串口读取超时异常一路传播到最后也没有处理。 ​ 第二个问题:即使处理了该异常,程序仍然退出,这不能满足一些实际使用要求需求。该问题与设置很长的读取超时时间没关系,无论多长到时间后总会退出。

s3c2410的博客 2461

uniapp(安卓 | 苹果) - 最新详细实现App打包发布教程,uni-app苹果IOS软件应用上架App Store软件商店,uni-app打包发布安卓Android软件到各大应用商店(详细教程

uni-app,安卓android,苹果ios,uniapp App软件,Uniapp上架发布应用,打包构建,apk、app软件,应用商店,应用市场,app store,uni-app安卓苹果app上架应用商店,app应用从创建到上架_uniapp打包app的流程和上架,uniapp打包上架ios Appstore 最全流程,苹果应用商店上架教程,uniapp生成的app怎么上架到iphone的app store,uni-app打包到上架Android , ios完整详细流程,审核一直不通过,软件商店审核失

✅ 精选推荐文章 1万+

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

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

dayanyun4518的博客 664

vue3中使用antv-S2表格(基础功能版)

表格的数值默认会渲染排序 icon, 可以配置 showDefaultHeaderActionIcon关闭。当配置为对象时,always 控制是否在子维度不足 2 个时始终展示小计,默认不展示。首先创建一个vue3+vite+ts项目,可以查看下面相关文章,只看第一条即可。可以调整行宽、列宽、列排序、单个单元格详情展示、选中某列、某行等基本功能。可以通过上面设置的SUM函数自动计算出数值,也可以自定义累加函数。配置自定义方法优先级大于配置聚合方式,即配置。1、在项目中安装(npm/pnpm都可以)

蜗牛~~ 2210

C#回收机制

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

weixin_33967071的博客 171

【无人机项目实战】第三章:fast_planner工程解读(附C++代码)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、规划系统运行逻辑【业务部分】1.Fast_planner_node.cpp【程序入口】功能代码实现2.kino_replan_fsm.cpp【状态机转移】功能代码实现KinoReplanFSM::init()函数订阅目标点回调函数订阅里程计回调函数检查路径规划是否成功【重要】执行状态机FSM定时器回调函数【重要】判断目标点是否有障碍物或者是轨迹执行过程中是否有障碍物的回调函数3

qq_35635374的博客 1万+

微信小程序开发:实现地图导航功能

其中,id用于调用地图组件,latitude和longitude表示地图的中心点坐标,markers表示地图中的标记点,covers表示地图中的覆盖物,polyline表示地图中的折线图,show-location表示是否显示当前定位点,bindregionchange表示移动地图时触发的事件。其中,id表示标记点的唯一标识,latitude和longitude表示标记点的坐标,title表示标记点的名称,iconPath表示标记点的图标路径,width和height表示标记点的宽度和高度。

吃不胖. 8917

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

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

fieldchao的博客 2285

使用epiDisplay包中的logistic

其中的logistic.display函数可以用于获取逻辑回归模型的汇总统计信息,包括自变量的优势比和置信区间,以及回归系数的Wald检验的p值。最后,我们使用print函数打印出汇总统计信息。使用epiDisplay包中的logistic.display函数获取逻辑回归模型的汇总统计信息(包括自变量的初始和调整后的优势比及置信区间,回归系数的Wald检验的p值)- R语言。通过使用logistic.display函数,我们可以方便地获取逻辑回归模型的重要统计信息,并对自变量的影响进行解释和推断。

CyberJolt的博客 608

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

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

アルタイル 944

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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

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

qq_33531923的博客 932

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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

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

weixin_30402343的博客 441

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

定长内存池设计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、付费专栏及课程。

余额充值