Stabilize RimWorld 1.6 caches and tick optimizations

This commit is contained in:
2026-10-02 04:00:27 -04:00
parent 3199c1a85e
commit 227dcd173f
14 changed files with 209 additions and 76 deletions
@@ -61,7 +61,15 @@ public sealed class GeneTrackerOptimization : ClassWithFishPrepatches
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool Dirty(Pawn_GeneTracker instance, List<Gene> genesToTick)
#if V1_6
{
ref var versions = ref instance.GeneListVersions();
return !versions.Initialized || versions.Xenogenes != instance.xenogenes._version
|| versions.Endogenes != instance.endogenes._version;
}
#else
=> GetListVersion(instance) != genesToTick._version;
#endif
[MethodImpl(MethodImplOptions.NoInlining)]
public static void Update(Pawn_GeneTracker instance, List<Gene> genesToTick)
@@ -71,12 +79,21 @@ public sealed class GeneTrackerOptimization : ClassWithFishPrepatches
AddTickableGenes(genesToTick, instance.xenogenes);
AddTickableGenes(genesToTick, instance.endogenes);
#if V1_6
ref var versions = ref instance.GeneListVersions();
versions.Xenogenes = instance.xenogenes._version;
versions.Endogenes = instance.endogenes._version;
versions.Initialized = true;
#else
genesToTick._version = GetListVersion(instance);
#endif
}
#if !V1_6
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static int GetListVersion(Pawn_GeneTracker instance)
=> (instance.xenogenes._version << 16) | (instance.endogenes._version & 0b1111_1111_1111_1111);
#endif
private static void AddTickableGenes(List<Gene> genesToTick, List<Gene> genes)
{
@@ -115,6 +132,15 @@ public sealed class GeneTrackerOptimization : ClassWithFishPrepatches
}
}
#if V1_6
public struct GeneListVersionState
{
public int Xenogenes;
public int Endogenes;
public bool Initialized;
}
#endif
public sealed class GeneTrackerTickIntervalPatch : FishPrepatch
{
// i am iffy about this