Việc khởi tạo và hủy đối tượng trong game là một việc gây tốn rất nhiều tài nguyên. Ví dụ như trong game bắn máy phải tạo hàng ngàn viên đạn trong thời gian ngắn. Sử dụng một mẫu thiết kế là Object Pool để giải quyết vấn đề này.
Object pool giúp cải thiện hiệu suất sử dụng bộ nhớ bằng việc sử dụng lại các đối tượng từ một pool cố định thay vì việc khởi tạo và hủy bỏ chúng.
Object Pool
Objects pool là một lớp dùng để lưu trữ lại các đối tượng. Khởi tạo tối đa số lượng đối tượng có thể được sử dụng và đưa vào pool, khi đối tượng được sử dụng xong không hủy nó mà sẽ đưa nó ra khỏi màn hình hiển thị hoặc ẩn đi. Object pool được sử dụng khi:
- Cần tạo và hủy đối tượng liên tục.
- Các đối tượng tương tự nhau.
- Các đối tượng có thể tái sử dụng.
Hiện thực
Lớp Object Pool cơ bản gồm 2 phương thức: getObject
, addObject
.
Object Pool trong cocos2d-x v3 kế thừa từ Vector
#pragma once #include "cocos2d.h" USING_NS_CC; template <class T> class ObjectPool:public Vector<T> { private: int m_index; public: ObjectPool<T>() : m_index(0) { } T getObject() { T ObjIndex; if (m_index <this->size()) { ObjIndex =this->at(m_index); m_index++; } else { ObjIndex = this->at(0); m_index = 1; } return ObjIndex; } void addObject(T obj) { this->pushBack(obj); } };
Khởi tạo số lượng đối tượng đủ lớn bằng cách tăng biến m_index
để đảm bảo việc lấy nhiều đối tượng chưa được sử dụng trong pool.
Sử dụng Object Pool
Khai báo:
ObjectPool<CatActor*> catActorPool;
Khởi tạo đối tượng:
for (int i = 0; i < 10; i++) { CatActor* cat = CatActor::create(); catActorPool.addObject(cat); addChild(cat); }
Khi cần dùng đối tượng:
CatActor* cat = catActorPool.getObject();