Magic_Game/core/Manager/ObjectManager.cpp

59 lines
1.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "..\e2dmanager.h"
#include "..\e2dbase.h"
// ObjectManager 释放池的实现机制:
// Object 类中的引用计数m_nRefCount在一定程度上保证了指针的使用安全
// 它记录了对象被使用的次数,当计数为 0 时ObjectManager 会自动释放这个对象
// 所有的 Object 对象都应在被使用时(例如 Text 添加到了场景中)
// 调用 retain 函数保证该对象不被删除,并在不再使用时调用 release 函数
// 对象管理池
static std::set<e2d::Object*> s_vObjectPool;
// 标志释放池执行状态
static bool s_bNotifyed = false;
void e2d::ObjectManager::__update()
{
if (!s_bNotifyed) return;
s_bNotifyed = false;
// 循环遍历容器中的所有对象
for (auto iter = s_vObjectPool.begin(); iter != s_vObjectPool.end();)
{
if ((*iter)->getRefCount() <= 0)
{
// 若对象的引用的计数小于等于 0, 释放该对象
(*iter)->destroy();
delete (*iter);
// 从释放池中删除该对象
iter = s_vObjectPool.erase(iter);
}
else
{
iter++; // 移动迭代器
}
}
}
void e2d::ObjectManager::__clear()
{
FOR_LOOP(pObj, s_vObjectPool)
{
delete pObj;
}
s_vObjectPool.clear();
}
void e2d::ObjectManager::__add(e2d::Object * pObject)
{
if (pObject)
{
s_vObjectPool.insert(pObject);
}
}
void e2d::ObjectManager::flush()
{
s_bNotifyed = true;
}