Skip to content

Latest commit

 

History

History
140 lines (103 loc) · 3.08 KB

File metadata and controls

140 lines (103 loc) · 3.08 KB

3-3. 内存池模块 - MemoryPool

💾 模块概述

内存池模块是 TEngine 框架中的轻量级内存管理工具,相对于对象池更适合一些更抽象、碎片化的内存对象。内存池通过对象复用机制,减少内存分配和 GC 压力,提升游戏性能。

✨ 核心优势

  1. 🚀 轻量级设计

    • 极小的内存占用
    • 快速的对象获取和释放
    • 适合高频创建/销毁的场景
  2. 🔄 自动对象复用

    • 对象获取时自动从池中取出
    • 对象释放时自动回收到池中
    • 减少内存分配和 GC 压力
  3. 🛡️ 内存泄漏检测

    • Scene 窗口 MemoryPool 对象可以设置内存池检查
    • 防止回收问题与内存泄漏问题

📖 使用指南

实现 IMemory 接口

要实现内存池管理的对象,需要实现 IMemory 接口:

/// <summary>
/// 资源组数据。
/// <remarks>实现 IMemory 接口,支持内存池管理。</remarks>
/// </summary>
public class AssetGroup : IMemory
{
    public List<AssetHandle> Assets { get; set; }
    
    /// <summary>
    /// 清理内存对象。
    /// </summary>
    public void Clear()
    {
        if (Assets != null)
        {
            foreach (var asset in Assets)
            {
                asset?.Dispose();
            }
            Assets.Clear();
        }
    }
}

使用内存池

// 从内存池中获取/生成内存对象
AssetGroup assetGroup = MemoryPool.Acquire<AssetGroup>();

// 使用对象
assetGroup.Assets = new List<AssetHandle>();
// ... 使用 assetGroup

// 释放内存对象还给内存池
MemoryPool.Release(assetGroup);

🔧 API 参考

/// <summary>
/// 从内存池获取对象。
/// </summary>
/// <typeparam name="T">对象类型(必须实现 IMemory 接口)。</typeparam>
/// <returns>内存对象实例。</returns>
T Acquire<T>() where T : class, IMemory, new();

/// <summary>
/// 释放对象回内存池。
/// </summary>
/// <param name="obj">要释放的对象。</param>
void Release(IMemory obj);

💡 最佳实践

1. 适合使用内存池的场景

  • ✅ 频繁创建/销毁的小对象
  • ✅ 数据结构对象(如 List、Dictionary 的包装类)
  • ✅ 临时数据对象
  • ✅ 事件参数对象

2. 不适合使用内存池的场景

  • ❌ 大型对象(占用内存较大)
  • ❌ 需要复杂初始化的对象
  • ❌ 生命周期很长的对象

3. 确保正确清理

// ✅ 推荐:在 Clear 方法中正确清理所有资源
public class MyData : IMemory
{
    public List<int> Data { get; set; }
    
    public void Clear()
    {
        Data?.Clear();
        Data = null;
    }
}

⚙️ 配置说明

在 Scene 窗口的 MemoryPool 对象可以设置内存池检查:

  • 启用内存泄漏检测
  • 设置检测间隔
  • 查看当前内存池状态

image


🔗 相关链接