性能优化
This commit is contained in:
parent
e3cce89552
commit
26ed76ae2b
|
|
@ -16,7 +16,7 @@ e2d::Animate::Animate(Animation * animation)
|
||||||
|
|
||||||
e2d::Animate::~Animate()
|
e2d::Animate::~Animate()
|
||||||
{
|
{
|
||||||
GC::safeRelease(_animation);
|
GC::getInstance()->safeRelease(_animation);
|
||||||
}
|
}
|
||||||
|
|
||||||
e2d::Animation * e2d::Animate::getAnimation() const
|
e2d::Animation * e2d::Animate::getAnimation() const
|
||||||
|
|
@ -28,9 +28,9 @@ void e2d::Animate::setAnimation(Animation * animation)
|
||||||
{
|
{
|
||||||
if (animation && animation != _animation)
|
if (animation && animation != _animation)
|
||||||
{
|
{
|
||||||
GC::safeRelease(_animation);
|
if (_animation) _animation->release();
|
||||||
_animation = animation;
|
_animation = animation;
|
||||||
GC::retain(_animation);
|
_animation->retain();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ e2d::Animation::~Animation()
|
||||||
{
|
{
|
||||||
for (auto frame : _frames)
|
for (auto frame : _frames)
|
||||||
{
|
{
|
||||||
GC::safeRelease(frame);
|
GC::getInstance()->safeRelease(frame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -40,7 +40,7 @@ void e2d::Animation::add(Image * frame)
|
||||||
if (frame)
|
if (frame)
|
||||||
{
|
{
|
||||||
_frames.push_back(frame);
|
_frames.push_back(frame);
|
||||||
GC::retain(frame);
|
frame->retain();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,13 +11,13 @@ e2d::Loop::Loop(Action * action, int times /* = -1 */)
|
||||||
if (action)
|
if (action)
|
||||||
{
|
{
|
||||||
_action = action;
|
_action = action;
|
||||||
GC::retain(_action);
|
_action->retain();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
e2d::Loop::~Loop()
|
e2d::Loop::~Loop()
|
||||||
{
|
{
|
||||||
GC::safeRelease(_action);
|
GC::getInstance()->safeRelease(_action);
|
||||||
}
|
}
|
||||||
|
|
||||||
e2d::Loop * e2d::Loop::clone() const
|
e2d::Loop * e2d::Loop::clone() const
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ e2d::Sequence::~Sequence()
|
||||||
{
|
{
|
||||||
for (auto action : _actions)
|
for (auto action : _actions)
|
||||||
{
|
{
|
||||||
GC::safeRelease(action);
|
GC::getInstance()->safeRelease(action);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -78,7 +78,7 @@ void e2d::Sequence::add(Action * action)
|
||||||
if (action)
|
if (action)
|
||||||
{
|
{
|
||||||
_actions.push_back(action);
|
_actions.push_back(action);
|
||||||
GC::retain(action);
|
action->retain();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ e2d::Spawn::~Spawn()
|
||||||
{
|
{
|
||||||
for (auto action : _actions)
|
for (auto action : _actions)
|
||||||
{
|
{
|
||||||
GC::safeRelease(action);
|
GC::getInstance()->safeRelease(action);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -76,7 +76,7 @@ void e2d::Spawn::add(Action * action)
|
||||||
if (action)
|
if (action)
|
||||||
{
|
{
|
||||||
_actions.push_back(action);
|
_actions.push_back(action);
|
||||||
GC::retain(action);
|
action->retain();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
103
core/Base/GC.cpp
103
core/Base/GC.cpp
|
|
@ -11,17 +11,7 @@ void * operator new(size_t size, e2d::autorelease_t const &) E2D_NOEXCEPT
|
||||||
void* p = ::operator new(size, std::nothrow);
|
void* p = ::operator new(size, std::nothrow);
|
||||||
if (p)
|
if (p)
|
||||||
{
|
{
|
||||||
GC::autorelease(static_cast<Ref*>(p));
|
GC::getInstance()->autorelease(static_cast<Ref*>(p));
|
||||||
}
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
void* operator new[](size_t size, e2d::autorelease_t const&) E2D_NOEXCEPT
|
|
||||||
{
|
|
||||||
void* p = ::operator new[](size, std::nothrow);
|
|
||||||
if (p)
|
|
||||||
{
|
|
||||||
GC::autoreleaseArray(static_cast<Ref*>(p));
|
|
||||||
}
|
}
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
@ -31,11 +21,6 @@ void operator delete(void * block, e2d::autorelease_t const &) E2D_NOEXCEPT
|
||||||
::operator delete (block, std::nothrow);
|
::operator delete (block, std::nothrow);
|
||||||
}
|
}
|
||||||
|
|
||||||
void operator delete[](void* block, e2d::autorelease_t const&) E2D_NOEXCEPT
|
|
||||||
{
|
|
||||||
::operator delete[](block, std::nothrow);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// GC 机制,用于销毁所有单例
|
// GC 机制,用于销毁所有单例
|
||||||
GC GC::_instance;
|
GC GC::_instance;
|
||||||
|
|
@ -50,7 +35,7 @@ e2d::GC::GC()
|
||||||
e2d::GC::~GC()
|
e2d::GC::~GC()
|
||||||
{
|
{
|
||||||
// 删除所有对象
|
// 删除所有对象
|
||||||
GC::clear();
|
this->clear();
|
||||||
// 清除图片缓存
|
// 清除图片缓存
|
||||||
Image::clearCache();
|
Image::clearCache();
|
||||||
// 删除所有单例
|
// 删除所有单例
|
||||||
|
|
@ -68,23 +53,16 @@ e2d::GC::~GC()
|
||||||
|
|
||||||
void e2d::GC::flush()
|
void e2d::GC::flush()
|
||||||
{
|
{
|
||||||
if (!_instance._notifyed)
|
if (!_notifyed)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_instance._notifyed = false;
|
_notifyed = false;
|
||||||
for (auto iter = _instance._pool.begin(); iter != _instance._pool.end();)
|
for (auto iter = _pool.begin(); iter != _pool.end();)
|
||||||
{
|
{
|
||||||
if ((*iter).first->getRefCount() <= 0)
|
if ((*iter)->getRefCount() <= 0)
|
||||||
{
|
{
|
||||||
if ((*iter).second)
|
delete (*iter);
|
||||||
{
|
iter = _pool.erase(iter);
|
||||||
delete[] (*iter).first;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
delete (*iter).first;
|
|
||||||
}
|
|
||||||
iter = _instance._pool.erase(iter);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -95,72 +73,45 @@ void e2d::GC::flush()
|
||||||
|
|
||||||
void e2d::GC::clear()
|
void e2d::GC::clear()
|
||||||
{
|
{
|
||||||
_instance._cleanup = true;
|
_cleanup = true;
|
||||||
|
|
||||||
SceneManager::getInstance()->clear();
|
SceneManager::getInstance()->clear();
|
||||||
Timer::getInstance()->clearAllTasks();
|
Timer::getInstance()->clearAllTasks();
|
||||||
ActionManager::getInstance()->clearAll();
|
ActionManager::getInstance()->clearAll();
|
||||||
|
|
||||||
for (auto pair : _instance._pool)
|
for (auto ref : _pool)
|
||||||
{
|
{
|
||||||
if (pair.second)
|
delete ref;
|
||||||
{
|
|
||||||
delete[] pair.first;
|
|
||||||
}
|
}
|
||||||
else
|
_pool.clear();
|
||||||
{
|
_cleanup = false;
|
||||||
delete pair.first;
|
}
|
||||||
}
|
|
||||||
}
|
e2d::GC * e2d::GC::getInstance()
|
||||||
_instance._pool.clear();
|
{
|
||||||
_instance._cleanup = false;
|
return &_instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::GC::autorelease(Ref * ref)
|
void e2d::GC::autorelease(Ref * ref)
|
||||||
{
|
{
|
||||||
if (ref)
|
if (ref)
|
||||||
{
|
{
|
||||||
auto iter = _instance._pool.find(ref);
|
_pool.insert(ref);
|
||||||
if (iter == _instance._pool.end())
|
|
||||||
{
|
|
||||||
_instance._pool.insert(std::make_pair(ref, false));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::GC::autoreleaseArray(Ref * ref)
|
void e2d::GC::safeRelease(Ref* ref)
|
||||||
{
|
{
|
||||||
|
if (_cleanup)
|
||||||
|
return;
|
||||||
|
|
||||||
if (ref)
|
if (ref)
|
||||||
{
|
{
|
||||||
auto iter = _instance._pool.find(ref);
|
auto iter = _pool.find(ref);
|
||||||
if (iter == _instance._pool.end())
|
if (iter != _pool.end())
|
||||||
{
|
{
|
||||||
_instance._pool.insert(std::make_pair(ref, true));
|
(*iter)->release();
|
||||||
}
|
_notifyed = true;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::GC::retain(Ref * ref)
|
|
||||||
{
|
|
||||||
if (ref && !_instance._cleanup)
|
|
||||||
{
|
|
||||||
auto iter = _instance._pool.find(ref);
|
|
||||||
if (iter != _instance._pool.end())
|
|
||||||
{
|
|
||||||
(*iter).first->retain();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::GC::release(Ref * ref)
|
|
||||||
{
|
|
||||||
if (ref && !_instance._cleanup)
|
|
||||||
{
|
|
||||||
auto iter = _instance._pool.find(ref);
|
|
||||||
if (iter != _instance._pool.end())
|
|
||||||
{
|
|
||||||
(*iter).first->release();
|
|
||||||
_instance._notifyed = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ e2d::Game::Game()
|
||||||
|
|
||||||
e2d::Game::~Game()
|
e2d::Game::~Game()
|
||||||
{
|
{
|
||||||
GC::safeRelease(_config);
|
GC::getInstance()->safeRelease(_config);
|
||||||
|
|
||||||
CoUninitialize();
|
CoUninitialize();
|
||||||
}
|
}
|
||||||
|
|
@ -43,6 +43,7 @@ void e2d::Game::destroyInstance()
|
||||||
|
|
||||||
void e2d::Game::start()
|
void e2d::Game::start()
|
||||||
{
|
{
|
||||||
|
auto gc = GC::getInstance();
|
||||||
auto input = Input::getInstance();
|
auto input = Input::getInstance();
|
||||||
auto window = Window::getInstance();
|
auto window = Window::getInstance();
|
||||||
auto renderer = Renderer::getInstance();
|
auto renderer = Renderer::getInstance();
|
||||||
|
|
@ -80,7 +81,7 @@ void e2d::Game::start()
|
||||||
|
|
||||||
if (frameInterval < interval)
|
if (frameInterval < interval)
|
||||||
{
|
{
|
||||||
_last = _now;
|
_last += interval;
|
||||||
|
|
||||||
input->update();
|
input->update();
|
||||||
timer->update();
|
timer->update();
|
||||||
|
|
@ -89,7 +90,7 @@ void e2d::Game::start()
|
||||||
_config->_update();
|
_config->_update();
|
||||||
renderer->render();
|
renderer->render();
|
||||||
window->poll();
|
window->poll();
|
||||||
GC::flush();
|
gc->flush();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -127,10 +128,10 @@ void e2d::Game::setConfig(Config* config)
|
||||||
{
|
{
|
||||||
if (config && _config != config)
|
if (config && _config != config)
|
||||||
{
|
{
|
||||||
GC::release(_config);
|
if (_config) _config->release();
|
||||||
_config = config;
|
_config = config;
|
||||||
_config->_unconfigured = true;
|
_config->_unconfigured = true;
|
||||||
GC::retain(_config);
|
_config->retain();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -153,7 +154,7 @@ void e2d::Game::quit()
|
||||||
|
|
||||||
void e2d::Game::cleanup()
|
void e2d::Game::cleanup()
|
||||||
{
|
{
|
||||||
GC::clear();
|
GC::getInstance()->clear();
|
||||||
Image::clearCache();
|
Image::clearCache();
|
||||||
Player::getInstance()->clearCache();
|
Player::getInstance()->clearCache();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,13 +7,13 @@ e2d::Scene::Scene()
|
||||||
, _root(nullptr)
|
, _root(nullptr)
|
||||||
{
|
{
|
||||||
_root = new (e2d::autorelease) Node();
|
_root = new (e2d::autorelease) Node();
|
||||||
GC::retain(_root);
|
_root->retain();
|
||||||
_root->_setParentScene(this);
|
_root->_setParentScene(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
e2d::Scene::~Scene()
|
e2d::Scene::~Scene()
|
||||||
{
|
{
|
||||||
GC::safeRelease(_root);
|
GC::getInstance()->safeRelease(_root);
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::Scene::render()
|
void e2d::Scene::render()
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,13 @@ time_t e2d::Time::getTimeStamp() const
|
||||||
|
|
||||||
e2d::Time e2d::Time::operator+(Duration const & other) const
|
e2d::Time e2d::Time::operator+(Duration const & other) const
|
||||||
{
|
{
|
||||||
return std::move(Time(_timePoint - milliseconds(other.milliseconds())));
|
return std::move(Time(_timePoint + milliseconds(other.milliseconds())));
|
||||||
|
}
|
||||||
|
|
||||||
|
e2d::Time & e2d::Time::operator+=(Duration const & other)
|
||||||
|
{
|
||||||
|
_timePoint += milliseconds(other.milliseconds());
|
||||||
|
return (*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
e2d::Duration e2d::Time::operator-(Time const & other) const
|
e2d::Duration e2d::Time::operator-(Time const & other) const
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ void e2d::VoiceCallback::OnBufferEnd(void * pBufferContext)
|
||||||
|
|
||||||
if (_music)
|
if (_music)
|
||||||
{
|
{
|
||||||
GC::release(_music);
|
_music->release();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -49,7 +49,7 @@ void e2d::VoiceCallback::OnBufferStart(void * pBufferContext)
|
||||||
{
|
{
|
||||||
if (_music)
|
if (_music)
|
||||||
{
|
{
|
||||||
GC::retain(_music);
|
_music->retain();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ void e2d::ActionManager::update()
|
||||||
// »ñÈ¡¶¯×÷ÔËÐÐ״̬
|
// »ñÈ¡¶¯×÷ÔËÐÐ״̬
|
||||||
if (action->_isDone())
|
if (action->_isDone())
|
||||||
{
|
{
|
||||||
GC::release(action);
|
action->release();
|
||||||
action->_target = nullptr;
|
action->_target = nullptr;
|
||||||
_runningActions.erase(_runningActions.begin() + i);
|
_runningActions.erase(_runningActions.begin() + i);
|
||||||
}
|
}
|
||||||
|
|
@ -136,7 +136,7 @@ void e2d::ActionManager::start(Action * action, Node * target, bool paused)
|
||||||
auto iter = std::find(_runningActions.begin(), _runningActions.end(), action);
|
auto iter = std::find(_runningActions.begin(), _runningActions.end(), action);
|
||||||
if (iter == _runningActions.end())
|
if (iter == _runningActions.end())
|
||||||
{
|
{
|
||||||
GC::retain(action);
|
action->retain();
|
||||||
action->_startWithTarget(target);
|
action->_startWithTarget(target);
|
||||||
action->_running = !paused;
|
action->_running = !paused;
|
||||||
_runningActions.push_back(action);
|
_runningActions.push_back(action);
|
||||||
|
|
@ -197,10 +197,10 @@ void e2d::ActionManager::clearAllBindedWith(Node * target)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < _runningActions.size();)
|
for (size_t i = 0; i < _runningActions.size();)
|
||||||
{
|
{
|
||||||
auto a = _runningActions[i];
|
auto action = _runningActions[i];
|
||||||
if (a->getTarget() == target)
|
if (action->getTarget() == target)
|
||||||
{
|
{
|
||||||
GC::safeRelease(a);
|
action->release();
|
||||||
_runningActions.erase(_runningActions.begin() + i);
|
_runningActions.erase(_runningActions.begin() + i);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -217,7 +217,7 @@ void e2d::ActionManager::clearAll()
|
||||||
{
|
{
|
||||||
for (auto action : _runningActions)
|
for (auto action : _runningActions)
|
||||||
{
|
{
|
||||||
GC::release(action);
|
action->release();
|
||||||
}
|
}
|
||||||
_runningActions.clear();
|
_runningActions.clear();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ void e2d::SceneManager::push(Scene * scene, Transition * transition /* = nullptr
|
||||||
|
|
||||||
// 保存下一场景的指针
|
// 保存下一场景的指针
|
||||||
_nextScene = scene;
|
_nextScene = scene;
|
||||||
GC::retain(_nextScene);
|
_nextScene->retain();
|
||||||
|
|
||||||
// 设置切换场景动作
|
// 设置切换场景动作
|
||||||
if (transition)
|
if (transition)
|
||||||
|
|
@ -49,10 +49,10 @@ void e2d::SceneManager::push(Scene * scene, Transition * transition /* = nullptr
|
||||||
if (_transition)
|
if (_transition)
|
||||||
{
|
{
|
||||||
_transition->_stop();
|
_transition->_stop();
|
||||||
GC::release(_transition);
|
_transition->release();
|
||||||
}
|
}
|
||||||
_transition = transition;
|
_transition = transition;
|
||||||
GC::retain(transition);
|
transition->retain();
|
||||||
transition->_init(_currScene, _nextScene);
|
transition->_init(_currScene, _nextScene);
|
||||||
transition->_update();
|
transition->_update();
|
||||||
}
|
}
|
||||||
|
|
@ -85,7 +85,7 @@ void e2d::SceneManager::pop(Transition * transition /* = nullptr */)
|
||||||
// 设置切换场景动作
|
// 设置切换场景动作
|
||||||
if (transition)
|
if (transition)
|
||||||
{
|
{
|
||||||
GC::retain(transition);
|
transition->retain();
|
||||||
transition->_init(_currScene, _nextScene);
|
transition->_init(_currScene, _nextScene);
|
||||||
transition->_update();
|
transition->_update();
|
||||||
_transition = transition;
|
_transition = transition;
|
||||||
|
|
@ -134,7 +134,7 @@ void e2d::SceneManager::update()
|
||||||
|
|
||||||
if (_transition->isDone())
|
if (_transition->isDone())
|
||||||
{
|
{
|
||||||
GC::release(_transition);
|
_transition->release();
|
||||||
_transition = nullptr;
|
_transition = nullptr;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -158,15 +158,15 @@ void e2d::SceneManager::update()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GC::release(_currScene);
|
_currScene->release();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 执行下一场景的 onEnter 函数
|
// 执行下一场景的 onEnter 函数
|
||||||
_nextScene->onEnter();
|
_nextScene->onEnter();
|
||||||
|
|
||||||
_currScene = _nextScene; // 切换场景
|
_currScene = _nextScene;
|
||||||
_nextScene = nullptr; // 下一场景置空
|
_nextScene = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -81,7 +81,7 @@ e2d::Node::~Node()
|
||||||
ActionManager::getInstance()->clearAllBindedWith(this);
|
ActionManager::getInstance()->clearAllBindedWith(this);
|
||||||
for (auto child : _children)
|
for (auto child : _children)
|
||||||
{
|
{
|
||||||
GC::release(child);
|
GC::getInstance()->safeRelease(child);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -713,7 +713,7 @@ void e2d::Node::addChild(Node * child, int order /* = 0 */)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GC::retain(child);
|
child->retain();
|
||||||
_children.push_back(child);
|
_children.push_back(child);
|
||||||
child->setOrder(order);
|
child->setOrder(order);
|
||||||
child->_parent = this;
|
child->_parent = this;
|
||||||
|
|
@ -820,7 +820,7 @@ bool e2d::Node::removeChild(Node * child)
|
||||||
child->_setParentScene(nullptr);
|
child->_setParentScene(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
GC::release(child);
|
child->release();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -851,7 +851,7 @@ void e2d::Node::removeChildren(const String& childName)
|
||||||
{
|
{
|
||||||
child->_setParentScene(nullptr);
|
child->_setParentScene(nullptr);
|
||||||
}
|
}
|
||||||
GC::release(child);
|
child->release();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -861,7 +861,7 @@ void e2d::Node::removeAllChildren()
|
||||||
// 所有节点的引用计数减一
|
// 所有节点的引用计数减一
|
||||||
for (auto child : _children)
|
for (auto child : _children)
|
||||||
{
|
{
|
||||||
GC::release(child);
|
child->release();
|
||||||
}
|
}
|
||||||
// 清空储存节点的容器
|
// 清空储存节点的容器
|
||||||
_children.clear();
|
_children.clear();
|
||||||
|
|
|
||||||
|
|
@ -40,16 +40,16 @@ e2d::Sprite::Sprite(const String & fileName, const Rect & cropRect)
|
||||||
|
|
||||||
e2d::Sprite::~Sprite()
|
e2d::Sprite::~Sprite()
|
||||||
{
|
{
|
||||||
GC::safeRelease(_image);
|
GC::getInstance()->safeRelease(_image);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool e2d::Sprite::open(Image * image)
|
bool e2d::Sprite::open(Image * image)
|
||||||
{
|
{
|
||||||
if (image)
|
if (image)
|
||||||
{
|
{
|
||||||
GC::release(_image);
|
if (_image) _image->release();
|
||||||
_image = image;
|
_image = image;
|
||||||
GC::retain(_image);
|
_image->retain();
|
||||||
|
|
||||||
Node::setSize(_image->getWidth(), _image->getHeight());
|
Node::setSize(_image->getWidth(), _image->getHeight());
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -62,7 +62,7 @@ bool e2d::Sprite::open(const Resource& res)
|
||||||
if (!_image)
|
if (!_image)
|
||||||
{
|
{
|
||||||
_image = new (e2d::autorelease) Image();
|
_image = new (e2d::autorelease) Image();
|
||||||
GC::retain(_image);
|
_image->retain();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_image->open(res))
|
if (_image->open(res))
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,7 @@ void e2d::Timer::addTask(Task * task)
|
||||||
auto iter = std::find(_tasks.begin(), _tasks.end(), task);
|
auto iter = std::find(_tasks.begin(), _tasks.end(), task);
|
||||||
if (iter == _tasks.end())
|
if (iter == _tasks.end())
|
||||||
{
|
{
|
||||||
GC::retain(task);
|
task->retain();
|
||||||
task->updateTime();
|
task->updateTime();
|
||||||
_tasks.push_back(task);
|
_tasks.push_back(task);
|
||||||
}
|
}
|
||||||
|
|
@ -105,7 +105,7 @@ void e2d::Timer::clearAllTasks()
|
||||||
|
|
||||||
for (auto task : _tasks)
|
for (auto task : _tasks)
|
||||||
{
|
{
|
||||||
GC::release(task);
|
task->release();
|
||||||
}
|
}
|
||||||
_tasks.clear();
|
_tasks.clear();
|
||||||
}
|
}
|
||||||
|
|
@ -121,7 +121,7 @@ void e2d::Timer::update()
|
||||||
// 清除已停止的任务
|
// 清除已停止的任务
|
||||||
if (task->_stopped)
|
if (task->_stopped)
|
||||||
{
|
{
|
||||||
GC::release(task);
|
task->release();
|
||||||
_tasks.erase(_tasks.begin() + i);
|
_tasks.erase(_tasks.begin() + i);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
||||||
|
|
@ -20,8 +20,8 @@ e2d::Transition::~Transition()
|
||||||
{
|
{
|
||||||
SafeRelease(_outLayer);
|
SafeRelease(_outLayer);
|
||||||
SafeRelease(_inLayer);
|
SafeRelease(_inLayer);
|
||||||
GC::safeRelease(_outScene);
|
GC::getInstance()->safeRelease(_outScene);
|
||||||
GC::safeRelease(_inScene);
|
GC::getInstance()->safeRelease(_inScene);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool e2d::Transition::isDone()
|
bool e2d::Transition::isDone()
|
||||||
|
|
@ -48,8 +48,8 @@ void e2d::Transition::_init(Scene * prev, Scene * next)
|
||||||
_last = Game::getInstance()->getTotalDuration();
|
_last = Game::getInstance()->getTotalDuration();
|
||||||
_outScene = prev;
|
_outScene = prev;
|
||||||
_inScene = next;
|
_inScene = next;
|
||||||
GC::retain(_outScene);
|
if (_outScene) _outScene->retain();
|
||||||
GC::retain(_inScene);
|
if (_inScene) _inScene->retain();
|
||||||
|
|
||||||
_windowSize = Window::getInstance()->getSize();
|
_windowSize = Window::getInstance()->getSize();
|
||||||
_outLayerParam = _inLayerParam = D2D1::LayerParameters();
|
_outLayerParam = _inLayerParam = D2D1::LayerParameters();
|
||||||
|
|
|
||||||
|
|
@ -361,42 +361,24 @@ private:
|
||||||
class GC
|
class GC
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
// 获取 GC 实例
|
||||||
|
static GC * getInstance();
|
||||||
|
|
||||||
// 自动释放
|
// 自动释放
|
||||||
static void autorelease(
|
void autorelease(
|
||||||
Ref* ref
|
|
||||||
);
|
|
||||||
|
|
||||||
// 自动释放数组
|
|
||||||
static void autoreleaseArray(
|
|
||||||
Ref* ref
|
|
||||||
);
|
|
||||||
|
|
||||||
// 保留
|
|
||||||
static void retain(
|
|
||||||
Ref* ref
|
|
||||||
);
|
|
||||||
|
|
||||||
// 释放
|
|
||||||
static void release(
|
|
||||||
Ref* ref
|
Ref* ref
|
||||||
);
|
);
|
||||||
|
|
||||||
// 安全地释放对象
|
// 安全地释放对象
|
||||||
template <typename Type>
|
void safeRelease(
|
||||||
static inline void safeRelease(Type*& p)
|
Ref* ref
|
||||||
{
|
);
|
||||||
if (p != nullptr)
|
|
||||||
{
|
|
||||||
GC::release(p);
|
|
||||||
p = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 刷新内存池
|
// 刷新内存池
|
||||||
static void flush();
|
void flush();
|
||||||
|
|
||||||
// 回收内存池中的所有对象
|
// 回收内存池中的所有对象
|
||||||
static void clear();
|
void clear();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GC();
|
GC();
|
||||||
|
|
@ -408,7 +390,7 @@ private:
|
||||||
private:
|
private:
|
||||||
bool _notifyed;
|
bool _notifyed;
|
||||||
bool _cleanup;
|
bool _cleanup;
|
||||||
std::map<Ref*, bool> _pool;
|
std::set<Ref*> _pool;
|
||||||
|
|
||||||
static GC _instance;
|
static GC _instance;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -452,9 +452,9 @@ public:
|
||||||
// 获取时间戳
|
// 获取时间戳
|
||||||
time_t getTimeStamp() const;
|
time_t getTimeStamp() const;
|
||||||
|
|
||||||
// 计算时间间隔后的时间点
|
|
||||||
Time operator + (Duration const & other) const;
|
Time operator + (Duration const & other) const;
|
||||||
// 计算两时间点的时间间隔
|
Time& operator += (Duration const &);
|
||||||
|
|
||||||
Duration operator - (Time const & other) const;
|
Duration operator - (Time const & other) const;
|
||||||
|
|
||||||
// 获取当前时间
|
// 获取当前时间
|
||||||
|
|
@ -1161,17 +1161,7 @@ void* operator new(
|
||||||
e2d::autorelease_t const&
|
e2d::autorelease_t const&
|
||||||
) E2D_NOEXCEPT;
|
) E2D_NOEXCEPT;
|
||||||
|
|
||||||
void* operator new[](
|
|
||||||
size_t size,
|
|
||||||
e2d::autorelease_t const&
|
|
||||||
) E2D_NOEXCEPT;
|
|
||||||
|
|
||||||
void operator delete(
|
void operator delete(
|
||||||
void* block,
|
void* block,
|
||||||
e2d::autorelease_t const&
|
e2d::autorelease_t const&
|
||||||
) E2D_NOEXCEPT;
|
) E2D_NOEXCEPT;
|
||||||
|
|
||||||
void operator delete[](
|
|
||||||
void* block,
|
|
||||||
e2d::autorelease_t const&
|
|
||||||
) E2D_NOEXCEPT;
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue