From ded0964827f77dce8eaaf064294ae173c1e190f3 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sat, 28 Feb 2026 00:27:08 +0300 Subject: [PATCH 1/2] feat: keeping assets alive during current frame (temporary solution) --- src/assets/Assets.cpp | 11 ++++++++++- src/assets/Assets.hpp | 16 +++++++++++++--- src/engine/AssetsManagement.cpp | 3 ++- src/engine/AssetsManagement.hpp | 2 ++ 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/assets/Assets.cpp b/src/assets/Assets.cpp index 993e7360c..45db15945 100644 --- a/src/assets/Assets.cpp +++ b/src/assets/Assets.cpp @@ -1,6 +1,15 @@ #include "Assets.hpp" -Assets::~Assets() = default; +Assets::Assets(util::ObjectsKeeper& vault) : vault(vault) { +} + +Assets::~Assets() { + for (auto& [_, map] : assets) { + for (auto& [__, asset] : map) { + vault.keepAlive(std::move(asset)); + } + } +} const std::vector& Assets::getAnimations() { return animations; diff --git a/src/assets/Assets.hpp b/src/assets/Assets.hpp index ea0753aec..06372551e 100644 --- a/src/assets/Assets.hpp +++ b/src/assets/Assets.hpp @@ -12,6 +12,7 @@ #include #include "util/stringutil.hpp" +#include "util/ObjectsKeeper.hpp" #include "graphics/core/TextureAnimation.hpp" class Assets; @@ -64,13 +65,14 @@ namespace assetload { } class Assets { + util::ObjectsKeeper& vault; std::vector animations; using assets_map = std::unordered_map>; std::unordered_map assets; std::vector setupFuncs; public: - Assets() = default; + Assets(util::ObjectsKeeper& vault); Assets(const Assets&) = delete; ~Assets(); @@ -79,12 +81,20 @@ public: template void store(std::unique_ptr asset, const std::string& name) { - assets[typeid(T)][name].reset(asset.release()); + auto& dst = assets[typeid(T)][name]; + if (dst != nullptr) { + vault.keepAlive(std::move(dst)); + } + dst.reset(asset.release()); } template void store(std::shared_ptr asset, const std::string& name) { - assets[typeid(T)][name] = std::move(asset); + auto& dst = assets[typeid(T)][name]; + if (dst != nullptr) { + vault.keepAlive(std::move(dst)); + } + dst = std::move(asset); } template diff --git a/src/engine/AssetsManagement.cpp b/src/engine/AssetsManagement.cpp index 578a0e45b..b5fd9e7c5 100644 --- a/src/engine/AssetsManagement.cpp +++ b/src/engine/AssetsManagement.cpp @@ -51,7 +51,7 @@ void AssetsManagement::loadAssets(Content* content) { logger.info() << "loading assets"; Shader::preprocessor->setPaths(&paths.resPaths); - auto new_assets = std::make_unique(); + auto new_assets = std::make_unique(assetsVault); AssetsLoader loader(engine, *new_assets, paths.resPaths); AssetsLoader::addDefaults(loader, content); @@ -78,6 +78,7 @@ void AssetsManagement::loadAssets(Content* content) { } void AssetsManagement::update() { + assetsVault.clearKeepedObjects(); if (backgroundLoaderTask) { backgroundLoaderTask->update(); } diff --git a/src/engine/AssetsManagement.hpp b/src/engine/AssetsManagement.hpp index 4e14c9305..81c33bef8 100644 --- a/src/engine/AssetsManagement.hpp +++ b/src/engine/AssetsManagement.hpp @@ -1,6 +1,7 @@ #pragma once #include "assets/Assets.hpp" +#include "util/ObjectsKeeper.hpp" #include @@ -30,4 +31,5 @@ private: std::unique_ptr assets; std::unique_ptr backgroundLoader; std::shared_ptr backgroundLoaderTask; + util::ObjectsKeeper assetsVault; }; From 31cb9ebd23e286d64c77be32ff8c8c04df8acf4b Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 1 Mar 2026 21:11:58 +0300 Subject: [PATCH 2/2] add 'system.preserve-assets-during-frame' setting --- src/assets/Assets.cpp | 8 ++++++-- src/assets/Assets.hpp | 12 ++++++------ src/engine/AssetsManagement.cpp | 4 +++- src/io/settings_io.cpp | 1 + src/settings.hpp | 3 +++ 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/assets/Assets.cpp b/src/assets/Assets.cpp index 45db15945..3e0776747 100644 --- a/src/assets/Assets.cpp +++ b/src/assets/Assets.cpp @@ -1,13 +1,17 @@ #include "Assets.hpp" -Assets::Assets(util::ObjectsKeeper& vault) : vault(vault) { +Assets::Assets(util::ObjectsKeeper* vault) : vault(vault) { } Assets::~Assets() { + if (vault == nullptr) { + return; + } for (auto& [_, map] : assets) { for (auto& [__, asset] : map) { - vault.keepAlive(std::move(asset)); + vault->keepAlive(std::move(asset)); } + map.clear(); } } diff --git a/src/assets/Assets.hpp b/src/assets/Assets.hpp index 06372551e..b9faa877f 100644 --- a/src/assets/Assets.hpp +++ b/src/assets/Assets.hpp @@ -65,14 +65,14 @@ namespace assetload { } class Assets { - util::ObjectsKeeper& vault; + util::ObjectsKeeper* vault; std::vector animations; using assets_map = std::unordered_map>; std::unordered_map assets; std::vector setupFuncs; public: - Assets(util::ObjectsKeeper& vault); + Assets(util::ObjectsKeeper* vault); Assets(const Assets&) = delete; ~Assets(); @@ -82,8 +82,8 @@ public: template void store(std::unique_ptr asset, const std::string& name) { auto& dst = assets[typeid(T)][name]; - if (dst != nullptr) { - vault.keepAlive(std::move(dst)); + if (vault != nullptr && dst != nullptr) { + vault->keepAlive(std::move(dst)); } dst.reset(asset.release()); } @@ -91,8 +91,8 @@ public: template void store(std::shared_ptr asset, const std::string& name) { auto& dst = assets[typeid(T)][name]; - if (dst != nullptr) { - vault.keepAlive(std::move(dst)); + if (vault != nullptr && dst != nullptr) { + vault->keepAlive(std::move(dst)); } dst = std::move(asset); } diff --git a/src/engine/AssetsManagement.cpp b/src/engine/AssetsManagement.cpp index b5fd9e7c5..1ca1935c9 100644 --- a/src/engine/AssetsManagement.cpp +++ b/src/engine/AssetsManagement.cpp @@ -51,7 +51,9 @@ void AssetsManagement::loadAssets(Content* content) { logger.info() << "loading assets"; Shader::preprocessor->setPaths(&paths.resPaths); - auto new_assets = std::make_unique(assetsVault); + auto new_assets = std::make_unique( + settings.system.preserveAssetsDuringFrame.get() ? &assetsVault : nullptr + ); AssetsLoader loader(engine, *new_assets, paths.resPaths); AssetsLoader::addDefaults(loader, content); diff --git a/src/io/settings_io.cpp b/src/io/settings_io.cpp index af4547a14..c66b5c451 100644 --- a/src/io/settings_io.cpp +++ b/src/io/settings_io.cpp @@ -100,6 +100,7 @@ SettingsHandler::SettingsHandler(EngineSettings& settings) { builder.addSection("system"); builder.add("max-bg-asset-loaders", &settings.system.maxBgAssetLoaders); + builder.add("preserve-assets-during-frame", &settings.system.preserveAssetsDuringFrame); } dv::value SettingsHandler::getValue(const std::string& name) const { diff --git a/src/settings.hpp b/src/settings.hpp index 331ff3ee8..782330f14 100644 --- a/src/settings.hpp +++ b/src/settings.hpp @@ -122,7 +122,10 @@ struct NetworkSettings { }; struct SystemSettings { + /// @brief Max background assets loaders IntegerSetting maxBgAssetLoaders {3, -4, 16}; + /// @brief Preserve assets during current frame from being destroyed + FlagSetting preserveAssetsDuringFrame {true}; }; struct EngineSettings {