Skip to content

Object Pool

Introduction

The object pool is a crucial component for optimizing memory management and performance. It improves game performance by reusing objects to reduce memory allocation and garbage collection.

GameObject Object Pool

Core Features

GameObjectPoolHelper is a static utility class for managing Unity GameObject object pools, providing the following main features:

  1. Pool Management

    • Uses dictionary to store multiple object pools
    • Supports both synchronous and asynchronous initialization
    • Features automatic expansion mechanism
  2. Object Acquisition and Recycling

    • Supports both synchronous/asynchronous object acquisition
    • Automatically manages object activation states
    • Implements smart recycling mechanism

Main APIs

1. Initialize Object Pool

csharp
// Synchronous initialization
GameObjectPoolHelper.InitPool(string poolName, int size, PoolInflationType type = PoolInflationType.DOUBLE);

// Asynchronous initialization
await GameObjectPoolHelper.InitPoolWithPathAsync(string poolName, string assetPath, int size, PoolInflationType type = PoolInflationType.DOUBLE);

2. Get Object

csharp
// Synchronous acquisition
GameObject obj = GameObjectPoolHelper.GetObjectFromPool(string poolName, bool autoActive = true, int autoCreate = 0);

// Asynchronous acquisition
GameObject obj = await GameObjectPoolHelper.GetObjectFromPoolAsync(string poolName, string assetPath, bool autoActive = true, int autoCreate = 0);

3. Recycle Object

csharp
// Recycle GameObject
GameObjectPoolHelper.ReturnObjectToPool(gameObject);

// Recycle Transform
GameObjectPoolHelper.ReturnTransformToPool(transform);

Usage Examples

csharp
// 1. Initialize object pool
GameObjectPoolHelper.InitPool("EnemyPool", 10);

// 2. Get object
GameObject enemy = GameObjectPoolHelper.GetObjectFromPool("EnemyPool");

// 3. Use object
enemy.transform.position = Vector3.zero;

// 4. Recycle object
GameObjectPoolHelper.ReturnObjectToPool(enemy);

Asynchronous Usage Examples

csharp
// 1. Asynchronously initialize object pool
await GameObjectPoolHelper.InitPoolWithPathAsync("EnemyPool", "Enemy", 10);

// 2. Asynchronously get object
GameObject enemy = await GameObjectPoolHelper.GetObjectFromPoolAsync("EnemyPool", "Enemy");

// 3. Use object
enemy.transform.position = Vector3.zero;

// 4. Recycle object
GameObjectPoolHelper.ReturnObjectToPool(enemy);

Feature Description

1. Automatic Expansion

  • DOUBLE: Doubles the capacity when insufficient
  • INCREMENT: Incrementally expands capacity when insufficient

2. Automatic Activation

  • Optional automatic activation when getting objects
  • Automatic object state management during recycling

Best Practices

Usage Guidelines

  1. Initialization Strategy:

    • Estimate initial pool size based on actual needs
    • Choose appropriate expansion strategy
  2. Performance Optimization:

    • Preheat frequently used object pools
    • Avoid frequent pool capacity adjustments
  3. Resource Management:

    • Timely recycle unused objects
    • Properly manage asynchronously loaded resources

Important Notes

WARNING

  1. Ensure objects have the PoolObject component when recycling
  2. Handle asynchronous operation timing correctly
  3. Watch for memory leaks, ensure objects are properly recycled

Technical Support

Get Help

  • 💬 Join QQ Group Discussion (ET Framework Group): 474643097
  • ⭐ Follow the project on GitHub for latest updates

Released under the MIT License.