diff --git a/Theriapolis.Core/World/Generation/Stages/MoistureGenStage.cs b/Theriapolis.Core/World/Generation/Stages/MoistureGenStage.cs index 2caae04..aa16c53 100644 --- a/Theriapolis.Core/World/Generation/Stages/MoistureGenStage.cs +++ b/Theriapolis.Core/World/Generation/Stages/MoistureGenStage.cs @@ -28,6 +28,10 @@ public sealed class MoistureGenStage : IWorldGenStage int W = C.WORLD_WIDTH_TILES; int H = C.WORLD_HEIGHT_TILES; + // FastNoiseLite.EnsurePerm() is not thread-safe; calling GetNoise once here + // populates _perm in the main thread before the parallel loop reads it. + _ = noise.GetNoise01(0f, 0f); + Parallel.For(0, H, ty => { for (int tx = 0; tx < W; tx++) diff --git a/Theriapolis.Core/World/Generation/Stages/TemperatureGenStage.cs b/Theriapolis.Core/World/Generation/Stages/TemperatureGenStage.cs index e11d149..4e3f686 100644 --- a/Theriapolis.Core/World/Generation/Stages/TemperatureGenStage.cs +++ b/Theriapolis.Core/World/Generation/Stages/TemperatureGenStage.cs @@ -29,6 +29,10 @@ public sealed class TemperatureGenStage : IWorldGenStage int W = C.WORLD_WIDTH_TILES; int H = C.WORLD_HEIGHT_TILES; + // FastNoiseLite.EnsurePerm() is not thread-safe; calling GetNoise once here + // populates _perm in the main thread before the parallel loop reads it. + _ = noise.GetNoise(0f, 0f); + Parallel.For(0, H, ty => { // Latitude: 0 at north (cold), 1 at south (warm)