Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions docs/developer-guide/ecs/clock.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
## Clock

A clock can be used to measure time.

You need to create a clock, it will give you the ID to retrieve it and get ellapsed time

### Methods

```cpp
std::size_t Clock::create();
std::size_t Clock::elapsedSecondesSince(std::size_t id); // 1
std::size_t Clock::elapsedMillisecondsSince(std::size_t id); // 10^-3
std::size_t Clock::elapsedNanosecondsSince(std::size_t id); // 10^-9
void Clock::restart(std::size_t id);
```

### Example

```cpp
#include "Registry.hpp"

std::size_t id = Registry::getInstance().getClock().create();
std::cout << Registry::getInstance().getClock().elapsedMillisecondsSince(id) << std::endl;
Registry::getInstance().getClock().restart(id);
```
1 change: 1 addition & 0 deletions src/ECS/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,5 @@ target_sources(
${PROJECT_NAME_CLIENT}
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/Registry.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Clock.cpp
)
31 changes: 31 additions & 0 deletions src/ECS/Clock.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#include "Clock.hpp"
#include <chrono>

std::size_t Clock::create()
{
_clocks.emplace_back(std::chrono::high_resolution_clock::now());
return _clocks.size() - 1;
}

std::size_t Clock::elapsedMillisecondsSince(std::size_t id)
{
auto val = std::chrono::high_resolution_clock::now() - _clocks[id];
return std::chrono::duration_cast<std::chrono::milliseconds>(val).count();
}

std::size_t Clock::elapsedSecondesSince(std::size_t id)
{
auto val = std::chrono::high_resolution_clock::now() - _clocks[id];
return std::chrono::duration_cast<std::chrono::seconds>(val).count();
}

std::size_t Clock::elapsedNanosecondsSince(std::size_t id)
{
auto val = std::chrono::high_resolution_clock::now() - _clocks[id];
return std::chrono::duration_cast<std::chrono::nanoseconds>(val).count();
}

void Clock::restart(std::size_t id)
{
_clocks[id] = std::chrono::high_resolution_clock::now();
}
19 changes: 19 additions & 0 deletions src/ECS/Clock.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#pragma once

#include <chrono>
#include <cstddef>
#include <vector>

class Clock {
public:
Clock() = default;

std::size_t create();
std::size_t elapsedSecondesSince(std::size_t id); // 1
std::size_t elapsedMillisecondsSince(std::size_t id); // 10^-3
std::size_t elapsedNanosecondsSince(std::size_t id); // 10^-9
void restart(std::size_t id);

private:
std::vector<std::chrono::high_resolution_clock::time_point> _clocks;
};
6 changes: 6 additions & 0 deletions src/ECS/Registry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

#include "Registry.hpp"
#include <string>
#include "Clock.hpp"

// NOLINTBEGIN(cppcoreguidelines-avoid-non-const-global-variables)
Registry Registry::_instance = Registry();
Expand Down Expand Up @@ -141,3 +142,8 @@ Registry::Registry() : _entitiesNb(0)
{
initLayers(true);
}

Clock &Registry::getClock()
{
return _clock;
}
5 changes: 5 additions & 0 deletions src/ECS/Registry.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include <typeinfo>
#include <unordered_map>
#include <vector>
#include "Clock.hpp"
#include "SceneManager.hpp"
#include "SparseArray.hpp"

Expand Down Expand Up @@ -73,9 +74,13 @@ class Registry {
void operator=(const Registry &&) = delete;
Registry(Registry &&) = delete;

Clock &getClock();

private:
Registry();

Clock _clock;

void initLayers(bool back);

void removeFromDefaultLayer(std::size_t id);
Expand Down