From 6f785c1944d5b8a3f83503d240592abcda686703 Mon Sep 17 00:00:00 2001 From: omigamedev Date: Wed, 10 May 2017 13:41:27 +0100 Subject: [PATCH] log history memory usage add fix virtual dtor for Action subclasses to be deleted from memory --- engine.xcodeproj/project.pbxproj | 40 ++++++++++++++++---------------- engine/action.cpp | 1 + engine/action.h | 11 +++++++++ engine/app.cpp | 3 ++- engine/canvas.h | 15 ++++++++++++ engine/canvas_modes.cpp | 1 + 6 files changed, 50 insertions(+), 21 deletions(-) diff --git a/engine.xcodeproj/project.pbxproj b/engine.xcodeproj/project.pbxproj index 48a53ee..5475d51 100644 --- a/engine.xcodeproj/project.pbxproj +++ b/engine.xcodeproj/project.pbxproj @@ -223,44 +223,44 @@ AD58E0511E107411006ACC15 /* engine */ = { isa = PBXGroup; children = ( - AD744B6C1EBC9EF700B66E30 /* canvas_modes.cpp */, - AD744B6D1EBC9EF800B66E30 /* canvas_modes.h */, - ADB1C3DB1EA531B0009A65BD /* keymap.h */, - ADB1C3D81EA3A156009A65BD /* event.cpp */, - ADB1C3D91EA3A156009A65BD /* event.h */, AD29CC601EA2B214008C8BFA /* action.cpp */, AD29CC611EA2B214008C8BFA /* action.h */, - AD8CF71F1E913F0500083FFD /* log.cpp */, - AD8CF7201E913F0500083FFD /* log.h */, + AD58E0701E2A90EF006ACC15 /* app.cpp */, + AD58E0711E2A90EF006ACC15 /* app.h */, AD4C08CF1E89BD0F0051D85F /* asset.cpp */, AD4C08D01E89BD0F0051D85F /* asset.h */, AD4C08D11E89BD0F0051D85F /* bezier.cpp */, AD4C08D21E89BD0F0051D85F /* bezier.h */, AD4C08D31E89BD0F0051D85F /* brush.cpp */, AD4C08D41E89BD0F0051D85F /* brush.h */, + AD744B6C1EBC9EF700B66E30 /* canvas_modes.cpp */, + AD744B6D1EBC9EF800B66E30 /* canvas_modes.h */, AD4C08D51E89BD0F0051D85F /* canvas.cpp */, AD4C08D61E89BD0F0051D85F /* canvas.h */, - AD4C08D71E89BD0F0051D85F /* rtt.cpp */, - AD4C08D81E89BD0F0051D85F /* rtt.h */, + ADB1C3D81EA3A156009A65BD /* event.cpp */, + ADB1C3D91EA3A156009A65BD /* event.h */, AD95AEC31E41EDEC002DD03A /* font.cpp */, AD95AEC41E41EDEC002DD03A /* font.h */, - AD95AEC51E41EDEC002DD03A /* pch.cpp */, - AD3B1EBE1E3B8B7600E918E3 /* layout.cpp */, - AD3B1EBF1E3B8B7600E918E3 /* layout.h */, - AD58E0631E2A76FD006ACC15 /* shader.cpp */, - AD58E0641E2A76FD006ACC15 /* shader.h */, - AD58E0521E107411006ACC15 /* main.cpp */, - AD58E06D1E2A80BC006ACC15 /* shape.cpp */, - AD58E06E1E2A80BC006ACC15 /* shape.h */, - AD58E0701E2A90EF006ACC15 /* app.cpp */, - AD58E0711E2A90EF006ACC15 /* app.h */, AD58E0661E2A7741006ACC15 /* image.cpp */, AD58E0671E2A7741006ACC15 /* image.h */, + ADB1C3DB1EA531B0009A65BD /* keymap.h */, + AD3B1EBE1E3B8B7600E918E3 /* layout.cpp */, + AD3B1EBF1E3B8B7600E918E3 /* layout.h */, + AD8CF71F1E913F0500083FFD /* log.cpp */, + AD8CF7201E913F0500083FFD /* log.h */, + AD58E0521E107411006ACC15 /* main.cpp */, + AD95AEC51E41EDEC002DD03A /* pch.cpp */, + AD58E06C1E2A78BD006ACC15 /* pch.h */, + AD4C08D71E89BD0F0051D85F /* rtt.cpp */, + AD4C08D81E89BD0F0051D85F /* rtt.h */, + AD58E0631E2A76FD006ACC15 /* shader.cpp */, + AD58E0641E2A76FD006ACC15 /* shader.h */, + AD58E06D1E2A80BC006ACC15 /* shape.cpp */, + AD58E06E1E2A80BC006ACC15 /* shape.h */, AD58E0691E2A774F006ACC15 /* texture.cpp */, AD58E06A1E2A774F006ACC15 /* texture.h */, ADB61C801E3D38450093280F /* util.cpp */, ADB61C811E3D38450093280F /* util.h */, - AD58E06C1E2A78BD006ACC15 /* pch.h */, ); path = engine; sourceTree = ""; diff --git a/engine/action.cpp b/engine/action.cpp index 084943c..3109abc 100644 --- a/engine/action.cpp +++ b/engine/action.cpp @@ -1,4 +1,5 @@ #include "pch.h" +#include "log.h" #include "action.h" ActionManager ActionManager::I; diff --git a/engine/action.h b/engine/action.h index b8e902f..583ed8f 100644 --- a/engine/action.h +++ b/engine/action.h @@ -5,6 +5,8 @@ class Action public: virtual void run() = 0; virtual void undo() = 0; + virtual size_t memory() = 0; + virtual ~Action(){}; }; class ActionManager @@ -12,13 +14,22 @@ class ActionManager public: static ActionManager I; std::stack> m_actions; + size_t m_memory = 0; static void add(Action* action) { I.m_actions.emplace(action); + I.m_memory += action->memory(); + LOG("History: %.2f KB", I.m_memory / 1024.f); } static void undo() { I.m_actions.top()->undo(); + I.m_memory -= I.m_actions.top()->memory(); I.m_actions.pop(); + LOG("History: %.2f KB", I.m_memory / 1024.f); + } + static bool empty() + { + return I.m_actions.empty(); } }; diff --git a/engine/app.cpp b/engine/app.cpp index f408388..b6a385b 100644 --- a/engine/app.cpp +++ b/engine/app.cpp @@ -623,7 +623,8 @@ void App::initLayout() if (auto* button = layout[main_id]->find("btn-undo")) { button->on_click = [this,button](Node*) { - ActionManager::undo(); + if (!ActionManager::empty()) + ActionManager::undo(); }; } if (auto* button = layout[main_id]->find("btn-clear")) diff --git a/engine/canvas.h b/engine/canvas.h index df730b5..c47b654 100644 --- a/engine/canvas.h +++ b/engine/canvas.h @@ -157,6 +157,21 @@ public: m_canvas->m_layers[m_layer_idx].m_rtt[i].unbindTexture(); } } + virtual size_t memory() override + { + size_t mem = 0; + for (int i = 0; i < 6; i++) + { + glm::vec2 sz = m_box[i].zw() - m_box[i].xy(); + mem += sz.x * sz.y * 4 + sizeof(*this); + } + return mem; + } + virtual ~ActionStroke() + { + + LOG("ActionStroke destroyed: free %zu bytes", memory()); + } }; NS_END diff --git a/engine/canvas_modes.cpp b/engine/canvas_modes.cpp index a35759b..ef5e4ac 100644 --- a/engine/canvas_modes.cpp +++ b/engine/canvas_modes.cpp @@ -353,6 +353,7 @@ void CanvasModeFill::on_MouseEvent(MouseEvent* me, glm::vec2& loc) case kEventType::MouseCancel: m_dragging = false; node->mouse_release(); + m_points.clear(); break; default: break;