From 68d4adcad2e93b32ab7fb8f6a8874706c71ccd3f Mon Sep 17 00:00:00 2001 From: lisyarus Date: Mon, 3 Jun 2024 11:35:37 +0300 Subject: [PATCH] Support reporting ECS memory usage --- libs/ecs/include/psemek/ecs/container.hpp | 15 +++++++++++++++ libs/ecs/include/psemek/ecs/detail/column.hpp | 18 ++++++++++++++++++ libs/ecs/include/psemek/ecs/detail/table.hpp | 2 ++ libs/ecs/source/detail/table.cpp | 8 ++++++++ 4 files changed, 43 insertions(+) diff --git a/libs/ecs/include/psemek/ecs/container.hpp b/libs/ecs/include/psemek/ecs/container.hpp index 1040bf97..04b7232f 100644 --- a/libs/ecs/include/psemek/ecs/container.hpp +++ b/libs/ecs/include/psemek/ecs/container.hpp @@ -378,6 +378,9 @@ namespace psemek::ecs template Index & index(Args && ... args); + template + std::size_t memory_usage(); + private: detail::entity_list entity_list_; detail::table_container table_container_; @@ -716,4 +719,16 @@ namespace psemek::ecs return result; } + template + std::size_t container::memory_usage() + { + auto cache = this->cache(); + std::size_t result = 0; + + for (auto const & entry : cache->entries) + result += entry.table->memory_usage(); + + return result; + } + } diff --git a/libs/ecs/include/psemek/ecs/detail/column.hpp b/libs/ecs/include/psemek/ecs/detail/column.hpp index 2639f9e7..1e1cd358 100644 --- a/libs/ecs/include/psemek/ecs/detail/column.hpp +++ b/libs/ecs/include/psemek/ecs/detail/column.hpp @@ -51,6 +51,8 @@ namespace psemek::ecs::detail virtual std::unique_ptr clone() const = 0; + virtual std::size_t memory_usage() const = 0; + virtual ~column() = default; protected: @@ -83,6 +85,8 @@ namespace psemek::ecs::detail std::unique_ptr clone() const override; + std::size_t memory_usage() const override; + ~column_impl() override; private: @@ -107,6 +111,8 @@ namespace psemek::ecs::detail std::unique_ptr clone() const override; + std::size_t memory_usage() const override; + ~column_impl() override; }; @@ -196,6 +202,12 @@ namespace psemek::ecs::detail return std::make_unique>(); } + template + std::size_t column_impl::memory_usage() const + { + return sizeof(Component) * row_count_; + } + template column_impl::~column_impl() { @@ -268,6 +280,12 @@ namespace psemek::ecs::detail return std::make_unique>(); } + template + std::size_t column_impl::memory_usage() const + { + return sizeof(Component); + } + template column_impl::~column_impl() { diff --git a/libs/ecs/include/psemek/ecs/detail/table.hpp b/libs/ecs/include/psemek/ecs/detail/table.hpp index 4f853713..a2ba752e 100644 --- a/libs/ecs/include/psemek/ecs/detail/table.hpp +++ b/libs/ecs/include/psemek/ecs/detail/table.hpp @@ -79,6 +79,8 @@ namespace psemek::ecs::detail void trigger_destructors(container & container, std::uint32_t row); void trigger_destructors(container & container, std::uint32_t row, util::hash_set const & detached_components); + std::size_t memory_usage() const; + protected: std::size_t hash_; std::vector> columns_; diff --git a/libs/ecs/source/detail/table.cpp b/libs/ecs/source/detail/table.cpp index e57e7c6e..0e1bafcd 100644 --- a/libs/ecs/source/detail/table.cpp +++ b/libs/ecs/source/detail/table.cpp @@ -178,4 +178,12 @@ namespace psemek::ecs::detail callback(container, *this, row, detached_components, false); } + std::size_t table::memory_usage() const + { + std::size_t result = 0; + for (auto const & column : columns_) + result += column->memory_usage(); + return result; + } + }