Skip to content

Commit ddfabed

Browse files
authored
Merge pull request #578 from OpenVicProject/add/elapsed-time-callbacks
Add elapsed time callbacks to GameManager
2 parents a58d43d + 241d48e commit ddfabed

File tree

4 files changed

+58
-7
lines changed

4 files changed

+58
-7
lines changed

src/headless/main.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,12 @@ static bool run_headless(fs::path const& root, memory::vector<memory::string>& m
146146
Dataloader::path_vector_t roots = { root };
147147
Dataloader::path_vector_t replace_paths = {};
148148

149-
GameManager game_manager { []() {
150-
Logger::info("State updated");
151-
} };
149+
GameManager game_manager {
150+
[] {
151+
Logger::info("State updated");
152+
},
153+
nullptr, nullptr
154+
};
152155

153156
Logger::info("Commit hash: ", GameManager::get_commit_hash());
154157

src/openvic-simulation/GameManager.cpp

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,45 @@
11
#include "GameManager.hpp"
22

3+
#include <chrono>
4+
5+
#include <cstddef>
36
#include <string_view>
47

58
#include "openvic-simulation/dataloader/Dataloader.hpp"
69
#include "openvic-simulation/utility/Logger.hpp"
710

811
using namespace OpenVic;
912

13+
static std::chrono::time_point elapsed_time_begin = std::chrono::high_resolution_clock::now();
14+
15+
GameManager::elapsed_time_getter_func_t GameManager::get_elapsed_usec_time_callback = []() -> uint64_t {
16+
std::chrono::time_point current = std::chrono::high_resolution_clock::now();
17+
return std::chrono::duration_cast<std::chrono::microseconds>(current - elapsed_time_begin).count();
18+
};
19+
20+
GameManager::elapsed_time_getter_func_t GameManager::get_elapsed_msec_time_callback = []() -> uint64_t {
21+
std::chrono::time_point current = std::chrono::high_resolution_clock::now();
22+
return std::chrono::duration_cast<std::chrono::milliseconds>(current - elapsed_time_begin).count();
23+
};
24+
1025
GameManager::GameManager(
11-
InstanceManager::gamestate_updated_func_t new_gamestate_updated_callback
26+
InstanceManager::gamestate_updated_func_t new_gamestate_updated_callback,
27+
elapsed_time_getter_func_t new_get_elapsed_usec_callback,
28+
elapsed_time_getter_func_t new_get_elapsed_msec_callback
1229
) : gamestate_updated_callback {
1330
new_gamestate_updated_callback ? std::move(new_gamestate_updated_callback) : []() {}
14-
}, definitions_loaded { false }, mod_descriptors_loaded { false } {}
31+
}, definitions_loaded { false }, mod_descriptors_loaded { false } {
32+
if (new_get_elapsed_usec_callback) {
33+
get_elapsed_usec_time_callback = { std::move(new_get_elapsed_usec_callback) };
34+
}
35+
if (new_get_elapsed_msec_callback) {
36+
get_elapsed_msec_time_callback = { std::move(new_get_elapsed_msec_callback) };
37+
}
38+
39+
if (bool(new_get_elapsed_usec_callback) != bool(new_get_elapsed_msec_callback)) {
40+
Logger::warning("Only one of the elapsed time callbacks was set.");
41+
}
42+
}
1543

1644
GameManager::~GameManager() {
1745
if (instance_manager) {
@@ -223,3 +251,11 @@ bool GameManager::update_clock() {
223251

224252
return instance_manager->update_clock();
225253
}
254+
255+
uint64_t GameManager::get_elapsed_microseconds() {
256+
return get_elapsed_usec_time_callback();
257+
}
258+
259+
uint64_t GameManager::get_elapsed_milliseconds() {
260+
return get_elapsed_msec_time_callback();
261+
}

src/openvic-simulation/GameManager.hpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,16 @@
1111
#include "openvic-simulation/gen/commit_info.gen.hpp"
1212
#include "openvic-simulation/utility/ForwardableSpan.hpp"
1313

14+
#include <function2/function2.hpp>
15+
1416
namespace OpenVic {
1517
struct GameManager {
18+
using elapsed_time_getter_func_t = fu2::function_base<true, true, fu2::capacity_none, false, false, uint64_t() const>;
19+
1620
private:
21+
static elapsed_time_getter_func_t get_elapsed_usec_time_callback;
22+
static elapsed_time_getter_func_t get_elapsed_msec_time_callback;
23+
1724
GameRulesManager PROPERTY(game_rules_manager);
1825
Dataloader PROPERTY(dataloader);
1926
DefinitionManager PROPERTY(definition_manager);
@@ -26,7 +33,9 @@ namespace OpenVic {
2633

2734
public:
2835
GameManager(
29-
InstanceManager::gamestate_updated_func_t new_gamestate_updated_callback
36+
InstanceManager::gamestate_updated_func_t new_gamestate_updated_callback,
37+
elapsed_time_getter_func_t new_get_elapsed_usec_callback,
38+
elapsed_time_getter_func_t new_get_elapsed_msec_callback
3039
);
3140
~GameManager();
3241

@@ -71,5 +80,8 @@ namespace OpenVic {
7180
static constexpr uint64_t get_commit_timestamp() {
7281
return SIM_COMMIT_TIMESTAMP;
7382
}
83+
84+
static uint64_t get_elapsed_microseconds();
85+
static uint64_t get_elapsed_milliseconds();
7486
};
7587
}

tests/benchmarks/src/dataloading/Dataloading.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ TEST_CASE("Dataloading benchmark", "[benchmarks][benchmark-dataloading]") {
1111
Dataloader::path_vector_t roots { root };
1212

1313
ankerl::nanobench::Bench().epochs(10).run("Dataloading", [&] {
14-
OpenVic::GameManager game_manager { []() {} };
14+
OpenVic::GameManager game_manager { []() {}, nullptr, nullptr };
1515

1616
game_manager.set_base_path(roots);
1717
game_manager.load_definitions(

0 commit comments

Comments
 (0)