简介:
对象缓存池:当对象被频繁创建或删除时 大量使用new和delete关键字处理堆内存。如果该对象比较大,就对计算机的消耗就越大 很有可能在创建大量对象时出现卡顿。频繁的创建和删除对计算机消耗较大。
对象缓存池 适用于在对象还没被使用时 预先缓存一定数量的对象 可以有效的解决 在创建时导致的卡顿现象。使用时直接从对象池获取对象。需要消耗时,不销毁对象将其回收到对象缓存池中。
头文件:
#ifndef GAMEOBJECTPOOL_H
#define GAMEOBJECTPOOL_H
#include "gamedefine.h"
#include <QObject>
/*
对象缓存池:当对象被频繁创建或删除时 大量使用new和delete关键字处理堆内存
如果该对象比较大,就对计算机的消耗就越大 很有可能在创建大量对象时出现卡顿
频繁的创建和删除对计算机小号较大。对象缓存池 适用于在对象还没被使用时 预先
缓存一定数量的对象 可以有效的解决 在创建时导致的卡顿现象。使用时直接从对象池
获取对象。需要消耗时,不销毁对象将其回收到对象缓存池中
*/
//static函数里面只能用同类型指针,所以单例类指针要加static
class GameObjectPool : public QObject
{
GameObjectPool(QObject *parent = nullptr);
static GameObjectPool* instance;
public:
static GameObjectPool* getinstance()
{
if(instance==nullptr)
{
return instance=new GameObjectPool();
}
return instance;
}
//对象池初始化
void init();
//获取对象
GameObject* GetGameObject(int type);
//对象回收
void RecoveryGameObject(GameObject* object);
//内存清除
void clear();
~GameObjectPool();
protected:
QList<Bullet*> mBulletPoll;
QList<Enemy*> mEnemyPoll;
};
#endif // GAMEOBJECTPOOL_H
源文件:
#include "gameobjectpool.h"
GameObjectPool* GameObjectPool::instance=nullptr;
GameObjectPool::GameObjectPool(QObject *parent) : QObject(parent)
{
}
void GameObjectPool::init()
{
//预先生产的对象数量
for(int i=0;i<10;i++)
{
Bullet *bullet=new Bullet;
mBulletPoll.append(bullet);
Enemy* enemy=new Enemy;
mEnemyPoll.append(enemy);
}
}
GameObject *GameObjectPool::GetGameObject(int type)
{
switch(type)
{
case GameObject::OT_BulletPlayer:
{
Bullet*bullet=mBulletPoll.first();
mBulletPoll.pop_front();
return bullet;
}
case GameObject::OT_Enemy:
{
Enemy*enemy=mEnemyPoll.first();
mEnemyPoll.pop_front();
return enemy;
}
}
}
void GameObjectPool::RecoveryGameObject(GameObject *object)
{
switch(object->GetType())
{
case GameObject::OT_BulletPlayer:
{
mBulletPoll.append((Bullet*)object);
break;
}
case GameObject::OT_Enemy:
{
mEnemyPoll.append((Enemy*)object);
break;
}
}
}
void GameObjectPool::clear()
{
for(auto pBullet: mBulletPoll)
{
delete pBullet;//有多少删除多少
}
for(auto enemy: mEnemyPoll)
{
delete enemy;//有多少删除多少
}
}
GameObjectPool::~GameObjectPool()
{
clear();
}