From 31b5685251186f1b71ea1c089f1852e34380fa5f Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Fri, 20 Feb 2026 23:45:56 +0100 Subject: [PATCH] Add `GPU_ENABLE_PRELOADING_RESOURCES` and use it on Web/Android/iOS to reduce engine resources preloading --- Source/Engine/Graphics/Config.h | 5 +++++ .../Engine/Platform/Android/AndroidDefines.h | 1 + Source/Engine/Platform/Web/WebDefines.h | 1 + Source/Engine/Platform/iOS/iOSDefines.h | 1 + Source/Engine/Renderer/Renderer.cpp | 2 ++ Source/Engine/Renderer/RendererPass.h | 12 ++++++++++-- Source/Engine/Terrain/TerrainManager.cpp | 19 ++++++++++++------- 7 files changed, 32 insertions(+), 9 deletions(-) diff --git a/Source/Engine/Graphics/Config.h b/Source/Engine/Graphics/Config.h index 2059fb0a9..cd734ab98 100644 --- a/Source/Engine/Graphics/Config.h +++ b/Source/Engine/Graphics/Config.h @@ -64,6 +64,11 @@ #define GPU_ENABLE_ASYNC_RESOURCES_CREATION 1 #endif +// Enable/disable preloading GPU resources (eg. shaders, default assets) +#ifndef GPU_ENABLE_PRELOADING_RESOURCES +#define GPU_ENABLE_PRELOADING_RESOURCES 1 +#endif + // Enable/disable force shaders recompilation #define GPU_FORCE_RECOMPILE_SHADERS 0 diff --git a/Source/Engine/Platform/Android/AndroidDefines.h b/Source/Engine/Platform/Android/AndroidDefines.h index 15f3b030b..490bdb964 100644 --- a/Source/Engine/Platform/Android/AndroidDefines.h +++ b/Source/Engine/Platform/Android/AndroidDefines.h @@ -38,5 +38,6 @@ #define GPU_ALLOW_TESSELLATION_SHADERS 0 // Tess on mobile is not well supported #define GPU_ALLOW_GEOMETRY_SHADERS 0 // Don't even try GS on mobile +#define GPU_ENABLE_PRELOADING_RESOURCES 0 // Don't preload things unless needed #endif diff --git a/Source/Engine/Platform/Web/WebDefines.h b/Source/Engine/Platform/Web/WebDefines.h index edfff3c04..3f8900b2b 100644 --- a/Source/Engine/Platform/Web/WebDefines.h +++ b/Source/Engine/Platform/Web/WebDefines.h @@ -18,6 +18,7 @@ #define GPU_ALLOW_TESSELLATION_SHADERS 0 #define GPU_ALLOW_GEOMETRY_SHADERS 0 #define GPU_ALLOW_PROFILE_EVENTS 0 +#define GPU_ENABLE_PRELOADING_RESOURCES 0 // Don't preload things unless needed // Threading is optional #ifdef __EMSCRIPTEN_PTHREADS__ diff --git a/Source/Engine/Platform/iOS/iOSDefines.h b/Source/Engine/Platform/iOS/iOSDefines.h index 8e0530634..0106620da 100644 --- a/Source/Engine/Platform/iOS/iOSDefines.h +++ b/Source/Engine/Platform/iOS/iOSDefines.h @@ -21,5 +21,6 @@ #define GPU_ALLOW_TESSELLATION_SHADERS 0 // MoltenVK has artifacts when using tess so disable it #define GPU_ALLOW_GEOMETRY_SHADERS 0 // Don't even try GS on mobile +#define GPU_ENABLE_PRELOADING_RESOURCES 0 // Don't preload things unless needed #endif diff --git a/Source/Engine/Renderer/Renderer.cpp b/Source/Engine/Renderer/Renderer.cpp index 7ba267745..ddbb8573e 100644 --- a/Source/Engine/Renderer/Renderer.cpp +++ b/Source/Engine/Renderer/Renderer.cpp @@ -105,6 +105,7 @@ bool RendererService::Init() return false; } +#if GPU_ENABLE_PRELOADING_RESOURCES // Init child services for (int32 i = 0; i < PassList.Count(); i++) { @@ -114,6 +115,7 @@ bool RendererService::Init() return true; } } +#endif return false; } diff --git a/Source/Engine/Renderer/RendererPass.h b/Source/Engine/Renderer/RendererPass.h index fee05e302..49f79328d 100644 --- a/Source/Engine/Renderer/RendererPass.h +++ b/Source/Engine/Renderer/RendererPass.h @@ -21,7 +21,9 @@ class FLAXENGINE_API RendererPassBase : public Object { protected: - +#if !GPU_ENABLE_PRELOADING_RESOURCES + bool _lazyInit = true; +#endif bool _hasValidResources; /// @@ -66,7 +68,13 @@ protected: { if (_hasValidResources) return false; - +#if !GPU_ENABLE_PRELOADING_RESOURCES + if (_lazyInit) + { + _lazyInit = false; + Init(); + } +#endif const bool setupFailed = setupResources(); _hasValidResources = !setupFailed; return setupFailed; diff --git a/Source/Engine/Terrain/TerrainManager.cpp b/Source/Engine/Terrain/TerrainManager.cpp index 6da020079..1c8da1748 100644 --- a/Source/Engine/Terrain/TerrainManager.cpp +++ b/Source/Engine/Terrain/TerrainManager.cpp @@ -68,6 +68,15 @@ TerrainManagerService TerrainManagerServiceInstance; MaterialBase* TerrainManager::GetDefaultTerrainMaterial() { + if (!DefaultTerrainMaterial) + { + // Load default terrain material as fallback + DefaultTerrainMaterial = Content::LoadAsyncInternal(TEXT("Engine/DefaultTerrainMaterial")); + if (DefaultTerrainMaterial == nullptr) + { + LOG(Warning, "Default terrain material is missing."); + } + } return DefaultTerrainMaterial.Get(); } @@ -221,13 +230,9 @@ bool TerrainManager::GetChunkGeometry(DrawCall& drawCall, int32 chunkSize, int32 bool TerrainManagerService::Init() { - // Load default terrain material as fallback - DefaultTerrainMaterial = Content::LoadAsyncInternal(TEXT("Engine/DefaultTerrainMaterial")); - if (DefaultTerrainMaterial == nullptr) - { - LOG(Warning, "Default terrain material is missing."); - } - +#if GPU_ENABLE_PRELOADING_RESOURCES + TerrainManager::GetDefaultTerrainMaterial(); +#endif return false; }