engine initialization improvements

This commit is contained in:
Turánszki János
2024-07-24 06:42:00 +02:00
parent dafc77f4b9
commit d249ab3cb6
8 changed files with 82 additions and 38 deletions
+16 -7
View File
@@ -7,24 +7,28 @@
namespace wi::initializer
{
static bool initializationStarted = false;
static std::atomic_bool initializationStarted{ false };
static wi::jobsystem::context ctx;
static wi::Timer timer;
static std::atomic_bool systems[INITIALIZED_SYSTEM_COUNT]{};
void InitializeComponentsImmediate()
{
if (!initializationStarted)
if (IsInitializeFinished())
return;
if (!initializationStarted.load())
{
InitializeComponentsAsync();
}
wi::jobsystem::Wait(ctx);
WaitForInitializationsToFinish();
}
void InitializeComponentsAsync()
{
if (IsInitializeFinished())
return;
timer.record();
initializationStarted = true;
initializationStarted.store(true);
std::string ss;
ss += "\n[wi::initializer] Initializing Wicked Engine, please wait...\n";
@@ -57,11 +61,11 @@ namespace wi::initializer
wi::jobsystem::Execute(ctx, [](wi::jobsystem::JobArgs args) { wi::gpusortlib::Initialize(); systems[INITIALIZED_SYSTEM_GPUSORTLIB].store(true); });
wi::jobsystem::Execute(ctx, [](wi::jobsystem::JobArgs args) { wi::GPUBVH::Initialize(); systems[INITIALIZED_SYSTEM_GPUBVH].store(true); });
wi::jobsystem::Execute(ctx, [](wi::jobsystem::JobArgs args) { wi::physics::Initialize(); systems[INITIALIZED_SYSTEM_PHYSICS].store(true); });
wi::jobsystem::Execute(ctx, [](wi::jobsystem::JobArgs args) { wi::audio::Initialize(); systems[INITIALIZED_SYSTEM_AUDIO].store(true); });
wi::jobsystem::Execute(ctx, [](wi::jobsystem::JobArgs args) { wi::TrailRenderer::Initialize(); systems[INITIALIZED_SYSTEM_TRAILRENDERER].store(true); });
// Initialize this immediately:
// Initialize these immediately:
wi::lua::Initialize(); systems[INITIALIZED_SYSTEM_LUA].store(true);
wi::audio::Initialize(); systems[INITIALIZED_SYSTEM_AUDIO].store(true);
std::thread([] {
wi::jobsystem::Wait(ctx);
@@ -74,11 +78,16 @@ namespace wi::initializer
{
if (system == INITIALIZED_SYSTEM_COUNT)
{
return initializationStarted && !wi::jobsystem::IsBusy(ctx);
return initializationStarted.load() && !wi::jobsystem::IsBusy(ctx);
}
else
{
return systems[system].load();
}
}
void WaitForInitializationsToFinish()
{
wi::jobsystem::Wait(ctx);
}
}