diff --git a/1.4/Assemblies/PerformanceFish.dll b/1.4/Assemblies/PerformanceFish.dll index c4e6b8e..f670c4a 100644 Binary files a/1.4/Assemblies/PerformanceFish.dll and b/1.4/Assemblies/PerformanceFish.dll differ diff --git a/1.4/Assemblies/PerformanceFish.pdb b/1.4/Assemblies/PerformanceFish.pdb index 4dcef4f..fa7a7c2 100644 Binary files a/1.4/Assemblies/PerformanceFish.pdb and b/1.4/Assemblies/PerformanceFish.pdb differ diff --git a/Source/PerformanceFish/PrepatcherFields.cs b/Source/PerformanceFish/PrepatcherFields.cs index 0512653..762d440 100644 --- a/Source/PerformanceFish/PrepatcherFields.cs +++ b/Source/PerformanceFish/PrepatcherFields.cs @@ -14,15 +14,15 @@ public static class PrepatcherFields [PrepatcherField] [ValueInitializer(nameof(CreateGeneList))] public static extern List GenesToTick(this Pawn_GeneTracker geneTracker); - - // [PrepatcherField] - // [ValueInitializer(nameof(CreateGeneList))] - // public static extern List EndogenesToTick(this Pawn_GeneTracker geneTracker); [PrepatcherField] [ValueInitializer(nameof(CreateWorldPawnsCache))] public static extern ref WorldPawnsOptimization.Cache Cache(this WorldPawns worldPawns); + [PrepatcherField] + [ValueInitializer(nameof(CreateBedHashSet))] + public static extern HashSet UniqueContainedBeds(this Room room); + #if false [PrepatcherField] [ValueInitializer(nameof(CreateHediffList))] @@ -33,4 +33,5 @@ public static class PrepatcherFields public static List CreateGeneList() => new(); public static WorldPawnsOptimization.Cache CreateWorldPawnsCache() => new(); + public static HashSet CreateBedHashSet() => new(); } \ No newline at end of file diff --git a/Source/PerformanceFish/RoomOptimizations.cs b/Source/PerformanceFish/RoomOptimizations.cs index ba1440d..a5613d1 100644 --- a/Source/PerformanceFish/RoomOptimizations.cs +++ b/Source/PerformanceFish/RoomOptimizations.cs @@ -207,16 +207,21 @@ public class RoomOptimizations : ClassWithFishPatches, IHasDescription [MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable ContainedBeds_Replacement(Room instance) { + var uniqueContainedBeds = instance.UniqueContainedBeds(); + uniqueContainedBeds.Clear(); + var regions = instance.Regions; - for (var i = 0; i < regions.Count; i++) + for (var i = regions.Count; i-- > 0;) { var beds = regions[i].ListerThings.listsByGroup[(int)ThingRequestGroup.Bed]; if (beds is null) continue; - for (var j = 0; j < beds.Count; j++) - yield return (Building_Bed)beds[j]; + for (var j = beds.Count; j-- > 0;) + uniqueContainedBeds.Add((Building_Bed)beds[j]); } + + return uniqueContainedBeds; } }