diff --git a/include/rendering/terrain_manager.hpp b/include/rendering/terrain_manager.hpp index 6f732721..2a746d3e 100644 --- a/include/rendering/terrain_manager.hpp +++ b/include/rendering/terrain_manager.hpp @@ -348,6 +348,7 @@ private: int unloadRadius = 7; // Unload tiles beyond this radius float updateInterval = 0.033f; // Check streaming every 33ms (~30 fps) float timeSinceLastUpdate = 0.0f; + float proactiveStreamTimer_ = 0.0f; bool taxiStreamingMode_ = false; // Tile size constants (WoW ADT specifications) diff --git a/src/rendering/terrain_manager.cpp b/src/rendering/terrain_manager.cpp index 89a77d29..6578c71a 100644 --- a/src/rendering/terrain_manager.cpp +++ b/src/rendering/terrain_manager.cpp @@ -207,16 +207,20 @@ void TerrainManager::update(const Camera& camera, float deltaTime) { streamTiles(); lastStreamTile = newTile; } else { - // Proactive loading: when workers are idle, re-check for unloaded tiles - // within range. This catches tiles that weren't queued on the initial - // streamTiles pass (e.g. cache eviction, late-arriving ADT availability). - bool workersIdle; - { - std::lock_guard lock(queueMutex); - workersIdle = loadQueue.empty(); - } - if (workersIdle) { - streamTiles(); + // Proactive loading: when workers are idle, periodically re-check for + // unloaded tiles within range. Throttled to avoid hitching right after + // world load when many tiles finalize simultaneously. + proactiveStreamTimer_ += deltaTime; + if (proactiveStreamTimer_ >= 2.0f) { + proactiveStreamTimer_ = 0.0f; + bool workersIdle; + { + std::lock_guard lock(queueMutex); + workersIdle = loadQueue.empty(); + } + if (workersIdle) { + streamTiles(); + } } } }