1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-05-09 11:41:25 +00:00

Shuffle tile positions before adding to queue for processing

This commit is contained in:
elsid 2021-12-18 00:05:50 +01:00
parent 12ce82980c
commit d1d29a2452
No known key found for this signature in database
GPG key ID: B845CB9FEE18AB40

View file

@ -35,6 +35,7 @@
#include <string_view> #include <string_view>
#include <utility> #include <utility>
#include <vector> #include <vector>
#include <random>
namespace NavMeshTool namespace NavMeshTool
{ {
@ -180,13 +181,23 @@ namespace NavMeshTool
SceneUtil::WorkQueue workQueue(threadsNumber); SceneUtil::WorkQueue workQueue(threadsNumber);
auto navMeshTileConsumer = std::make_shared<NavMeshTileConsumer>(std::move(db)); auto navMeshTileConsumer = std::make_shared<NavMeshTileConsumer>(std::move(db));
std::size_t tiles = 0; std::size_t tiles = 0;
std::mt19937_64 random;
for (const std::unique_ptr<WorldspaceNavMeshInput>& input : data.mNavMeshInputs) for (const std::unique_ptr<WorldspaceNavMeshInput>& input : data.mNavMeshInputs)
{ {
std::vector<TilePosition> worldspaceTiles;
DetourNavigator::getTilesPositions( DetourNavigator::getTilesPositions(
Misc::Convert::toOsg(input->mAabb.m_min), Misc::Convert::toOsg(input->mAabb.m_max), settings.mRecast, Misc::Convert::toOsg(input->mAabb.m_min), Misc::Convert::toOsg(input->mAabb.m_max), settings.mRecast,
[&] (const TilePosition& tilePosition) [&] (const TilePosition& tilePosition) { worldspaceTiles.push_back(tilePosition); });
{
tiles += worldspaceTiles.size();
navMeshTileConsumer->mExpected = tiles;
std::shuffle(worldspaceTiles.begin(), worldspaceTiles.end(), random);
for (const TilePosition& tilePosition : worldspaceTiles)
workQueue.addWorkItem(new GenerateNavMeshTile( workQueue.addWorkItem(new GenerateNavMeshTile(
input->mWorldspace, input->mWorldspace,
tilePosition, tilePosition,
@ -195,11 +206,6 @@ namespace NavMeshTool
settings, settings,
navMeshTileConsumer navMeshTileConsumer
)); ));
++tiles;
});
navMeshTileConsumer->mExpected = tiles;
} }
navMeshTileConsumer->wait(); navMeshTileConsumer->wait();