Support reporting ECS memory usage

This commit is contained in:
Nikita Lisitsa 2024-06-03 11:35:37 +03:00
parent 7279a5b6f5
commit 68d4adcad2
4 changed files with 43 additions and 0 deletions

View file

@ -378,6 +378,9 @@ namespace psemek::ecs
template <typename Index, typename ... Args>
Index & index(Args && ... args);
template <typename ... Components>
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 <typename ... Components>
std::size_t container::memory_usage()
{
auto cache = this->cache<Components...>();
std::size_t result = 0;
for (auto const & entry : cache->entries)
result += entry.table->memory_usage();
return result;
}
}

View file

@ -51,6 +51,8 @@ namespace psemek::ecs::detail
virtual std::unique_ptr<column> 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<column> 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<column> 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<column_impl<Component, Empty>>();
}
template <typename Component, bool Empty>
std::size_t column_impl<Component, Empty>::memory_usage() const
{
return sizeof(Component) * row_count_;
}
template <typename Component, bool Empty>
column_impl<Component, Empty>::~column_impl()
{
@ -268,6 +280,12 @@ namespace psemek::ecs::detail
return std::make_unique<column_impl<Component, true>>();
}
template <typename Component>
std::size_t column_impl<Component, true>::memory_usage() const
{
return sizeof(Component);
}
template <typename Component>
column_impl<Component, true>::~column_impl()
{

View file

@ -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<util::uuid> const & detached_components);
std::size_t memory_usage() const;
protected:
std::size_t hash_;
std::vector<std::unique_ptr<detail::column>> columns_;

View file

@ -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;
}
}