diff options
Diffstat (limited to 'mwe/ecs-memory-efficient')
-rw-r--r-- | mwe/ecs-memory-efficient/inc/ComponentManager.h | 26 | ||||
-rw-r--r-- | mwe/ecs-memory-efficient/inc/ComponentManager.hpp | 14 | ||||
-rw-r--r-- | mwe/ecs-memory-efficient/inc/ContiguousContainer.h | 38 | ||||
-rw-r--r-- | mwe/ecs-memory-efficient/inc/ContiguousContainer.hpp | 124 | ||||
-rw-r--r-- | mwe/ecs-memory-efficient/inc/GameObjectMax.h | 12 | ||||
-rw-r--r-- | mwe/ecs-memory-efficient/inc/GameObjectMax.hpp | 15 | ||||
-rw-r--r-- | mwe/ecs-memory-efficient/src/ComponentManager.cpp | 13 | ||||
-rw-r--r-- | mwe/ecs-memory-efficient/src/main.cpp | 33 |
8 files changed, 142 insertions, 133 deletions
diff --git a/mwe/ecs-memory-efficient/inc/ComponentManager.h b/mwe/ecs-memory-efficient/inc/ComponentManager.h index 066795a..8279a9a 100644 --- a/mwe/ecs-memory-efficient/inc/ComponentManager.h +++ b/mwe/ecs-memory-efficient/inc/ComponentManager.h @@ -5,28 +5,28 @@ class ComponentManager { public: - static ComponentManager& GetInstance(); //Singleton + static ComponentManager & GetInstance(); //Singleton - ComponentManager(const ComponentManager&) = delete; //Singleton - ComponentManager(ComponentManager&&) = delete; //Singleton - ComponentManager& operator=(const ComponentManager&) = delete; //Singleton - ComponentManager& operator=(ComponentManager&&) = delete; //Singleton + ComponentManager(const ComponentManager &) = delete; //Singleton + ComponentManager(ComponentManager &&) = delete; //Singleton + ComponentManager & operator=(const ComponentManager &) = delete; //Singleton + ComponentManager & operator=(ComponentManager &&) = delete; //Singleton - template<typename... Args> - void addSpriteComponent(Args&&... args); - template<typename... Args> - void addRigidbodyComponent(Args&&... args); - template<typename... Args> - void addColiderComponent(Args&&... args); + template <typename... Args> + void addSpriteComponent(Args &&... args); + template <typename... Args> + void addRigidbodyComponent(Args &&... args); + template <typename... Args> + void addColiderComponent(Args &&... args); std::vector<std::reference_wrapper<Sprite>> getAllSpriteReferences(); std::vector<std::reference_wrapper<Rigidbody>> getAllRigidbodyReferences(); std::vector<std::reference_wrapper<Colider>> getAllColiderReferences(); private: - static ComponentManager mInstance; //Singleton + static ComponentManager mInstance; //Singleton - ComponentManager(); //Singleton + ComponentManager(); //Singleton ContiguousContainer<Sprite> mSpriteContainer; ContiguousContainer<Rigidbody> mRigidbodyContainer; diff --git a/mwe/ecs-memory-efficient/inc/ComponentManager.hpp b/mwe/ecs-memory-efficient/inc/ComponentManager.hpp index 1607c0c..a914a6b 100644 --- a/mwe/ecs-memory-efficient/inc/ComponentManager.hpp +++ b/mwe/ecs-memory-efficient/inc/ComponentManager.hpp @@ -1,15 +1,15 @@ - -template<typename... Args> -void ComponentManager::addSpriteComponent(Args&&... args) { + +template <typename... Args> +void ComponentManager::addSpriteComponent(Args &&... args) { mSpriteContainer.pushBack(std::forward<Args>(args)...); } -template<typename... Args> -void ComponentManager::addRigidbodyComponent(Args&&... args) { +template <typename... Args> +void ComponentManager::addRigidbodyComponent(Args &&... args) { mRigidbodyContainer.pushBack(std::forward<Args>(args)...); } -template<typename... Args> -void ComponentManager::addColiderComponent(Args&&... args){ +template <typename... Args> +void ComponentManager::addColiderComponent(Args &&... args) { mColiderContainer.pushBack(std::forward<Args>(args)...); } diff --git a/mwe/ecs-memory-efficient/inc/ContiguousContainer.h b/mwe/ecs-memory-efficient/inc/ContiguousContainer.h index dd0321e..e3b57ba 100644 --- a/mwe/ecs-memory-efficient/inc/ContiguousContainer.h +++ b/mwe/ecs-memory-efficient/inc/ContiguousContainer.h @@ -1,34 +1,34 @@ #pragma once -#include <cstdlib> // For malloc and free -#include <new> // For placement new -#include <utility> // For std::move and std::forward +#include <cstdlib> // For malloc and free +#include <new> // For placement new #include <stdexcept> // For std::bad_alloc -#include <vector> // For returning references +#include <utility> // For std::move and std::forward +#include <vector> // For returning references -template<typename T> +template <typename T> class ContiguousContainer { public: - ContiguousContainer(); - ~ContiguousContainer(); + ContiguousContainer(); + ~ContiguousContainer(); - // Use perfect forwarding for pushBack - template<typename... Args> - void pushBack(Args&&... args); - - void popBack(); - T& operator[](size_t index); - size_t getSize() const; + // Use perfect forwarding for pushBack + template <typename... Args> + void pushBack(Args &&... args); + + void popBack(); + T & operator[](size_t index); + size_t getSize() const; // Function to return references to all stored objects - std::vector<std::reference_wrapper<T>> getAllReferences(); + std::vector<std::reference_wrapper<T>> getAllReferences(); private: - T* mData; - size_t mSize; - size_t mCapacity; + T * mData; + size_t mSize; + size_t mCapacity; - void resize(size_t new_capacity); // Resize function to allocate more space + void resize(size_t new_capacity); // Resize function to allocate more space }; #include "ContiguousContainer.hpp" diff --git a/mwe/ecs-memory-efficient/inc/ContiguousContainer.hpp b/mwe/ecs-memory-efficient/inc/ContiguousContainer.hpp index 878a85f..408d5aa 100644 --- a/mwe/ecs-memory-efficient/inc/ContiguousContainer.hpp +++ b/mwe/ecs-memory-efficient/inc/ContiguousContainer.hpp @@ -1,84 +1,84 @@ -template<typename T> -ContiguousContainer<T>::ContiguousContainer() - : mSize(0), mCapacity(10) { - // Allocate memory for 10 objects initially - mData = static_cast<T*>(malloc(mCapacity * sizeof(T))); - if (!mData) { - throw std::bad_alloc(); - } +template <typename T> +ContiguousContainer<T>::ContiguousContainer() : mSize(0), mCapacity(10) { + // Allocate memory for 10 objects initially + mData = static_cast<T *>(malloc(mCapacity * sizeof(T))); + if (!mData) { + throw std::bad_alloc(); + } } -template<typename T> +template <typename T> ContiguousContainer<T>::~ContiguousContainer() { - // Destroy all constructed objects - for (size_t i = 0; i < mSize; ++i) { - mData[i].~T(); - } - // Free the allocated memory - free(mData); + // Destroy all constructed objects + for (size_t i = 0; i < mSize; ++i) { + mData[i].~T(); + } + // Free the allocated memory + free(mData); } -template<typename T> -template<typename... Args> -void ContiguousContainer<T>::pushBack(Args&&... args) { - if (mSize == mCapacity) { - // Double the capacity if the container is full - resize(mCapacity * 2); - } - // Use placement new with perfect forwarding to construct the object in place - new (mData + mSize) T(std::forward<Args>(args)...); - ++mSize; +template <typename T> +template <typename... Args> +void ContiguousContainer<T>::pushBack(Args &&... args) { + if (mSize == mCapacity) { + // Double the capacity if the container is full + resize(mCapacity * 2); + } + // Use placement new with perfect forwarding to construct the object in place + new (mData + mSize) T(std::forward<Args>(args)...); + ++mSize; } -template<typename T> +template <typename T> void ContiguousContainer<T>::popBack() { - if (mSize > 0) { - --mSize; - // Explicitly call the destructor - mData[mSize].~T(); - } + if (mSize > 0) { + --mSize; + // Explicitly call the destructor + mData[mSize].~T(); + } } -template<typename T> -T& ContiguousContainer<T>::operator[](size_t index) { - if (index >= mSize) { - throw std::out_of_range("Index out of range"); - } - return mData[index]; +template <typename T> +T & ContiguousContainer<T>::operator[](size_t index) { + if (index >= mSize) { + throw std::out_of_range("Index out of range"); + } + return mData[index]; } -template<typename T> +template <typename T> size_t ContiguousContainer<T>::getSize() const { - return mSize; + return mSize; } // Function that returns a vector of references to all stored objects -template<typename T> -std::vector<std::reference_wrapper<T>> ContiguousContainer<T>::getAllReferences() { - std::vector<std::reference_wrapper<T>> references; - references.reserve(mSize); // Reserve space to avoid reallocation - for (size_t i = 0; i < mSize; ++i) { - references.push_back(std::ref(mData[i])); - } - return references; +template <typename T> +std::vector<std::reference_wrapper<T>> +ContiguousContainer<T>::getAllReferences() { + std::vector<std::reference_wrapper<T>> references; + references.reserve(mSize); // Reserve space to avoid reallocation + for (size_t i = 0; i < mSize; ++i) { + references.push_back(std::ref(mData[i])); + } + return references; } -template<typename T> +template <typename T> void ContiguousContainer<T>::resize(size_t new_capacity) { - // Allocate new memory block with the updated capacity - T* new_data = static_cast<T*>(malloc(new_capacity * sizeof(T))); - if (!new_data) { - throw std::bad_alloc(); - } + // Allocate new memory block with the updated capacity + T * new_data = static_cast<T *>(malloc(new_capacity * sizeof(T))); + if (!new_data) { + throw std::bad_alloc(); + } - // Move or copy existing objects to the new memory block - for (size_t i = 0; i < mSize; ++i) { - new (new_data + i) T(std::move(mData[i])); // Move the objects - mData[i].~T(); // Call the destructor for the old object - } + // Move or copy existing objects to the new memory block + for (size_t i = 0; i < mSize; ++i) { + new (new_data + i) T(std::move(mData[i])); // Move the objects + mData[i].~T(); // Call the destructor for the old object + } - // Free the old memory block - free(mData); - mData = new_data; - mCapacity = new_capacity; + // Free the old memory block + free(mData); + mData = new_data; + mCapacity = new_capacity; } diff --git a/mwe/ecs-memory-efficient/inc/GameObjectMax.h b/mwe/ecs-memory-efficient/inc/GameObjectMax.h index 62cd3e6..760e330 100644 --- a/mwe/ecs-memory-efficient/inc/GameObjectMax.h +++ b/mwe/ecs-memory-efficient/inc/GameObjectMax.h @@ -7,12 +7,12 @@ class GameObject { public: GameObject(std::uint32_t id, std::string name, std::string tag, int layer); - template<typename... Args> - void addSpriteComponent(Args&&... args); - template<typename... Args> - void addRigidbodyComponent(Args&&... args); - template<typename... Args> - void addColiderComponent(Args&&... args); + template <typename... Args> + void addSpriteComponent(Args &&... args); + template <typename... Args> + void addRigidbodyComponent(Args &&... args); + template <typename... Args> + void addColiderComponent(Args &&... args); std::uint32_t mId; std::string mName; diff --git a/mwe/ecs-memory-efficient/inc/GameObjectMax.hpp b/mwe/ecs-memory-efficient/inc/GameObjectMax.hpp index aac9811..be3ffa2 100644 --- a/mwe/ecs-memory-efficient/inc/GameObjectMax.hpp +++ b/mwe/ecs-memory-efficient/inc/GameObjectMax.hpp @@ -1,16 +1,19 @@ #include "ComponentManager.h" template <typename... Args> -void GameObject::addSpriteComponent(Args&&... args) { - ComponentManager::GetInstance().addSpriteComponent(std::forward<Args>(args)...); +void GameObject::addSpriteComponent(Args &&... args) { + ComponentManager::GetInstance().addSpriteComponent( + std::forward<Args>(args)...); } template <typename... Args> -void GameObject::addRigidbodyComponent(Args&&... args) { - ComponentManager::GetInstance().addRigidbodyComponent(std::forward<Args>(args)...); +void GameObject::addRigidbodyComponent(Args &&... args) { + ComponentManager::GetInstance().addRigidbodyComponent( + std::forward<Args>(args)...); } template <typename... Args> -void GameObject::addColiderComponent(Args&&... args) { - ComponentManager::GetInstance().addColiderComponent(std::forward<Args>(args)...); +void GameObject::addColiderComponent(Args &&... args) { + ComponentManager::GetInstance().addColiderComponent( + std::forward<Args>(args)...); } diff --git a/mwe/ecs-memory-efficient/src/ComponentManager.cpp b/mwe/ecs-memory-efficient/src/ComponentManager.cpp index 20d0ce0..8c1fd23 100644 --- a/mwe/ecs-memory-efficient/src/ComponentManager.cpp +++ b/mwe/ecs-memory-efficient/src/ComponentManager.cpp @@ -2,20 +2,21 @@ ComponentManager ComponentManager::mInstance; -ComponentManager& ComponentManager::GetInstance() { - return mInstance; -} +ComponentManager & ComponentManager::GetInstance() { return mInstance; } ComponentManager::ComponentManager() {} -std::vector<std::reference_wrapper<Sprite>> ComponentManager::getAllSpriteReferences() { +std::vector<std::reference_wrapper<Sprite>> +ComponentManager::getAllSpriteReferences() { return mSpriteContainer.getAllReferences(); } -std::vector<std::reference_wrapper<Rigidbody>> ComponentManager::getAllRigidbodyReferences() { +std::vector<std::reference_wrapper<Rigidbody>> +ComponentManager::getAllRigidbodyReferences() { return mRigidbodyContainer.getAllReferences(); } -std::vector<std::reference_wrapper<Colider>> ComponentManager::getAllColiderReferences() { +std::vector<std::reference_wrapper<Colider>> +ComponentManager::getAllColiderReferences() { return mColiderContainer.getAllReferences(); } diff --git a/mwe/ecs-memory-efficient/src/main.cpp b/mwe/ecs-memory-efficient/src/main.cpp index c25816b..9c6f2aa 100644 --- a/mwe/ecs-memory-efficient/src/main.cpp +++ b/mwe/ecs-memory-efficient/src/main.cpp @@ -1,18 +1,18 @@ +#include <chrono> +#include <cstdint> #include <iostream> #include <vector> -#include <cstdint> -#include <chrono> #include "ComponentManager.h" -#include "GameObjectMax.h" #include "Components.h" +#include "GameObjectMax.h" int main() { auto startAdding = std::chrono::high_resolution_clock::now(); - GameObject* gameObject[100000]; + GameObject * gameObject[100000]; - for(int i = 0; i < 100000; ++i) { + for (int i = 0; i < 100000; ++i) { gameObject[i] = new GameObject(i, "Name", "Tag", 0); gameObject[i]->addSpriteComponent("C:/Test"); @@ -24,31 +24,36 @@ int main() { //This is what systems would do: - std::vector<std::reference_wrapper<Sprite>> allSprites = ComponentManager::GetInstance().getAllSpriteReferences(); - for(Sprite& sprite : allSprites) { + std::vector<std::reference_wrapper<Sprite>> allSprites + = ComponentManager::GetInstance().getAllSpriteReferences(); + for (Sprite & sprite : allSprites) { //std::cout << sprite.mPath << std::endl; } //std::cout << std::endl; - std::vector<std::reference_wrapper<Rigidbody>> allRigidbody = ComponentManager::GetInstance().getAllRigidbodyReferences(); - for(Rigidbody& rigidbody : allRigidbody) { + std::vector<std::reference_wrapper<Rigidbody>> allRigidbody + = ComponentManager::GetInstance().getAllRigidbodyReferences(); + for (Rigidbody & rigidbody : allRigidbody) { //std::cout << rigidbody.mMass << " " << rigidbody.mGravityScale << " " << rigidbody.mBodyType << std::endl; } //std::cout << std::endl; - std::vector<std::reference_wrapper<Colider>> allColider = ComponentManager::GetInstance().getAllColiderReferences(); - for(Colider& colider : allColider) { + std::vector<std::reference_wrapper<Colider>> allColider + = ComponentManager::GetInstance().getAllColiderReferences(); + for (Colider & colider : allColider) { //std::cout << colider.mSize << std::endl; } auto stopLooping = std::chrono::high_resolution_clock::now(); for (int i = 0; i < 100000; ++i) { - delete gameObject[i]; + delete gameObject[i]; } - auto Addtime = std::chrono::duration_cast<std::chrono::microseconds>(stopAdding - startAdding); - auto LoopTime = std::chrono::duration_cast<std::chrono::microseconds>(stopLooping - stopAdding); + auto Addtime = std::chrono::duration_cast<std::chrono::microseconds>( + stopAdding - startAdding); + auto LoopTime = std::chrono::duration_cast<std::chrono::microseconds>( + stopLooping - stopAdding); std::cout << "AddTime: " << Addtime.count() << " us" << std::endl; std::cout << "LoopTime: " << LoopTime.count() << " us" << std::endl; } |