Magic_Game/core/Base/GC.cpp

104 lines
1.5 KiB
C++
Raw Normal View History

2018-04-21 21:24:46 +08:00
#include "..\e2dbase.h"
#include "..\e2dtool.h"
2018-07-05 01:09:54 +08:00
#include "..\e2dmanager.h"
2018-07-07 01:43:41 +08:00
using namespace e2d;
e2d::autorelease_t const e2d::autorelease = e2d::autorelease_t();
void * operator new(size_t size, e2d::autorelease_t const &) E2D_NOEXCEPT
{
void* p = ::operator new(size, std::nothrow);
if (p)
{
GC::getInstance()->autorelease(static_cast<Ref*>(p));
2018-07-07 01:43:41 +08:00
}
return p;
}
void operator delete(void * block, e2d::autorelease_t const &) E2D_NOEXCEPT
{
::operator delete (block, std::nothrow);
}
2018-09-02 14:30:48 +08:00
e2d::GC * e2d::GC::getInstance()
{
static GC _instance;
return &_instance;
}
2018-07-06 00:47:50 +08:00
e2d::GC::GC()
: _notifyed(false)
2018-07-13 01:12:22 +08:00
, _cleanup(false)
2018-07-06 00:47:50 +08:00
, _pool()
{
}
e2d::GC::~GC()
{
// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
2018-09-02 14:30:48 +08:00
Game::getInstance()->clearAllScenes();
Timer::getInstance()->clearAllTasks();
ActionManager::getInstance()->clearAll();
_cleanup = true;
for (const auto& ref : _pool)
{
delete ref;
}
_pool.clear();
_cleanup = false;
2018-08-12 12:06:06 +08:00
2018-09-02 14:30:48 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Image::clearCache();
2018-09-02 14:30:48 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Player::destroyInstance();
Audio::destroyInstance();
Renderer::destroyInstance();
Input::destroyInstance();
Window::destroyInstance();
Game::destroyInstance();
}
2018-07-07 11:03:03 +08:00
void e2d::GC::flush()
{
2018-07-22 21:22:27 +08:00
if (!_notifyed)
2018-07-06 00:47:50 +08:00
return;
2017-10-14 01:07:34 +08:00
2018-07-22 21:22:27 +08:00
_notifyed = false;
for (auto iter = _pool.begin(); iter != _pool.end();)
{
if ((*iter)->getRefCount() <= 0)
{
2018-07-22 21:22:27 +08:00
delete (*iter);
iter = _pool.erase(iter);
}
else
{
2018-05-14 22:51:40 +08:00
++iter;
}
}
}
2018-07-22 21:22:27 +08:00
void e2d::GC::autorelease(Ref * ref)
2018-07-07 01:43:41 +08:00
{
if (ref)
{
2018-07-22 21:22:27 +08:00
_pool.insert(ref);
}
}
2018-07-22 21:22:27 +08:00
void e2d::GC::safeRelease(Ref* ref)
{
2018-07-22 21:22:27 +08:00
if (_cleanup)
return;
2018-07-22 21:22:27 +08:00
if (ref)
2018-07-07 01:43:41 +08:00
{
2018-07-28 20:06:27 +08:00
ref->release();
_notifyed = true;
2018-07-07 01:43:41 +08:00
}
2017-10-14 01:07:34 +08:00
}