diff --git a/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp b/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp index dd9f3e31f..7386fb077 100644 --- a/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp +++ b/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp @@ -8,6 +8,7 @@ #include "../ShadowsPass.h" #include "Engine/Core/Math/Matrix3x3.h" #include "Engine/Core/Math/OrientedBoundingBox.h" +#include "Engine/Core/Collections/Sorting.h" #include "Engine/Core/Config/GraphicsSettings.h" #include "Engine/Engine/Engine.h" #include "Engine/Engine/Units.h" @@ -81,6 +82,11 @@ struct GlobalSurfaceAtlasNewTile void* ActorObject; uint16 TileIndex; uint16 TileResolution; + + bool operator<(const GlobalSurfaceAtlasNewTile& other) const + { + return TileResolution > other.TileResolution; + } }; struct GlobalSurfaceAtlasTile : RectPackNode @@ -350,6 +356,11 @@ public: } AsyncNewObjects.Clear(); + // Sort tiles by size to reduce atlas fragmentation issue by inserting larger tiles first + Array sortingTiles; + sortingTiles.Resize(AsyncNewTiles.Count()); + Sorting::MergeSort(AsyncNewTiles.Get(), AsyncNewTiles.Count(), sortingTiles.Get()); + for (auto& newTile : AsyncNewTiles) { auto& object = Objects[newTile.ActorObject];