From c8b764de68f02d5e6fa856042bef2ab42911326d Mon Sep 17 00:00:00 2001 From: bbradson Date: Sat, 27 Jan 2024 10:24:24 +0100 Subject: [PATCH] Added gas grid optimization, various despawn optimizations, new hauling optimizations utilizing events and regions, bugfixes for old patches and for vanilla functions too, as well as smaller additions. 1.3 files removed. --- 1.3/Assemblies/1Fishery.dll | Bin 200704 -> 0 bytes 1.3/Assemblies/PerformanceFish.dll | Bin 202752 -> 0 bytes ...System.Runtime.CompilerServices.Unsafe.dll | Bin 18024 -> 0 bytes 1.4/Assemblies/0PrepatcherAPI.dll | Bin 5120 -> 0 bytes 1.4/Assemblies/1Fishery.dll | Bin 282624 -> 0 bytes 1.4/Assemblies/1Fishery.pdb | Bin 115456 -> 0 bytes 1.4/Assemblies/PerformanceFish.dll | Bin 375808 -> 498176 bytes 1.4/Assemblies/PerformanceFish.pdb | Bin 133352 -> 171916 bytes ...System.Runtime.CompilerServices.Unsafe.dll | Bin 18024 -> 0 bytes 1.4/Defs/GasDefs.xml | 42 + 1.4/Defs/MainButtonDefs.xml | 14 + About/About.xml | 1 - Source/PerformanceFish/AccessToolsCaching.cs | 4 +- Source/PerformanceFish/AllocationProfiling.cs | 207 ++++ Source/PerformanceFish/AnalyzerFixes.cs | 43 +- Source/PerformanceFish/Cache/BitCellGrid.cs | 43 + Source/PerformanceFish/Cache/ByIndex.cs | 2 +- Source/PerformanceFish/Cache/ByInt.cs | 65 +- Source/PerformanceFish/Cache/ByMap.cs | 15 +- Source/PerformanceFish/Cache/ByReference.cs | 51 +- Source/PerformanceFish/Cache/CellGrid.cs | 46 + Source/PerformanceFish/Cache/ICacheable.cs | 2 +- Source/PerformanceFish/Cache/Utility.cs | 167 +-- Source/PerformanceFish/CellIndex.cs | 21 + .../PerformanceFish/ContentFinderCaching.cs | 4 +- Source/PerformanceFish/DDSLoader.cs | 2 +- Source/PerformanceFish/DebugActions.cs | 56 + .../DeepResourceGridOptimization.cs | 38 + .../{ => Defs}/DefDatabasePatches.cs | 8 +- Source/PerformanceFish/Defs/DefThingPair.cs | 18 + .../PerformanceFish/{ => Defs}/FishDefOf.cs | 3 +- .../{ => Defs}/RecipeDefCaching.cs | 14 +- .../PerformanceFish/Defs/ThingDefPatches.cs | 112 ++ .../DesignationManagerCaching.cs | 14 +- Source/PerformanceFish/Events/MapEvents.cs | 59 ++ Source/PerformanceFish/Events/StaticEvents.cs | 15 + Source/PerformanceFish/Events/ThingEvents.cs | 167 +++ .../PerformanceFish/Events/ThingGridEvents.cs | 74 ++ Source/PerformanceFish/FishSettings.cs | 106 +- .../FunctionPointers/IndexGetter.cs | 9 +- Source/PerformanceFish/GasDef.cs | 25 + Source/PerformanceFish/GasDefOf.cs | 22 + Source/PerformanceFish/GasGridExtensions.cs | 47 + Source/PerformanceFish/GasGridOptimization.cs | 995 ++++++++++++++++++ Source/PerformanceFish/GenLocalDateCaching.cs | 6 +- Source/PerformanceFish/GenTypesPatches.cs | 12 +- .../GeneTrackerOptimization.cs | 6 +- Source/PerformanceFish/GetCompCaching.cs | 143 ++- Source/PerformanceFish/GroupThingPair.cs | 58 + .../Hauling/GridsUtilityPatches.cs | 62 ++ .../Hauling/HaulDestinationManagerCache.cs | 31 + .../Hauling/HaulDestinationManagerPatches.cs | 53 + .../Hauling/LwmCompCacheValue.cs | 38 + .../Hauling/SlotGroupExtensions.cs | 147 +++ .../Hauling/SlotGroupPrepatches.cs | 44 + .../Hauling/StorageDistrict.cs | 125 +++ .../Hauling/StorageExtensions.cs | 32 + .../Hauling/StorageSettingsPatches.cs | 232 ++++ .../Hauling/StoreUtilityPrepatches.cs | 296 ++++++ .../Hediffs/HealthTrackerOptimization.cs | 4 +- .../HediffComp_PsychicHarmonizer_Bugfix.cs | 33 +- .../Hediffs/HediffSetCaching.cs | 18 +- .../Hediffs/HediffWithCompsOptimization.cs | 99 ++ .../Hediffs/ImmunityHandlerCaching.cs | 12 +- .../Pawn_PsychicEntropyTrackerOptimization.cs | 4 +- .../IdeoBuildingPresenceDemandOptimization.cs | 59 ++ Source/PerformanceFish/IdeoUtilityCaching.cs | 4 +- .../DisabledWorkTypesOptimization.cs | 8 +- .../JobSystem/GenClosestPatches.cs | 29 +- .../JobSystem/JobGiver_HaulOptimization.cs | 11 +- .../JobSystem/JobGiver_WorkPatches.cs | 12 +- .../JobSystem/WorkGiver_DoBillOptimization.cs | 156 +-- .../JobSystem/WorkGiver_HaulOptimization.cs | 10 +- .../JobSystem/WorkGiver_MergeOptimization.cs | 14 +- .../PerformanceFish/ListerThingsExtensions.cs | 26 + Source/PerformanceFish/Listers/Buildings.cs | 428 ++++---- Source/PerformanceFish/Listers/Haulables.cs | 486 +++------ Source/PerformanceFish/Listers/Mergeables.cs | 40 +- Source/PerformanceFish/Listers/Misc.cs | 27 - .../Listers/StorageSettingsPatches.cs | 76 -- .../Listers/ThingOwnerOptimization.cs | 148 +++ Source/PerformanceFish/Listers/Things.cs | 207 +++- Source/PerformanceFish/Log.cs | 19 +- Source/PerformanceFish/LogPatches.cs | 10 +- Source/PerformanceFish/MapPrepatches.cs | 123 +++ Source/PerformanceFish/MassUtilityCaching.cs | 6 +- .../MeditationUtilityCaching.cs | 4 +- Source/PerformanceFish/MiscOptimizations.cs | 46 +- .../ModCompatibility/ActiveMods.cs | 58 +- .../ModCompatibility/PackageIDs.cs | 2 + .../ModCompatibility/PerformanceOptimizer.cs | 4 +- .../PerformanceFish/ModCompatibility/Types.cs | 32 + .../ModCompatibility/VanillaExpandedFixes.cs | 24 +- Source/PerformanceFish/ModListerPatches.cs | 63 ++ Source/PerformanceFish/ModsConfigPatches.cs | 62 ++ Source/PerformanceFish/OnAssembliesLoaded.cs | 6 + Source/PerformanceFish/ParallelNoAlloc.cs | 308 ++++++ .../Patching/ClassWithFishPatches.cs | 14 + Source/PerformanceFish/Patching/FishPatch.cs | 68 +- .../Patching/FishPatchExtensions.cs | 21 - .../Patching/FishPatchHolder.cs | 29 +- .../PerformanceFish/Patching/IHasFishPatch.cs | 1 + Source/PerformanceFish/PerformanceFish.csproj | 19 +- Source/PerformanceFish/PerformanceFish.sln | 2 + Source/PerformanceFish/PerformanceFishMod.cs | 83 +- .../Planet/MothballOptimization.cs | 4 +- .../Planet/WorldObjectsOptimization.cs | 164 ++- .../Planet/WorldPawnGCOptimization.cs | 15 +- .../Planet/WorldPawnsOptimization.cs | 6 +- Source/PerformanceFish/Pools/FishPool.cs | 40 - Source/PerformanceFish/Pools/PooledIList.cs | 48 - .../Pools/PooledStringBuilder.cs | 62 -- .../Pools/PooledStringBuilderHandler.cs | 39 - .../Pools/PooledStringHandler.cs | 37 - Source/PerformanceFish/PrepatcherFields.cs | 159 ++- .../Prepatching/ClassWithFishPrepatches.cs | 17 +- .../Prepatching/FishClassPrepatch.cs | 20 +- .../Prepatching/FishPrepatch.cs | 330 ++++++ .../Prepatching/FishPrepatchBase.cs | 88 +- .../Prepatching/FishPrepatchExtensions.cs | 73 ++ .../Prepatching/FishPrepatchHolder.cs | 366 ------- .../PerformanceFish/Prepatching/FishStash.cs | 100 +- .../Prepatching/FishStashHandle.cs | 11 +- .../Prepatching/PrepatchManager.cs | 10 +- .../Rendering/GenDrawPatches.cs | 6 +- .../Rendering/GraphicPatches.cs | 6 +- .../Rendering/PawnCacheRendererPatches.cs | 6 +- Source/PerformanceFish/RoomOptimizations.cs | 41 +- Source/PerformanceFish/StoreUtilityPatches.cs | 89 -- .../System/EqualityComparerOptimization.cs | 51 +- .../System/ReflectionCaching.cs | 143 +-- .../PerformanceFish/TextureLoadingPatches.cs | 14 +- Source/PerformanceFish/ThingCompCaching.cs | 33 +- Source/PerformanceFish/ThingFilterPatches.cs | 61 +- .../ThingOwnerUtilityCaching.cs | 16 +- Source/PerformanceFish/ThingPatches.cs | 75 ++ ...Worker_Precept_AltarSharingOptimization.cs | 8 +- .../Utility/CellIndexExtensions.cs | 38 + .../Utility/CollectionExtensions.cs | 3 + Source/PerformanceFish/Utility/Exposable.cs | 7 +- Source/PerformanceFish/Utility/GUIHelper.cs | 19 + .../PerformanceFish/Utility/MiscExtensions.cs | 140 +++ Source/PerformanceFish/Utility/PipetteTool.cs | 80 ++ Source/PerformanceFish/Utility/PooledArray.cs | 105 ++ .../Utility/ReflectionExtensions.cs | 103 +- .../Utility/StringExtensions.cs | 5 +- Source/PerformanceFish/Utility/ThingHelper.cs | 13 + .../{ => Utility}/TickHelper.cs | 8 +- Source/PerformanceFish/UtilityPatches.cs | 14 +- Source/PerformanceFish/UtilityPrepatches.cs | 22 +- Source/PerformanceFish/WorkGiverDefFixes.cs | 57 + 151 files changed, 7318 insertions(+), 2145 deletions(-) delete mode 100644 1.3/Assemblies/1Fishery.dll delete mode 100644 1.3/Assemblies/PerformanceFish.dll delete mode 100644 1.3/Assemblies/System.Runtime.CompilerServices.Unsafe.dll delete mode 100644 1.4/Assemblies/0PrepatcherAPI.dll delete mode 100644 1.4/Assemblies/1Fishery.dll delete mode 100644 1.4/Assemblies/1Fishery.pdb delete mode 100644 1.4/Assemblies/System.Runtime.CompilerServices.Unsafe.dll create mode 100644 1.4/Defs/GasDefs.xml create mode 100644 1.4/Defs/MainButtonDefs.xml create mode 100644 Source/PerformanceFish/AllocationProfiling.cs create mode 100644 Source/PerformanceFish/Cache/BitCellGrid.cs create mode 100644 Source/PerformanceFish/Cache/CellGrid.cs create mode 100644 Source/PerformanceFish/CellIndex.cs create mode 100644 Source/PerformanceFish/DebugActions.cs create mode 100644 Source/PerformanceFish/DeepResourceGridOptimization.cs rename Source/PerformanceFish/{ => Defs}/DefDatabasePatches.cs (88%) create mode 100644 Source/PerformanceFish/Defs/DefThingPair.cs rename Source/PerformanceFish/{ => Defs}/FishDefOf.cs (96%) rename Source/PerformanceFish/{ => Defs}/RecipeDefCaching.cs (90%) create mode 100644 Source/PerformanceFish/Defs/ThingDefPatches.cs create mode 100644 Source/PerformanceFish/Events/MapEvents.cs create mode 100644 Source/PerformanceFish/Events/StaticEvents.cs create mode 100644 Source/PerformanceFish/Events/ThingEvents.cs create mode 100644 Source/PerformanceFish/Events/ThingGridEvents.cs create mode 100644 Source/PerformanceFish/GasDef.cs create mode 100644 Source/PerformanceFish/GasDefOf.cs create mode 100644 Source/PerformanceFish/GasGridExtensions.cs create mode 100644 Source/PerformanceFish/GasGridOptimization.cs create mode 100644 Source/PerformanceFish/GroupThingPair.cs create mode 100644 Source/PerformanceFish/Hauling/GridsUtilityPatches.cs create mode 100644 Source/PerformanceFish/Hauling/HaulDestinationManagerCache.cs create mode 100644 Source/PerformanceFish/Hauling/HaulDestinationManagerPatches.cs create mode 100644 Source/PerformanceFish/Hauling/LwmCompCacheValue.cs create mode 100644 Source/PerformanceFish/Hauling/SlotGroupExtensions.cs create mode 100644 Source/PerformanceFish/Hauling/SlotGroupPrepatches.cs create mode 100644 Source/PerformanceFish/Hauling/StorageDistrict.cs create mode 100644 Source/PerformanceFish/Hauling/StorageExtensions.cs create mode 100644 Source/PerformanceFish/Hauling/StorageSettingsPatches.cs create mode 100644 Source/PerformanceFish/Hauling/StoreUtilityPrepatches.cs create mode 100644 Source/PerformanceFish/Hediffs/HediffWithCompsOptimization.cs create mode 100644 Source/PerformanceFish/IdeoBuildingPresenceDemandOptimization.cs create mode 100644 Source/PerformanceFish/ListerThingsExtensions.cs delete mode 100644 Source/PerformanceFish/Listers/Misc.cs delete mode 100644 Source/PerformanceFish/Listers/StorageSettingsPatches.cs create mode 100644 Source/PerformanceFish/Listers/ThingOwnerOptimization.cs create mode 100644 Source/PerformanceFish/MapPrepatches.cs create mode 100644 Source/PerformanceFish/ModCompatibility/Types.cs create mode 100644 Source/PerformanceFish/ModListerPatches.cs create mode 100644 Source/PerformanceFish/ModsConfigPatches.cs create mode 100644 Source/PerformanceFish/ParallelNoAlloc.cs delete mode 100644 Source/PerformanceFish/Patching/FishPatchExtensions.cs delete mode 100644 Source/PerformanceFish/Pools/FishPool.cs delete mode 100644 Source/PerformanceFish/Pools/PooledIList.cs delete mode 100644 Source/PerformanceFish/Pools/PooledStringBuilder.cs delete mode 100644 Source/PerformanceFish/Pools/PooledStringBuilderHandler.cs delete mode 100644 Source/PerformanceFish/Pools/PooledStringHandler.cs create mode 100644 Source/PerformanceFish/Prepatching/FishPrepatchExtensions.cs delete mode 100644 Source/PerformanceFish/StoreUtilityPatches.cs create mode 100644 Source/PerformanceFish/ThingPatches.cs create mode 100644 Source/PerformanceFish/Utility/CellIndexExtensions.cs create mode 100644 Source/PerformanceFish/Utility/GUIHelper.cs create mode 100644 Source/PerformanceFish/Utility/MiscExtensions.cs create mode 100644 Source/PerformanceFish/Utility/PipetteTool.cs create mode 100644 Source/PerformanceFish/Utility/PooledArray.cs create mode 100644 Source/PerformanceFish/Utility/ThingHelper.cs rename Source/PerformanceFish/{ => Utility}/TickHelper.cs (77%) create mode 100644 Source/PerformanceFish/WorkGiverDefFixes.cs diff --git a/1.3/Assemblies/1Fishery.dll b/1.3/Assemblies/1Fishery.dll deleted file mode 100644 index d5c8445116342eb4da1b75117ddfd0696677c1b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200704 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�pHcJ=oJp>4^j z+77a?dVws6y%s zyk>N7yPMnrpbp;(8N86%Np^LJI0bg&{W<7msqIZ~qD70i4*!$_hz{8=SjrBUb-xSZ z{SpxEcV@KT3MB>ook)Kjw`7WbRQNgtVfnK~1qn{TCuGVFPu6_Sj`K-Cl+P(qK808V z{RkZV@6t#=dqF=l*zZ)`@0@tQ1XPa*%n!RvW52i2E*Dcq@Sm`jfezLeS;M4GRU87; z=`@!BHRF1~DV1kbPXj$i9H|{~6@}PImJbFx8UsFsGKvldIoBBZcqX z#o7%4Cn;|LC|vug7-6$d&i#-V)GqMKsJ7Sa4c|ZnY_;#9mv|#YcfHG*TxVD35pgCF zD|eIf46(;R;IA-|0vRqWzCjy7mhAAZTE=-IV=y}15dxwz;_)_ZBLvc|wNVYIuiQqL zp-b547VrWa!9PqJLB-kO-8BDu3jc&^ui1_2!XiUU~-nPz0uO+(ct!2`{ zMumDCDNtymnjLcPR2S38vuI=|=Uq*z zy#|igR6f~WLnev9w54>Sy@oszz_hh=oV{itGHuOe9{dV&>P2Hi?6dhh>dhJk74IO~QpBE#|lTNkCQn)vn&m z3Qmqr^?iQUm=c`oM*y|G53#EUa7iTF6YWV4Yc02UhppOh3U`cYg!_^Y0~b$XNdFs* z0B%=4!v0Swr)m!(Q%cr8ip18lEB#CT4g@g`aZp&QBkw(gCK-34_c5g9Db+`WMJlE` z-NhWB!u?z-#;rU|oK)=*BGt6ePs+uNO5X@ItUJS_leTZ}b6PoGdceR2yt z8ED(b)BRh))29?qpWXsb2Abw+2DYPAyemu6cQPX IY|ee|4hDB=gg+4%N-6ur~F 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Ʀ{Hv36b} z7Rx}?qwI~DJRx4{1#1#1vw4}6q&GGlk#;h#kXG(Z8HPx`J(q2@(mQPM8Qz%7Q_`!w zs@kBX5_Oe(Qjs#AQcNBy#J3mE7_e2?+=LDx#mqidh6^LpB=4xHmX{3cUfjr&fN!tV z%FAO+dr3R5OySro8v)9|V_S-mOgoxyqc|xr>7iJc*$?Xs;(C$%+w#~Oc2Eg|d{=U@ zd{l)w_3Ky?K*t4si!P6|-|5tcO-Xn6{LDkXqxwFX_xFI`)$B4n*l*|z+G z^<*9(K`;=#>Lx~a=(h2Pj4@|-rrnkqUSK>7#l(07HGzHcjL?&tEOd~wcoZE=d;V$| zSX|vr+fkbbR*5175L8UXFm|d* z89f!9o3rQ~ck~1dOG?BrBQdYhwRzNn1B?wvBX2OD2{|E6$a}2ob&pWDJ2xgknXEDv z0&fF}-`kr+stEbByXHIc=Osn6gqMX~bKs4#0({H9ne=t4HHB!tt#lwq@} z=6s0lKY@;HaaH)9?m`FcQ{~x7+3jaMJ2PoUvsUr0M3IaIX%U$BPi*bYwHou_?Gofl zvEm^BI7{fiMNNgkx4K7jQdn7CT(SLft<`j832}wbMjq!c&5XX}L$C1Onh&k>&?{&} zW;lgOi3C+JFY}It?wDEaUdwBCujW>9-p#uf&vJX2Am^cITbr~vry+eq_!Yvhgz!4y z^%GD>%=<9bRB?y$QoZSu%ACvlXeJ_{o?!m8hnHziCsD=eBv(4gwTjG1X&4sAJygoL zNVHHB?-QYGy@cU3Ww`a8T3rGE5>zRLzKMFZSLx$TbvYG9)fUCJ^;Fe|q%Ux|PsTS+ z7Dc&>nrWi*d{dH`U6LRU)n<03MP3a{7sDiy$y6q?sieGjCesR<3^tcb@ok^pTfg?$ zly7Wv%dj7P027V!?>K7GTHBVpX}o#tUymwgrEzPKd*9My7cZF`lIM5!o;h7u(>}Yp zbdFlG6XUEYcX%C@>5p^zz_!3{?4-e+h+MmHG*LLAbpk2OcFr{;SH%B&{r)JAGk}0y}$P5&IHeR?+K1aFC48+z#oj9C+aO(idC(zZJWeb0{OXatn05*OS5#v2X0Y zD=W_36FEa|u=nE4uv|0GydNDf?*m`zoO3IY`;%L=<;$2iUn_F#=8Hd&OQrvoIYisBE;Dv<)@8a6pHoli}zqlc=M^3yq z*i(`FqHk z`_s9T@T*gB&Ru?ZXYaz+)}!m2+s;JGV6e2Y#fffwe)B=<$j>aV+_QS`eP_?z|IkMt zzHsqlAXIOij29YN-nnhA)JvNu=G!yf>g*l2SKe1n?wqtV9pZIbqFv{P)2Sj6Mx9e- zj;9Om<9wfbu;hNJM<(I(%NW+^o^(&R%UmyVZ2c2%jq^4iBfiGqIbUuHc<8+NKD`A=KRa&6;V{4mrS zjWN9dwsCE`+I2RV{t&N61y+kJ) zZB1c!w2dWxQD|oaQrBO|0D-fC0jDge)WhI^4LpSDUxU?kV2-Et`OVE$JC$JtOjh{Q z>8Kj}$p|=3?i6012zBXqWon`5mtubOZiU~9jpO6gq4SOX35L_-ezdH{=ZxMa3XU&| zGDk;oGKS8bv$=hU8Pc!B3Xdj7&%HiA?rQ7z^3yN5CW!yw?C&M^e?a>GIRd{0(=vQ& diff --git a/1.3/Assemblies/PerformanceFish.dll b/1.3/Assemblies/PerformanceFish.dll deleted file mode 100644 index 812d07a522824cd499d71c46aac636d3cdaf5edb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202752 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

vT;1$ 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

p{Gz0f2X9P6zF(sKz8F8Z4L;O&gQL>DpwS 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´RVDkZYh5I? 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 diff --git a/1.4/Assemblies/0PrepatcherAPI.dll b/1.4/Assemblies/0PrepatcherAPI.dll deleted file mode 100644 index d869ece420c0b7ad51a8e559beacdf8b1670f964..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5120 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 BKYRcH diff --git a/1.4/Assemblies/1Fishery.pdb b/1.4/Assemblies/1Fishery.pdb deleted file mode 100644 index 0904abbb6c13e1377b479f3b49b501088ac5ce58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115456 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 z 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

K>Rbk+`CYCeP%J5K#VVbEDv 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%0DbI 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

+q78kM|>}({mvdBeJd@p{3r8uc;O3sBLW)m4- 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%0D|ixlqV^>OqL)k9*otaO;9;G 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

*#%T*syk#Um5P_C`6Nh=U>4BLA(kjo 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 NYySWL{lC`&{|C%y#u@+s literal 375808 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⁡hKrF{_kQDQM#g~%3Li3;q(HnCae%PtE9^*keY2 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ℜ|9AfQ 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 TNo&xA@M}c*|Ns2otARfPW8~%T diff --git a/1.4/Assemblies/PerformanceFish.pdb b/1.4/Assemblies/PerformanceFish.pdb index a6e4688f928d5a6167ebf240dc8817c2950343a8..76ee26868a93dc6e1ade489c269df980587baa5e 100644 GIT binary patch literal 171916 zcmd?S1-Mq#*Y-R2W)qtd1nKVXlv8<2uO5BR_kQO)*IC!~{2aeE#*EeL*?X(?J2bB!=i(ffwD`1bSU=yy@@2|t zg-hY4A()R(!M6Qx=DGxwmMRwK3eIq@T=6*9G7EAY#*ZB`a?m*Dr`3sb3HWEhP95AV z#CsSw>C~(t{#mYWoa@mWZR-yo#m;^{b+vbcvG>>AT%g^SQO&cCtC;55y;$wKythA1 zVjibiwU2l16@2C=cdkV`=RQy4+!v_XlG?d3_~-ddNp(oO-I!Y<{+SVY}6z08}J!`&t!b!+&nPe zVK*SI2gbX}ikB%qq4+Ju88MeQR}zeOT@;T|yhib(ir-WGlj7odLmzoGa$#pP46rWqLTW++~z_*umtD9(ff7w1ZY@vg7p zsfr(0{F>rxinHNp#Jg5toExNgmEt{$zfqh9XGy%P0>-)4il-{ROYyUcFDTBAlRnOs z2jkrc#kVPbQt@kw6LAj2x%^!^6R;th%qD88yVBTlb)*A9$x!xZmS{EXt?6lcAT zHEqB+H$?G$iXT_}mEyzRWxo(Q@R=i8`WyQ&Gn&Y^Gaju`@?TVjL{IlZB*R!T0 z80SVR-m3V7;`F+9ih=QNoZ>}_k1KvtagoeyTNjLX6BXa7_>AI9iu2>5h;uc-csEV) zO2w}!{z`FK+$V4jfbnjo;?;_uQG7vhhODe90mi!lif1a`rud}d-xX)g#+o`{oa>_a zcE#%zpH=*+;#}ETQwfZB!xYa|d{psy#p!dfrU)4C1}dJV_z}e~DE?J(mYl3<1LD{z zzDw~=#UCqnxmZ&fjB~9N&sDre@ma;6D$bpoHI>15*H7_O#k&nDFzNFX{XH69l_Zh`Y6hEZ+g5qBk7caq@24K7!qj-_xLyBKf zoT4Oa@`3TLt>U4I?^V1{@fV6ymSRm!5cgiiw=3SL_(jE+73VF@nyO&DTcvov;;V{p zD8uy!z+~nkvR48$|265~6-c$cgyZ-m#2p zf$=Wmc*bQxJS%Tud>mIPPW#HE$(ERGN-h||T}#Us%&xNgTP3@dPkwDd46dF5u>h3&nTVb4{KN zE?ca=yZZ=ncURz{sE3n6S>{v>AI z#`PV=`^ERf)Z4kfpEwg7;BFU-?O>>|}N5xa(OX7L)eesg`wfLjxcC&3NF@u;* z%m+?#Ys5|9R5xwUe{Sb=mu0VW)7=&@X_?`6m^k0V&dqSe!2eatTvrag&2?49+F~QI zrPx92F7_1%gSWa-V(Ld2R}gE9&BZ?AaPe+&qqswSReWFkT>MV_S&ZAqKGTai#fD-# zv6nbd94Sr|*NVr*OJe#**-s_0yEsdn58meP6xWJRh$qD7#Fxd3;O)Bm&2yI#&vRdk zSH&6ox#n(hyLevAe1Pk7icQ5S;$HDhG1)=Z7ImEbw*j?-^ z4i-m=6UFJ`0`Xq)N%4&Mp7^o&g?L3w_Za)H3NCOri!~o-+yGqYnu|}0C&lN**TqZX z6|wjetgkHA6Pt={#8KizFlkxn?ufJj`7d7aV7NCuo=9Zf&q; zge!K!xe@M+_?q~(_<^|MB(qhYBFjBZRuk)r?Zxim9C4wzTs$Zq6;FXl%SiV!;*svW z*!LO6gT+zeL~*)!tGGy9F0K|giXV!fiQkGpfzc=hPqF6`VtKKeSQi}Snu-g>W#TIF zO>neJ{VbVLTq>><*NKP3qvD5R_UBmNNNfp?aUI0x#k1lsV*K;WCW;xvtYQaoyf{_d zDV`9Y6JHk3i|>JB-EZRP(~NHs?-lom$HX(>IQJSj-t~Qf94w9!?>xgbkBC>r#22~d zsCY_zQ!Mxr*OwHVh;6`uZlw6V_^X)kGS{aSGl73z2D==w^}XFghg&=X?&~s%ImDgfKJjt!xcIEdv!$=&+0xgQd4;Sj))X6v&BbwH97V)rnQM@cByw3VGVp*}j zxI$bD{?*dKZAP|(+a{hDQ=I3TbmEQT&Ehg~yZD57LVQ(xOS~vv5q|?ax>9eD6~!CD zq@|;)hq$wAEp`%ni2cN&;uvwK_&#WtChilgY2p^Y8Le&Z4kB*u-VhVtVq6;60cEaTopKV@99cm7T5GVc0V zeL0sMaXFVyEHBoNW&cU9mv8?oG4Bg9~3W( zKZ_aOXMKCIpEy~ZCC(Ff4`9-g(j|Q4TuPT#%p~Rz^NZER z-r_)Ugg9QDD$WrXh{}?7te}si64lci&w;yA9Lo}#r)vk zFDYGdRhAR0iFL)+VrQ|pI7pl+&IA8`N$HlV@*Z)6_@MZx_@wx>ct-q8yaN9HlG6Q( znp7^~6Ecl>y;x8zA&wPyi%*EBz(n_|*!dFUo??G-m^fCPEY1?=iR;Bj#na*?G1q1G z(_Y*m9u$v)NlT);s5PlRWo2fuwAfMXA@&!Ci{r&<;;rHx;(GA`ahJGXJR^QAUK4YE z#=6mrs@w(4hpH<8&78A>fwZ+C_H*vT)Q(P+^63>a3#Gl1VU$Ezz zVneZ|*iq~O{{52Z`m1udI9{A4E) zsdBG)NIWLKD84R!Bz__C&m0n6Cb5XvKtY6{Y09U&A#c#wP#oxiCWtB_ugLA9g_26okT`Vk?2k&*&#MWYe zaTu7itaW1%uXS_5b#9@!CYIgcHX+{N4vJ^Q*J9b7?rp?7-6ioS(Ou=5lwh1o4{mlj z#FF3^S3ztlwgK;Voy9@oNO1!AfSV>R7T1ISCoJ*qe#|7^?GPUk>;A|!oyDHw5HP`w z7AJ`>iRZ3WP*4X;LiW6L$pZ_ZN*XtA9 z9sjCTf-CaNU-xD+8MIe3xL&Bw;0B1Z#e2kEVA7JoJ*G8DJf@iZw@YSs3av7`7sYep zJ7W4@|Ff?GE+^I$a0SJZv1|cXQEO_LH4P9KbuGm6;(Ox9;um73-&m7ZEFzW`D~UD4 z`eHM2k@%$es`!ccm3USBUF>#^J@*xdh-1Xb;%sq&xJ+Cv-X}gUz9POQejt7(ekcAS zCi|VEq!BZTwZukZE3uP!zxc5Dn0Q=#POOW&Ls8dMY%6vZ`-rQ>3*u$*8}TQxXdK&C z5^IVL#kt~f&@M&Yi(3D>_@4NQ_?387{9Q~L&z`Rn^NB;mS>k;0Rq<`{L-BL*iukLT zkc|DL6*G%9#0KIxakY3zd`V1>KVdEE(ut+Srs8q&3o$V{Ych)2#r$G%u$U_^Ruk)p z$HY`An7vLcA(j{Wh$Fz_Zh|;XoC_u`#oaGjlPV=^t`oC}^~4@v35{FA4N*K=yhWTL zE)#6n^zv7tCloGmU8mx-&z2gP&ZhvMhr74cUwby|*6U2Gz@5xa=J#X;gq zaf`S^+$TOEo)o_WYw2EEOZU=RE-oF{q!Me0L&4fQyK1YZwwtImMbmSAEwQ24R_qJ@ z^QEO5jQW;tlsHkGF5W6G5|@KXOG~#IaVxh?+$*-dj%&Jzy~Nq#Q(zlCo7(8v)W)6G znqC>Wew26|Z0lYW&x!Adi!*ZlW^tRy-?OxJ`xQSaz9D`k{vgI*&sN#QGT=X7+PcbW z)k5s>uiCcLmD0|2N2_+OulTEYeI~BSE*2K6fd71H?`omGy=y485YLJ4h?m8$#jD~q zF?nXT$|zjp zZmZVp5f6ZNxyhZxnw#9^*!rHXc9uB&RZJtXmDow_DGm@vh!e!=;%(w`afA4{cuIUp z%$)T=Nsv4mJbyiu$#HW%BA-Nl>5Vd6M(syJ6%1STy5++8MKgLsmA zQ@kKv64Pem`hsE!v5HtrY$y&D$BOgCjp7b*pZJ7$Qv6PI+1Ya{F@u;*>?RHrM~V~0 z8REsH^*PvfsyJ6%B;F;y08Vvpi5JDo;y2=NBA=d9T|!PWr&v@hBUTn`iU-8=VzykY z&nK1=D~UD5j^ashn(kxM+{=pjG@s_W))Pj@NvkmSwq^BG3OB`nk;v zcT{T<@^ej1aHj4vGxZiU)3wr?KH{C?I&q7*U3^$PEIuWk7GD8p=?nq!U1^qkPiqzw z;Q9^XcJX=fy!amY_seYeF=}SJFGM~`XS*wke-TR+&r{s}s{cr=P&}H$6xR^(6xUMxP0U_`Yf6FtPnHp` zGkO@|dItTBbp5erq#GuV6(@_c#ChTp&@Q9g3alCB)&}dxxXoBI#%&Y#2HElMU~CQk zt_JZycS?LwJSV;*-cXX+JYrF?3}}~uu7=h(5L=3!z(KBu$fxrl*H7_K@h_#iTMVuktCN2|K zi5tWR#GT?};xX}*_@elun7llDPAg^>bBW``+r-7<3UQtIl^9>)zuNzQwfCCnY;2+@ zdlOd>ZJW3fVpXxW*hp+Cb`aN!yTnJuC&UxtbK(^-MMd_RPRuNp7AuMM#17(3;uP?o zFU|C3(oAnY&D`y1+sqvnpG%5yJvMVME50ON5qVsixnC6bt;F~qu(^6`uHKrv&04cf z{7C#p{88lj(A@p5xMpR>O~tliSFw*cM4Tw{`%!Z@L-C#BI`MvSr}(J&0$9hrFY>4E zb=)V4zZ7q-f`127*?Ky|LDbZ9STGbIrzVGY2bQl+@a!Faf&!cTqrIV?-e(R+r)>($He2}bK+U?P4Oa_ zv@~#^#^OJ3V*{7{M(&4lVl^;oRW}w#YnrO2t=LuUBMufvi<87z;tS%N;zjXO@muj1 zF=Gvm-c;-XMq>@onh~)zKJmBzXsC0kq0S``=TbvA0X;Ny^Tbu+R)%9(wy34OMm&69One8Nw6sL&1H&%DE70(x! ziu?&xb;qAjRd;K&=4tUA@gwmYkw1y5?tW67whrU$Vl%NF_|KQ>ZkSrl6PNzWwp-L{ z$G>V-Lq7woq2CVFaEH*ghMQWKTqdp(w}{(C{^Y-gJEr&z@gwnbF}@zNiDFiGS=t%Y+`k>uGm-PUAMFwtauby zR^NZix~YoihzmsiKC!IMx3X@T)@%~DihINZ;wjKB<=l%{Q_h_OE2#ep>c4_}S8Ki& zuZny_uHddIF37B(tfDvPDmr#m+$&nsy)oBM z73YWx!~^1CF?kc#WE8WBd_$<>@+vMOb{2bz{l($pcyXF|T~oHoFBTWei`B(L;xX}6 z@q)=yO^>W`@BxfD&_+Vy3%4Lv4&V*Y$mo9yNJES0pf6RoH#|C zEzTF0f_5qBR%-n^af`TJd>H(zC8s-tY)*GHR+G~`qcvy5*TlEQ55!N!A4L9TOHTKj z;)LexCykg3{GV8IyJF}$w<{}F5o?JJ#TH_FFlou{x@k=xagaDtoFGmU`7WB<%~!ls zTq&*-w}{)t1L9%vDe<)Uiuk7ZnRr#aCMIve{?m$?#6n^@v6@&{Y$~=DZx%<1w}>;v zdE!#>9x#vNJur{kqIkRbuy{y3Dn28=BJwYh^0+q@^BZU$cR}$b@hkAJmTc}9WV7j- z&F11;GUk&dn=7rj5}4i96`P2y#qO=Rej#X=lKb zn)-ZO{6PFv{7(E?jBgWdZ+e&7#5qiy-^9gZ@tnNVNSGs--yiU$&j3R?tvM~eD!wgV7QYd*cVQ2O#8P5kaR@lc-7T&G|9i_Mw<*?klH01@ z_K2Uw*8h{9C%Ny`>X(1j%Jw|fCF}a1TQS|G4c6HDe-h(&wdi5G%Ng`D&lL>T{JFPz zZqWa2%_6rvsKLLjA6v7?ZHmSC_vjH%abJqxi@%Bmx^aCqv98!s>?rmSM~SzKOT;ze zW^ucCSbR-Lm&G5%YhsF< zI7&gWiP%fLLtG91e`T5C?$eyNihIRF|7!kI+%dI!R(x6fQcTf_l&D_Y?`etroEdHyR*K^Z@ng;Gx ztZCrx5Ld*q4cvOIc_6mtuloG^^_AW3SPzxmfmoc>Dvvwzr!~)DO*Z$Un4C~-*3x5$(F!>%P;z`BJ-uFBs?Y7aLIyCDdX(}Pwzby z>N6m&hfitLCz|&7_ts-x2Klna*f9P+7s`{KqE5$DCHJo0HwzJl=^k*^qd zrNAo(UM29VfmaK>df+!2zYgQqFwXr~(>U|BjMwp=&hNj{-qXV~Bj)zjM*Veud)Z$d z4LK_@|5tdfp-i1Ce%drDG>KC&h|ZV_C@&zyjR9}JePS6GhYQh12OkcFL+fypPt@t zgmdnN@#&3x4WB=a0qOjASxR6N4&pZwZh3aPX-{e-0c`d~gS;ap1M(-+>#`?JPVBW~=y zHS)O-=kwkMJ`iym@BH_5rX$Xe5B}>U_zUr*{+q%38SfG}uNUUqqrNQSqWJWOcku0b zJ`OOB-HUPm$n$s(GLBt_zfSohUkg42pN_siwjYXo)}@8oX>5>xqlYpZWrwzZts%7mm25&=+3~G;VO*Ur$v6b zao%t4GS2+n#+hGXocWc;nZL(4_tz@pTfFn%Jma~;>yPC`7_W%@Nj%S@_PlF7h4VRb_W!iY z8grgc&lue47?s^r(|?Tr zrg7%qGV^T>e>?DZj2A;ba-QqF|GkU+c)$HT-`;~y@ZK5zzH#0!E*P(jXYxh(3}2rQ z`48YTy^n=|2%qh}YT)dT`8mk*T+EKoN8nsv&->ZO#<{(p80Y)wulOx!RL}kQTj19M z|2=RQ_n+^v0cnN_g4?IQSDUGxLRL0p~V&JI*Ph%W^%;4y^V}IR-wu|tg z&x2n?%?3OoX?9^IG>_C&$rgb zdB2UE=Pvhe8{{7}{k1jDns&x{y|g#Z{oMinkZ;fTv5xR<-Z?&h#S=M?0e&U(AKoRd zM9g{r>}ot8yj$SijkiLcz8&N7SaJW}1mEGu=XX>3PM@#oeHWa^p6725V5(Fgvh&-47C?}zhUpVxO^_yLor zA2j)!;fH*l?+^Wq^Bt!@{4t;B`@{hF(?g!TVu2j}`NSkU!${ zTsJuIA#tT+d7d9b;YWQv&&Of#W8S%q!;SM8j4;mkn~}!3Pe&Q&{eN`eV~kfvek}aB zACK4nIQU8Ld>+uBf^%EA|Hs3h_IdgQ__N-5eoury?>!6rmcS<&=l6@r#<_h{jNb^K z3P0`pYX+YdS1#t4y}y7wYj=4+18SHlB$5 z9OHT5bB*(Qywy0r@7!jb*H`4Mt&Gp@$e;D|iac=K={ zGyjlr_P^CQ$KPh0?>9T*s>kNX{&pJY{@-PsKl9pcoY(hWfN{1zXq@d28E5;)jdS~-FwW!gq;a-CY@F?n8cz;CW}NS*$Bnc73FB=4lySCy z+Bn-kW1Q_z8E5*qb>-}3ns@C$fFel*(9UvKF=X`iPzd=3`&ZRg$-x}xn@SX8|@GHh|hJSDTcK8p*OTe!h z=lT1i@iXwB;OYGMynp{}JRkfQfq!@_SE@?dQ88JrVWS`TfEEQU{*KIJZBo z@pka^#<45#-~RfeKY9k^ygo7-=lItf=g-eG#n+F`XSMeXm>=gq(tAcYuO)6@X4GHr z=U)VVL*QAAvp;$!(;q#v=`Sn%2H#&()YG%Td2D#SWW!F%>hs(m+2dQpob%6NocD{I z#`*lsWjr4|w{iBD$9Q|=ych6(mlyf$e*B@v^C9N-!+Z|pxo>#C&Iixw>lYj6xjPx3 z{K)6>dG6x^fftN#9m`iizL0Sq&%(wBc+ZXgcrEh&$$TC-dbcYk4n>Jl|#czE=kMBEG&J zysYu;@N)2?KF{Y-dE0ZWBViL_E#}^zK>Tm z&he`m=Q&c{IFILz#yOuF@f~CRbAQw{&#(H%8z%oxZ{WQG>N$QX@73TR zCgaaS@bewC=YQjnODcRC8t3`c$oMvtHHO#q_1vB&#tXok!t41wx1pKwGJ%(ZH;?a* zpE)Is&+o%6jPrVKX`J5?TLs?QcuC~j80Yt~4)Hx>{qudJ6OLar9`{M-_&PC13jc@d zKb+TO91fe$v$`3wnsXyC&F zA0GG!3=)mU{WCJij|%d9N3-?(e~m}Z^Lwmu_BYNr^W#nbNVy4tPc*&{`CE*$ep29* z1D_K3RO3a^ewy)z;nR)t{GJi`%)n;_K0EL^fzLIb5B=Y2oY(hl#(93+Zk+GC^Njxj zpKm-l?lF<`T6qmSh~5O}51)VO;*z{6yaIBMW8DJeoB8vL@0SaW^M1I<_-y06ckp?} zd~>wVg}5y~cfect{ze$*wan+uV&q%;Jg@O3#+$>J8jpkDX`I`%%sAg~mK*2$^IgXI ze7f6sL--2gS+Ec2Z7`prar|9zlDCDIgFgvhiF`XhUvBd~XcIZl=T&$=iJbFUZJgVD zukq2|+oM0uHJ|qm@Vbce;y2}M8;tY)EpqOA z-tRXe-^KUG_qWLNA?Eu4y({t^5%ZaOAH18d-(;Nc8jJARgnW0O=ktDZ;1A(`9OY9Z zztwmR2DeOi=5jw2%i(k_xJnn zHsjpZ=H3S&UkY&pd`_Z%ps(lk^-O%fnDd!=3O?B9`M&a8e1H6o02eP7zJELqALhLu z{4{*H_gU~4;A6b6fWHWz=$-d7`YmwY3weFgC&BrC&imy{@X5ZO^LsUZP|SJ1c+EKP zU+1vDruusB@7DuAANU)AzlHvy_PjrRg8dUY-*4&D&_Cx=0iR3o>3%$p|Fv#TU9zG09YRujUN3R* zIo?ZS+vyA7Jl6dAEqx)J_j2|}Uj%;wF|Tj>9q_La^PHkDhS$LmrM)kKPla=PnO_Q@ z1?T;iz6^d8&hv@B9R3uX=Ww!Qh1^|mE%M zSH#7Y3lZ}WupJ%y@b56P8TYNpwhdjos!1EgKgVP`%e5!F%)KHsYw=l;0S zIFCmS_%=U(K5uIp=lf@^WaDFb-p^_q=l-l?oc-4|&i3_;vweNz%r`L3{ol|y=hMhI z?`e&V^PQuKaqf?%#@SypXuJ9gOpQ?r5Cjbu!NLp|f%B&o0Kl{_0_z^}URua3zzu7p??|#P1!TZB^`16nT1B@4e4@x#6mgjs18|VAX5aaBBsBvC@!;JHJ zHr#l7_z2_NzLCbceWQ%?{yW+@kJp&M#~Nq-IOD7zANU00teY`GGGn&f~q*IOl(- zan5&{ao*3C!*}}gh4a13cq#bZ#(Dj&Fn%L^rSbgmdyI4Zb;dcr^~RasV4U;YXuK-? zKKL#(zfHy~A-~x;&*v@1Tf^@+UIzYvao(SH80Y+U;(i^C$Ma#Aan5hI@tJV`dnHjl z^LtI6@4NKfm_Kv%z3+jiMqD1Bhmqgww~zJohfO{G5mWyNe4nr9{P)2h_0H$dqk->F zHYt|p^>DyA=XB6Guct$SKNk4o#(BSe!gxOTlg4>I95&APy(94bX1+(^2fXuqI|e`K zeH#3@asEt!eh7K~Z09$8PQV}Y^|QS{4sVB;&$pAvKjHIyzo0(}&wyMN?}y>z;b-xA z3i%_xp6|C$!;gCB{&~juWAIbPo4}tn-qkqIt!DT>0=l$&?<2+s;8|R!pG0yw%CFA@)av6Tw zkH`F{#`%5bGx!TW&+luW!_Ro<{{I60qIZ7h`x5@Lciz9hg1_RO-)X*vzvi9KpKk*H z*7#`TBQJuO=l6HWpY!ecJiB6?&#&)|r-c7tobMl3jWhqFaptcX=P~)+IIjFZm;3mNDBDPf%FPsxOevHGI$QpO9yOB?6)UdA~0M_J=M zzsn^QiuK3yvAl8a?+V6wzEw2N{awj;4tQnwSAKh#uVS42w@#QE%k!Dm)j0d_k-)zR z!i^LQ$M2aiBj(&^k#pPl>4p5)zMl8<-o`7!`xyTi-q$$m>EEC|zZ>$NeKY)9-`^-q zqaXZx?{^{JAO3^)N$>&2Cj`!CH1k(cpARvQC;dk_k6q+H!FjIH2O|G7oJ)6n1{vr6 z8*H4%a|rwwUw;RDDEwFNe7_t9|IIt^N5kRQyz^%=BjCS#XMZE%_=77%N$-23;Bnsb zW8DPfJRc_-PYb`rIFJ7%H$sm3|~X~vnK9{7yFXByvv`dRP27a4yp1-#n=l0Gs&iy&xcxw0p<2>IN!jt>?@%?y_aX!!P zFwXfb4t$AmwqI(T??ZRudW!mI`(=SIH}xFvF5|r3?uMuE^W*bqg>jy@s zhgE^EHqQNbukqgS^$9caH(yETAJ4B1m~Z5q|HdGHUy$Dv_-5lgzV`?1A250L|Deh9 z_&j8s^Vu5IZ!>xB|Lw+kz3vF=cLu)O)U*FRL4I$Le>lkRGkM;BA2rVL_XqU{0zYKx zx&4nB=X@Ry>YoVwN#oqVhfRC-cf>gRJ8J5gKW6fr@9`jiBJh)@p8Y))SS?`CSP7V&ESn%#NL(4f)u7=JEe&Myt>^ZWVm zZ`Cpx=VLVTeW)#hPmbi+kG`JgQ_jG1B`+AuH$Xl&yr8e={WFho&Oa}_kk40x=SP2$ zv;P9ddA=7k&U_)`%$GLKe3`(@CeIY>pXWn4<6VvOS<3q#^Mx_L!iYKF^6(;lzGdK* zlBbC|k5^^m9KTB7)dH^`cn#w`r)wsk8|$C%bhWTO(fI7YcHnhPJ-4r}ah~(_;6=^+ z>!W?-?2mu*7dhWo8yaW6QQ(aOZ({oA_)U#B@m?I`voG$?X2_TD^J(P0B%J3;Rqv(X zyxw>XH%EPGU(fyB!uS{Pmd3fiT48=sJ;!Wq@|<5AME_L~m-Su=J_0eX_qM37 z?8h$%Z)cq2wa0i-p5t{ed5+i7IG+!ljI+Pa#@Sz&puesr&;Gg@FXX)n=Et%5^SAEE zSM~F)48O@Z`|pANqdeR6GYk|0v_lEF}h+BGZ1n+{F_cyk04DW%sI6fobP2pU4&W|+CZ5U;o^Bax% zMfIHD7?bbjy(RkNvxeJ07Wr1b|C_zH^Z7>J+rxQp=lx+E>O1&)jz1pbMb7ai1U}K! zbNlHX(Vq7XK9A|0;QX$@`P>5U?EB~bn1uc!XaAD}pJM8>U^h*L-{jlxMm@b3oag#o z-h0D&tY+df4f#I4p2vG8`j4FB%`(pC$81y2<1r`jxq;tmoc-Nq`lH`&oc+%;^`+tS z;eGx5&chcNF9u&|JRN+I@t?fkjP`R7bAK}55B?NlUSD^>`}_X6J&TR={cwqK_P^9P z-&yW7&iZA>S-;#k@5gr;XZ_vA+rd}B2m1MBgRe9`0DcdAu+Q`STVyRJj>+8VR!-so6;e8amFyblRN5gsT4#H;x>c{zd zzAtZtkN3{wai4L%pKmhGJ~tcZ``;Gh-2e9*PXm7-Ise8uY5RG8Js9{y$#0A0c@1ne zeyjHhXwPjgjn6jZC;I+4{&wSh-tI8Y{kPLNj|cr0wC7w}dY=U6T<3o*e{MPt9kNh-0KF2$4JRkf8^dIFp z-kHE(H1!){QIA35jqX5ep`dd}x<ichiy!Gnv50SskjQIzFGm7x;Rfub*N3$T^?S z1OLL*b3R`h=kbX=IzC?^ztGIbI_E=QWajfV{0?8w^W__iA35jqZQ$RTdd}yHan2|5 zXg=Q~zu3&jI_E=QV&?M$e5skwRg51w=ksIWKbd;Y=V#+QKEJ^4G~-+6`1ECF{9obA zeSHPwf5Ui@bNp+8|8D9zzDw~(dwySvgWqMwx6bkDcboC!;VaDe$?#B$oZ}}1p4`-P z{1nFd{V%0)en+s*pI6gY`tggwQ^D^s<0oRg$T@!Mz|)v|j-S>z$4_UR<6GzW^i^j3 z^zhYY{Od4Yn8IiD z)E`1u*f{4?#5nUsjWb`&IP=AgGhZS_##sM#;iZfhg_jQM%cNKwtB*&%Y~baL^Z8%i z_*HlX_$I%9#(Lij=erQkkBZ1|@p;~JD`EV|Ip4~GS4mMYmd}j|(H}y4KEEHqhrSig zcdymnx4}=F{C4;oCcguIJ6?%b`ud&lJK;0oRngyWI2Zmrr<(Dt-uEES@n(773-5)v z7CzNc|FCb*^Xo=zPvqRb8iChLu{4%1$v)tZ`1U+MY8y`vuVbA1v@ZIK>e+w2!0VfO z_TK=$&-CBWIQws8oc%X8&i&EEcy)MF_@ll*UXyK&mw>l3&iiM3_$Z z9x0Z^^8A@hPxt}fp4VS5<9Xq|jdT8ejOT&(HO~Dz1mi{har~iy4@+@ZEYJJVaO12W zVVu|d$e{hGz(<>U_BX~jpRr?&v%hgc`|&2v{XM}r`cfKLBGFvy-h-Yk#qi& z1D|5*Me=6I z#=F9AH_ra%1?}etzQEM;eP^NZ#_&Z!{T+cXHuYIhzr;AdFE2ITAAV=hep%ql@qCK* zC(nnwjPrcBJE&g~_)1gH_V*Ys1z#1^uMYfPQ_uEmjC1_8LH)YG*PD8_-(WlezR@`Q z+nnNt*!B)G&UX#|{AUaDkNfj26K>0qFGh~<9}lERhkvIp>3)r=xCepAc|Ja5ob%ag zocV3WnctowYpgxr8Fm=w&m?!6dbZzXob7j;`b_XW#(96;Yn<;V4;$zE!z0Go-#+8~ z{`#nKZuJu>vd8AjpSM35_~F2h1b);wx93>k#{)lMocEKHfj?!O&%>vU^ZE0PagKM& zIQx6nIJf^f&r+*C3j@)ve{{+rs zwb1(|_&LP9A0$WpW#69Tr@(lTbNrMkSHzs(X;KCGM3e7;d}{cozCXVIrZLX;X^q!~ zr!&s`S$gBV-mf!W1)kM7&zEeNPc$Cqn?3LxDf7qjyg%hM&f}fSIM4swLHj&`=QZ_w zp5-&neVpGo-yaJYXTG3uj#nt?zi{A1Og-=KMd6?M{mXN*80sTO=!yqk!qm?~p8h%7 z^Y^Ju@F|J*&gVxx_?LeF^8QQz z2F`uS{Z$|StSJEov-JAQ<44yd?s?-fAp*Hn~~%GXaxV!*Yla# z$~gOLjr|ej5xO>kw+*~q%7U@_`%&K>{)_K_1-t|NSMPjAbwvBf*?*_NJEzPP%a=yJ z3;Z|V{yy*5;N1Qu_;f}7cc16?r*7yka`xXn@S99MulF9tdHwYa>U#y=+tjmtALDG_ zH>kfk@O~-piOsJb>iff8G8`N%yaopt=k^RVJ{Ug8IKTf5hR6B#e7_oEocHrlDU-+Y z@$k`skHP$+_6XhBz{i>TmdHoW?-o2?$0Hx_$LD+}80UBs1HT3RNA(w2A)nyKk(2&iXrz^ZvEWcwO(wu|N1eQ3Rjm$fxl8hx5D3INRTCoa3!9&iu;2?=jB(yUIBG zUu~S*f3NYv@HOz1em>luwZ^&q>x^?g>y5L1gK^Gpqw%`lQPwEEk(kUiePqMd7=Qv;WDL$VK`2~o%4a{eU-;J2}^H+_fwaQ^ZxpE%9^n}ufOk%4~JiY=ke{i zJ(2U>p8NlM%A0wAZmNT1z$7=ykW_&R`!T1*V zb*UP~>Un%J1fD5X(^#JGdzp>1{s!aBXEDxvR^vQ=*^J{?$1b~ZUVph#)sKzG_PGPk zm#TFv&-b_d##vt=@WQFO#OgV}qQ-eVis6T3(f(rl;;FjFocG5PLB6EPA3&a72K$?B zcjHqEUe@pbq43hio59P#%lSO_M_J=#;1!HlgjY1q=XE9H<>8g#<$ZsgLlw-|dey+I znfd~#uWr18_X_Bb@8UcMZ$!SL?|-xR%J58xM|-aV=etsGd}^S+ny+u`y*iw8YvTPz zIQM-Od}^Y;hOg)KP%H4-#&aNFC-Az)`94<9IQM6L z-o(^%|1~wvk3L@?ejReWr?o}Cff>IY#*3Wew-3BSs-Cetx3{Bl?!Qh!edoZt z1m4xO=Xl+WH-dK$>Te3XhpFfO=xLnSPcP$~U+cA8zV7-U#FE z;3MJ9{CIq49%Y>Mqm6U?F~+$Mrl#r>YtQ@XG~=AlbmPp=FwXo;<2-+68Rzq0wsF?a zG0uC^T;mzxw;E^tZGqozobBfsXZ?KRyr4j5;D2aU78LqYq;0)O1pv%e>d^Lb8hj_Z+qm&E5ucnfoXIgI`y=kY!g_|d?R znf519Pj7|(crToe&vAGg-#@>voIv}?+5gGFp9=hG)BXtR>Fs>~x4@r)cQE~*GTsyU zm(X97=Xfs%el}IVSf2aq7319BuLkw61%58@*G+r&ciuSPPu_rc@$+p7e-rH^=ltFZ z{O!QsG40v^yTD7ia|!t#zW=oFuQ8ve+vC-aHqLuS8sj{kX@mCZ0#9%1dH!8z zob59N^%(=dKJZMYJ-=gQhL7>vw*!6y>Lcg&WeGfM;Mo$_#OnFJoZUFzH**B_IRnoX zcy81FakQt8#r)PG=6v(O$NBl@hUYcT@$wnxHJKm%NA=vE0)ZC{yinkU69>iG^LQ39 z-U!zReIn+=?~Zr+{4H?ayPM-v6!}ShzI;C{W}Nqr;>LMDDq*~X_bF)4cO7mY^Hbrx zH}QNe37_u!AK-lkoZHIlhxwUs?u&N#l!DLl^}HX_=fZjH7J9!GUJUU>@AKdt5p#Q3 zKOf!=F~=_rUjXM)B0k9%!+GuS|Bc1`5;)KOi{4kjk0S1bbA^zeqpxj!2j&jfF5ocSiknQv;G`DVtMZ*H9V7RH%xX`K01#+h$z zocT7!nQv>H`F6&cZ*QFW4#t`9WPCEbyK(NXo8YVc{$=|f#@W7?@eJ_3#!tgGUfU>v818;I*G8lUIrpuh*4`q{|S*J8f>*#^%)`Z_qDM>X*o0$=a9ry_hP z`iq?X4-0&F;3G_X-cLuuH~9W|&X0m`^u7{48ot>(uctA_Yrw}D=ly!TalQ{s!}w8q z&To3)GXkH9`&m@a?|-x4Tm1OEAI>(;`@a=6iCbcM-hY=G z=ly`b1O4&b&E|b4yb|L2_}q#7E)xZ->RVf>cH?yuYn8&f~Ej{YCYh?}orPntGm(_rV|b{j>ch z<742P;g6X8v&DE}g(97|ZjW_&9u@ z**_<+(pTFwXnqhsI06KT6ydtLM+> zKMwl)B=Ae7p7XnGyaW7G_yNCte7<~Uob&k{e$eN6KmWow^Isb0-voSRocr(V#F4S~ z@$hdjzo;cB67Y2J!^YFYk9c2%JpBZ`DB^zJPr}P1=I^7J ze+tfPgU?s`)9|*4i{Nt|{24fxdiZ33pYq-Wo)P}McRnMoH_r1Tlkp1h%*K1evts+B z_S_%Y0?%&h`F$jZ@fPsh#`%3Yk8xffd5z;#a`}vNzWI&w9jJhD<_j9-peLq+3V;g#So`SzTDW#fDvR58x| zMSmIf+&3k?pM~c{%%5jgMgA4vUjcYE<9y$xzlMBO#C5%&gL7Z-ouE4Mulx4ApWKM; ziJaS4Bk-Dm*D~$7y|s<=J8B*HdEY<#t81Lsdp+aX;q?P=V4U06(0FT{=JdDG{}ALp z^!az-e0HDq{vMp~ste*i><0aso;a{5mx}+Wvb8b&pu;R>4G4U&alU^HG0y9EsPTCCFyr`9pBrwx6nqSxH_`s&H9j`* z@i;zFp7WVt^6Y_a=Z(GoQyUBCB9f9u*>UWtu z-`{o{Xa9SG`n@L4{vQtfk)VE`$@6{qQRD1?e^7tGy@N=mjiRI(4fv>}_`u^La z{yh9=?*-s*rJfLTeqVbxb)o<8_ft=bIqx?Yjc0>@V4VLw^~k?Mj@QR0$p2rgeF<2N z&-eJ-ZQu9BmNz0Lsc0e6rleJckmXjly1I39?`^ZD4H3x_rHzV2wq#$jMzYHiLYA^+ z3x)chnfKm$KYq6F^Za|B-h0lOnKLtI&N*{t-g)2mo3K8_znO+3ey^bYqI48vy{4rj zej;4NuT>7-e=g*Q*Hchlgd=%;rQvA4XrtjMy`6@m^lvnND4zOG!wmtKl<%$&#gDQy z99R)@G#v4l{|Q&1;T%X;1pJ4v{m7pv(Qp*+CPm_j^ z23(tlj{>~6Je=nj=12RleP}qce_g;C!gP7SNqO-u9QmJqG<-AYlRgbc=>|01ADSh? z(c0^bFkKw@uL3wmh)V#T1MqD4H-qw$!ulW6aMbrhLR<>cQT)dh;?jWg0UiYZHc(zh zSiX^l_Xha55SN8?BpVddqWp4zBUz&Ij`B(H%?nDN3V@HL;r#)3q2aoKy8^Bt%pWGi zl>i?Cu(=Rd2HXtbf$%>b@~a5*_h9ttX^w2-8vfy=XX&Uuif>_o3m)KK*ET1>h3_*AntW_Be@#hX6jAhL-~FPs69gfi;F};+I@YqtNsyyYbof#H-D)1pm;!!h9e)_ zkA|c9bAW$c2mgedDOh%;4~6vMG#vRiOB#;mPiut{UHN068FV~ah?CGh)b=TW zj{u;*u)SzJM*f7`D2(b#kAn13fa?qMYXLr*hNJn#mWHGDjRAh5{D{BZPq;lT|8Pim z0DORuKk^5TG#u@(InnS~z{dhVQGUeV`6t|kmVX$ej{|%ljlU}mNA@$GhVuY-1Ae0X zh`;+!xCbpivVTv&4TStrJn2Ql^#J##;kyB!0Q^Mx5r3bba9>(}i9T zKZ%Ct0zMh|iSi@<{y*VUX!()+rvh$B<3EjtBl!o=a3uffz)zGP@t^S%K9iOo$$u8$ zMne8}G#uFi^2ba_A1q7;s z?cWUbiPBO1TYkcee!`1s<&i%s0o+W;e>~t@A-@Pm{I=0>)c;Z%j?%Z&aFkv~s* z9W)%tw}O@*mEZppUP;Su0qF+-Hy5@K&1nZAzX(U=5B-E6{weBGu^KsxO%8&S;py8;0CuulJucF~7{S=KK>i=mP4q1sBT7Fdi5)DV?YiT%2zf8kX z`V|^K#Q!P{hpfaC8qNT`@hAK#jUVFw>?iy=Ex#qCzW{u=P<}{0O^{!Nqw>u(9JTKy z4M*v(XgErLP2-2!|AvM`R^pq&)Gq#LJ=~!X+=Zk0LrgKK3wH#ZLBr8}BdOS(AMux= z;dp-j374ng$Umwo=5+B#@s);RXcvz3SCfWE0r+MezJoA7iZ@2laHKDzf5L%8^aDo+C-&gVfNw*>JzK&6SWCdWwLsp)1r)XseIPg# zBS_@J;G1FSir%aY=Wie8-#)2?&tWO!*+B*0k5k1b5!HwX&?1bO|G_zB{3@$5+&j`rlH$y4F^ZuwW+EBYPmbN<1qk;2i z;XK+nj}Fe$LpUPPEvOf@M*`=eS|y8NxW@oB!W%vDc%hu4airifXe|TYafr&EfvY6G z0tPJ+BR=6?yTMWu?tue;YLp=^`acvTD~LDnbujMrWEfvjejPl%h$4aWNW#tz%8%&4 z8N*bmZn`+(1F7_!BCYELIX)>zcab1Zh~#ij3xPj;eFVeZ6u6H7 z^nc0otFk}y`BfgewEqlKHaiKoc`McgQy67f89~29oV#HLaS_{QH|2LZe^2j&y##gr z9UpWbmAab>d&;;*O7awp-ZCm`TO8K3pg8A1u@vP3Vq%3&K+z*j|~JyLdr$})&bXrVZ97p@Y- zey|8hVm(}?;Q3+1tqtN^Vr&s~|TeL#qAo<_N4CX#SPJIwPV`EvI{R)H?=#gQ6sn4lR_zvo@>=yLu|( ziR${Z%;5wFw4b`dT|jI#$ft>tB+E}mlW zq!LQigrHHRlm1xdbFjWq(n|%Mfms0SSQ~~>DuZ|oCE-2-jHUz;3=~QD&Ipoc8C^Tcj6QBp^pPB_wDcA|dIg{`RqOZ1!!FMQ7Sy$XgRF{O%H>Tq}-C87uV;BZujddIC zm{9vBa7q)Z5qYq_cosvpNyQ8z+eG;p#1QZX;OB8)Zh&MY2`iw>V0)yjUc{5~B&d|g z&rmS(EezN%KzvXh3G6Y@jtR;+5~re=2WCK^NZ`Ad((rx}RLdCfTC&2rLZQv_*l&o+ zn&4jO!&RKHhO20vqB#FLRT7?LM{+=st;o8eDEy(TD1NvHBMaXvg>jL9w-ljNDk`I7 zg1nQcFFv?1#bGw&qogWo$y(4KF+u?Sf>jiZ7d&5qb%x5%M`YYP^t=p$r$Z{lR9FKG z;VP;n0$@oZ0#c>$n;~F-1ovVy$WtWkZW{q<<2EDj#31hC*;WdB%U9ULQyPNCLX1G? z?nEB!*A#g61#8IvR_b3ki}KLxrNayG7>x%RGVtt1Ndvx-iEWl@4~jbAt}_UfK}2DD zkpNu<|A1{_E9S5P&t+(bNu0<9ifHA9W*pHhhG3DVAy}S3Us!>CG(2ioakTRYk5RXM z!BYy@KbTOACCg^ilW#LMR6h+`Pz?1a!$z66>23mV-22ol!G5+R;OD3xmEegews* zC=Xw70}WxoelX%33Ux`~Zves$GEPN#C|Dex0Y|BFxK-4uCjq1(hQF@?UpK~W?hC0> zv>6soO5%1R=|SX!N6-#aoNyd694HK87*Ir`Pt7vt@wm^!BdZK{A%P_+C6wnXXtNlu zh4G)+8AV6v-ApKznvtndy8-;Es9O|!Q>pY-+y7k;PQ$&E#JXpMdq99DQ-$8U;+(&dpdC?!$5=u8vE$|d5 zu7#4!|D|YPX$->Sh*HIIehK0`jHXEc$3vTCh0>$eVibR5`|z|CzD|ZVh`h~E3_IYq zQ97vrIwnEXVv9(J{37p4c^GOXi=@rKYf?#JT|d)BBd7@+81Pgjs+}4mN<+|hb{Rx5 zA`@@0{Hbtf^1Wg zD1wTmXud)gzMg|h(QOcM5Xb&d1^X^)Jw=D9 zJYVr>Qr9Mc#fT%=|DamLi3X5~NQP+bBaJhr4e8i~5Tq6G{$ZL=d*| z)6f!eA_KRCs_`c96xm}U=7Ttk5gw37w1$esa-;H}ff>e?BKyT}kCETF>ForO`V#Isg5^0Fv#EB0;l^_m68zc!MpimYeO`HdAGQ@JA zi$;p-3w5PrPR;L&VVD_2Dz=(g*lH;IlE!`&*{L+%Yl7!0fg%QPi%0p)o7<-9CL?(>jA9nu1a>a41E`eip29CzXiOY~v6lo(5Pp82B4BYq8&?C4f z3oR5$H4D>`4MMC7Fy-gbx71LL(KuE?_ll{Ajsf4uL-0V%htln1SU)LmL&cD`z)e&m z#hF?!c!K0%-GR01=QW^cRZFKM2{VMNR7&@#6)Roysr=Mf{NJlTNFF`Q)7>6Q4#*>g zC7?b($wGCYKX?~hHj*F(3pOD=pkM~vpvTGwc_!x}??BO;Hw(8;fc|w0@)Q((e-ZK& z6wKX9y)Pf}-?k0yG*R?frRc5(1?QHbyBZX1R8Bpggz~rSqTW@3;Edhq4hNNI*dBr) zg>VJH{V zY%ZjnKT19OM16q-wd%?-xU+>*t%Z4_PQuv~45L$xD3A6jxSNGxTOs8rQ0y>lFQj;$ zh7%+hb`nw=&cPWG47&&^Iv2nSF+5&KnR*eNRhZiJ?#fO`a;Tcp!i_eS4eqX zOT94y_S=M%=&Nwv0>fxm6192IHR>&)aE?Mq(Yp?3CNMlxNKv~7rywvKh_Bd9K-o9- z)Ei%^=b{id!2{4XoQEweEBP2sFk+a4ulYpSQb=E=2Kp+5ece(`Q z@?V(x*@BA1srN6UJlAbtHxZ}i3iE6qB}U|9xIjn=7%fI@#xNKl{J|I3?O@Lv!zDt> zdVA_ULvU(BNHKL3Bf#k3Z-hA%dqhPM`{i=C0)D0WFYN9?9_w%7ydO=4?hjxZYKs>NT+JrXyNe=lJs|4G6| z{-Xp_exGE$e7e*Cg-q$e3Wd^Eim&7hfU^{_Ie|LkDouP(ByfB{c^h#hG$YM{)czRa z0+fUyK0uSykhf|w0X@J_y(zp!07F;I;k+h>3WvjNf}!DHrk^pi6bw@flvRRA2D7xp zkb)iX!%&q2@WarHvA_>Q(&K<1hE{^<)nP~V4>E|s zwC$kwNthN3wDp*Fc^>ThbkQm?O>7~Y1L>kQc0uA=h#xB3zYB8gf`YoBq%LSn7j(J{ zYV3lL(x!gV;2+z69L>609q1;(g50mp(Ox`_du!1C>2AC0cyn1 zLV)`BM5*%t67Pked_=?0CV(6ynv)vsF6g7o{r_r$# zLDpSRTo<$f9J?%$_kkd0u|#Dz%t5pc*!H^91^M$uw74$lU>9T!V@#Fs?}AQ(bD(UY zV5JBm!2!q-ChbsLA%cDYlyDP8>qE8ReL$ZP?ZW^uBH=57v<(1iL(oQmW(9}=qyZ1W zB1oQ)1Sny;h=w3}A{A%_GsJ}TJ_<&uec%;lBy8fy5l3J{ZPq*liBAIB0#Uw%E~p?G zrF!~9z7!Gks048~pD9MbpQEq-C|m29GdbKKCWmiI@B%}b!{Lu$@;Ui?h^;9!Cu#*O9#JFvV_eXL*tEvpSsac- zbVvw`=gs9}0*A|I@dZw7zQA`*G&BZYg~pC!aZqEN*&G22QP_M(ZbTH1#peSe;Ks3o zTzG7#EP@-(!Vr%u@D;El!!Z)V=J5qCOg=_Jg}=d20T0?r5mD(7Hb2Z)z~qOGV@3vZ zSk7z~ha!#xng~O*NLH*@6pIJB2p0T@aHHWG93RPyUA8o+mrqzFOGE&!!N zg9NNeOdcC$g53PDE(CR?3khSfL&F4JD5yjr}6f1aaTojit z1M70DuatRQw2FpUoMi-+GxP;gc-2C<>>!2l6GFd9S+wPGZg6~ux53o)!8 zn9h!jiWc~=z>Xs^j#Ipus4_4POrn(LzqF|TL>@%sNhn9*%C`@KPQ!?SL;|BjLy=JJ1z=x+(Ljq}#{015M6-D` zngH1GC$j}%-PwRQ7sd}*fx>$Pz75M?*pU2?uNG59L-Q}!Ho46EC#crpbDN4n38#?A}s^<^Xmwf0= zFfu3PLoh9b4dVL`MdV^|vPf@GaXz|W6NHiX1vztAPOK0jh|A$d0!s&>8bBf<q@eIfZfvA0%17b22n9lI92V}b5AX_xf06oO zlLiqYA3<;hVW3qM7#k@9*?fwG+eUy(3FGp7K^9Pe@unj$ELLLL`23IBpC04xMXFOV4&4h118b}~B{eqlOeMe<>~ zac4z_B6^&_Azr}Z3sJB)%8~Iz6b_Y-4L9Zj*&L3q05~FF1J?*<9CnC~;9g+Nu>w-l z6-<_~ku%wmf|;&-)FRhN7zR)&KQJ!7}M)Seb3HTx+s13|50ud^7#v&9AC2~7XV821&Mmb>oz)2*p5M*F% zKA#P0iRduZJ9gO#C@xI@XtEUg39vx$#ngQKUvhUAEJ|-Kj0WNd6F3A5W8;u(qUwd5 z-1u$+_PPOfN)2MG6cb3%|ZinjSS&JgE%Y<1aXC}LX$Zpu+c?;ekm7$ z!aMNU5mDe|;1bK_g|m2A8Hg^mpd1bI)G$3!X`IoF!oi71)fx+H#S@429tp#UVcrz8?w)Fhe1Ptd>PZ3D83-6|Dt4A zfdc*HFrXKB8Q0|!poMrTM<-BCrc*?1ggS-l(iJda%|K+V7XaX(89OF+&}5__UV*b= zf&(c+x6zXCKSZoTq8wm|qOi4lAW*?j5D1=#MIEx|g+@o9nVGU=Cio2`bc%$BeQXR) zrluos6p$5sKgW+NU~+t6$Uzb`klKxK=JFuW>FNxN@5zm{4+O?Ax?|(fc0i9-ag=hd|?Ly?Id7O=!tQpfW0vVfss=H9w7?sa)LapN!Wc-Db%zq z@}LwAO~4e?HJGkooD>O}sVI?dg%m9~mNF>{>#mksAAqlfo~P^dB4OCu%?`F9Xg-#rcZY(=i&C^GVLXRjWp{BD%D|LF5qNmTZBI3^YeJyXum~v- z$1D`cM!_xJ9PN2LW;~kID1eH?D42vk3pigyul?N}#iL}nz!>TKAj;0fZ}&72T53i1S|sZm%Is^ov5a^RQ z0wf2;Sz8(^_zGCe2zNHjD7<)Ch>@6J5>b39h$LXTlJQ|j;AvR`Ma(MRV83W8gvlCs z@WZ62NLiUiM`TTEgUk=M%lRm-1g`<@)ecD5mQa>(BH>a(UBZKe=LxS8zAqMEtWMrq zQ)zg0_5#7AnmqRz4To6y@AhpC(Yc@Vk|n{aIQo5t7E;e3yqbazfV}?5FOY1GxH3un z+0eyC`mI+s4pna$wsdQ%oDuhGdF+QFW*hcss@My65uIVzp8xxn?IoqX-tjF4JUae~ zza^IU$tdkhUi2&@jS*D?ht2Ol(zRENB#xSukhcd5Qz1WuA{Ak~U0e$2g;<4ZO6Bl<d<$<{fYORtt|dOd%$uBl&@lFPbY)8BOtzUXmS zVbd!?V$E#e0e<37JnG1nm+b-LPQBmFxY8tU{C&`1EpOwM&52iT`7vI6the}LuH*ol zs&Lx`cGOsZ;FQ#pv{`-gn_kC+#glJINYpzfpY3^QXJE$w8M8YR?H8m5S*6JTgLspI z$t8v4%O}t0=37jxcFwxN>O8wS(>3er*}INqtE6OA-yD>8f(2tBlmExol##(46}h55 z47o*G=iLqt)OWbhWZE%KNmlWpUsBaK>3w$;yY_pK^89YNlRl99eCzV{3hay5x!;pk z?M|HLJkoVs>PFFoTkIjJ!lO6v}aJBmMG$2C}9?N>9{ zq5hGvMuI}u#0q?VZLP@{$&;#?aqLlf6W7gH`=!{Nu`xfTWlyE^-EnD~-uE4K_`Q_2 zFb+ibmLPQci}|OhkS!-InBknAlMVfR3cl|DJbuZW@B5W!8r)ZXQp=pTFz1_slanvn zePQu_+pH8OsW@(A@3E5K>+fHQkXv%NbjaYv+6%_{R4&+RSnGdrPvvZ7C$#NvPp!s& z&uA-ob3xXLq~(ci^C!qC>1!=A4m-4fe0kvgx{!taB8%^*-jT$0ikU#KQGL#%L;{wmx zs^$73u@A6u5j$CB9VVkR5(0bL{@11^knxeDL zzpT0Xz2lXje&R%Tw*h6nA(q1Tp| zb>OGVDS>%%?!=+>XKAd4``x zEZ3CTrG%yTS5C_$$SaHkGLOcW`6f%r98Er+%au1Gwlk}CH~nBGO!Bxhdj&NP$RhsE z&68{yuBI9k(s*Qlb-qm9i$R(N$I?0<*1ycD3cfzX)4bw@0^C1^oe;F1WpY$qBO!8N z;b7a`!t%GmTefLgDS6KQ@&FGX%`fKP*WP%%bs@i`WJAS_6=$Ey#-0co)szz}4Z#uj zPb@x@>uS|UAD2EM*t?Cp%l_!)aD_D0HEjboq<#5%WA|}Gmoe%SAq)X6VFly0F?Mgi z*5GBE(ngSFYaS%k2Gku{oU>sy5m&ZO;%#DhLs-Hx`TQZu9XkqEDI>#zy#ahr7+Usg zHA`DcKEI);r>1}H)|)!-;}^qBhE89Xz0_-+eeNNL%N+`0OT<;2;nW1$`WH5fuY_X~ zYJ2y$T~51}_Jpis-PDhE&C{}JTeI}r5~J$LH7=&_H4@a!^3QHIjlb(DOYQFcwsp&m z$!3#YmBEey>t(Kf)b_dF7SrhX}pV{1 zP7kq$>dsSBcRyWn;C)ZDn-9AWuw%pfH=aJ^%1^uRxqiIiJyo_!Pv_?6b87vg#5dNQz`Vfvn=e{XLY7UsC&^SfcyGf%*X_evdm4Wlapq;OsLw@; zdv)q2jo~+_0YAK3-0d%aJsK-Mlgi$EAFN)UHr?D{#$KBn@scVF-aK8WJuQtnv!8U` z$+28jP%X55`L|}JJCIr1`wcidse;{pn!RNu#Rq^tj zK2`m?Rq5&E?#9f;XE|Y>qjtQ1Y%#DuS2AnoP4D*dZQazxx9FV7TS5j!}Sm0bo!lD z)@1sIeHn%w)*5P(jPi_*je&cwC^THW^mxjOF)!n;hd#U4%~7;Bh*x*N8>v-k25;iB+~+y|s*4KueO{o3w%lP2FWP+mLyuS8CyjQE`QpzD z=umh6Sy?6chm>xoYBB%fNVa}LKW~P0$+SS&$Zu^o)%5~QJ7a84|TR7yc z(wO%QW}1S+3~|hqB~o|M=I-woI_Y;Zu8?^O1Malm9ysXJf=73=e=KcO3hZUrZmKu* z?YPW~jXRtUNsps$;Pf5`JMDt7U;DOSkJD=X)yAZ4s^*MIK`JXkoRuzAhm4tY=$h~L zZT^D}wFZ5ZjL%bEJ&@v$)N`gcKOS}*g2pj^9Ug}v3^jvdsHO!j>}>&E{1 zxl?=hSDVm!sAj0d+`!>M4|{be^4dCzt+utRQ#F97yS>zJ8~mIk1YWkauiuqPCro+6 zySnGGvhTSI2^;xKo?cxxex!uoL|uwq*NvN>-2Cr2XIhZVEq%>i8n*jKC(IwteK?q# z9iM#GxS-=f(rTr4)}^XXJzOIq;I@Gvo;o5(TY&wR=_)eTcT;ELdyRKD^*83k9J9>t zQPp`)g}?BW*7t@KWh2k;hUoC5NU~`64|WCrw?WK&O3pc{x%MQlT%+K%QR}8j$A0YZ z=gj)->^qR}{HEl>gT~W_uE8v>=wK08Fdyw3II&>2>EBjIYh1~yvl7x3+6}40wk=qd z{e42-4uj({3kUnBTaeu8&CkEA(?nGWb-Q~Ue?3L4*+G^p=lhvR9hg#jM#f;UZ04G* zykV{OCzjj4QIlOKSMqk2?09aVFFue*f`>rM_+Z#93&-=~KaJ>`Z)+t|H9mp<&v zExza2F|TQwKcl@qJ|atPu$oS3Z)mj(oNM6CM6<=ewsQ};sDA5#J+a%MA zcXCE^yy>l!%)NaPC#tPZTn9L?^N+1v7eGGyHn95DtjG;w4=#LFSeWLUb^YnS zbh{aQu;BQ_KQ?*23K>+l^+2{t<#zAhyV)x`4$A5=XU5u09lUNV;kF>lux_q2x~~HJ z%nBkS`Mpr=N!L^^`dQhULSp8@I{7b zZxM^O92UMr>Q7rp8?4Fdn*5hXcp06Ub6=FL8pgTW`H_2ej zHnLwgV?!LdyKIr&WQF*bzWuMP)~~-`mvi*RM~BpwyLakU3l8LT4pD>M1mxY}gc>^j zj^y+kUMI-=tmlQ6CDHTG=(?R>xc=nSr(69NyxqIo*Q1Yi{KXenwdtI-SmgfR^WxEp%9%;hCL{ZHBH%Gm3A~`4N?#!|c zb}Q62HovJm^Ugf?$KAj+kDgUKXun&Zb$s@VULFvCpxq8`8!RY(fkwi~M3}!7(OxBW`s}x%OSVh4KUw_HmZ9`X ztLjNbUC@|gCpRcB*`T}c)Y{%Qt5&&LKYBe6)dIs zKiI9JkN%hQ*1hr*-fo;+xPe0$I7evH?imS%_{X;8SdsZM^S>)qo)x#7@20V3?7YGu zlA7mIM~yALt+8CpqzB7V22Z?yXjV=dsol8zfqwB5S=-bDJcZtKJ@+*$E^!^Tq9)2p zW}Z*P>-*Z1n2|8gFk#~e;tp1@=oZnhgQskloXg~jap|>1>r(t*`6)InHyy4oCPS>STTVoG3jU|Rpk-1wP z`lagiSPgU^4tCf>*nc(tO_5~o3eA$BqFo661Y0we@EXWsK8z z)AWiIo*;nJV|b4p-N5>_)owaUwp=)45H#pv-}k3`TV_6#dSThVWXxgyHTla;Ylf9v zuf3=06$#CQ!|#7#l`Bt%$cNtlv1G%RibW^R?n<9-xAuiji_El{>)sEaJM|l5<-O-L)_n7`#MRJ>R-;;GeKCV7xDWAVsiKqsj>pR|A^r*)> z?YMb=;xQbZ6#j0oiv%g^kL1OdNubODT3>*(mFR9#vNc^Q0rSa5*|rkIWtudx32d6iPr)$;dvZ$Q+?P2uetwDSq3~0-b`sq(tD*?O!tcZ8{%) z?PJNyGp@7iW*N3d-)nX55q{cv>DN`gAj0fAJ@>C{dE^$;>JN*Wm-^p7_CZ74)UYt? zOK8rE63s`C7CPDt*zO_G6SGCJfQ#e5a=k!$`Iu!MnDf2y`TaW&R1WOi+!~nZV!ZjC z+xyn6%*c^VTY7YH<^Lno!oK9z*B7IfE-D#+S5PyaH`TylQSo}++pAYUb(^P?|6Jdv z0S+=yPi3%p_^G$w&%A{KGBW6UKI6rD`-$nqyUdhDJ=aB7=6=3BwpLQ=qk6^FOS|Mn z%)qvL{@1oewfugrE37K4CExaTQk9!m$*y-Rvl=f@4j$C9!s)0)!|I805gO;W&9%}% z>O`Gl6LS2m0u(}kL9Tp!#_FWC^LtNAv&pwqXNAQTPi#qyR^MqcCh$}E*Rr*Et6$XW zKe6JI&U~j3cgaU1{botZed;wYZ->s=!ra&%a|LOEmQNF_>eaFF2wUawr(5IDvg2fX zm9*Lj%b0f*hFbpI)DFwZ2rn}o$*7kX! z*T`I;?Rjg-%ba-?_wrACs=0ai7WRxVz3{{SAiOR6NZW6wPa4ZZeXUdD)TXEm8W=q1 z=Hu#H8S=aluWOVGbAqvF#C)jDmOpX(MjlHZJW_0|p@pknhWnQB3zw)bxF>h*>gJG! zIl*J@-)-_yb>^|ChfwkPsy{F*awTU+?De~-w!t&>nAY5bYI$xaFE<~_m~r^Zj6s8s zm%SjDtBD3dc>D2B+}4w?BEtrl-MPFcEa{nDTtKfZmkrjF_dhTk@Y?K)=Y`|v-LkE7nf5VpVce-JbrV{L3hWfFT(aWd zzGEheO#jZT*oI`e7VTR>%07Neq_i;f+oW$ItKbmZG+c`i}kSF%NnL zza6TQAtl4f5T$YEYPZS~7hca@n`iU*Ze)OWvgd~&ne{7;tEq8Tz(I)aYs*KNfx<8-;W*{@pVD z^~6}xKt4{MJv?qwhfdB`XXPih^PePzg&%2FNJdEhDQ_UJ%$yowgxN&ueF;a@Y` zYDTtempFX$NMm>u4M_{W9f)>?9!d1n5PCvTh8 zr}@|(yjszuvB2)A;QR`&+Y&PB419>9@3g=&w)tUHw-_C`;#L5TCUr|$-ua4 z5ytu>*X`T3)FQT=`)Wjpjdu3MPll_mce=;cXkJnk-2v#bq2I8oBTIG-9vN|L+ak{4 z=PTDvN_jABrEiLPpx1?WhOSp9XNXVJ5V4}qroZM^sz+{o!FYb+R{QjjeSJ zKW?j7c_(D>wiDY|TyH(FMOw&BtLw1RKTI>F+|pQbX0ue-lk$Nhxqi&_>n)@0&qtke zHNTlP!k|dn=9M9P5FA_*J#PAMEH99wZZ^113y8lUrn#f})r2`Y9ghOGF?Zypt&g?2 z$BlD;ht3~R&u{AzS-w<(Bp;U?=W{WexzKLn$j^< z!DXWBI2H%aGW>~8Fd4V~Qon)meS1%6zcsS{Yh`n7`Ly0alChuEHd~Lok+}W70v!Bh z;l=2m`0OB87FKLo{I&P?+9vVS78Wm`P5C~0b#!ZXpJ9agpooZG9ja*SVbyg0r#;^l_Cty4d)U$oP!pOQB`cn&)g=(y+~npI{`2FAo1 z>bKs~-*xBq*dlGqdEWvP983;2)mV+#67tIOfU*+xf(CrT<4>HHle5pg`7+8lJ0$D6CK`rLA2+U4|5){c0gLLTGD@ss zEF2auNTQD1{8cG-#FDGottZZEz4m=}=Jwz%XA*Ziwq|NJoZM2LlFQvycXb(05j`0E zcScpD|CqIkGkUdtyI*+5@2cIt-Z85U4wstRT1;EZU8!U?zCr`}CA?b?=cq&*C%-oI zopR)!s=1BN?oU|Pb61(&#SiKquG#WEOp0=W|U45j)5OHqcY>5~%li`xEiW+Wh zYT`N855KP<7HTn`L_J?SI%c?uwTW;K1D+)Y5u@k%(H!09m&b5-`tJ=iOpji zG8IeC26E@K*EfckwwLQP#Ytz^>D}+iC$I1|4fnr$@lmnCbl&Xe%R0P#*XQj`H{cGr z{oQUvdu-ya-DitFJ$rH9%VzkRmoF!;NnJl_%Hihk4!S=UN!`2Q6thZ6a)5jJb$!2- zXKUZ&u6l8+pRv;62GutPodH@`7Kx4g+jyfpk^k$E@8)W3oXr(GnyO^uG@<%cv~ziB zXzA9X#VN{o$g5^kL#~`SW9qm!-!df}GE?k&$=%&FUTNwyn;trDA^HYp?2co5Z@W&d zcCgW2{{F^1FE8KQQ7e)z+_rP?k$$he!q~R8hvSlWOE>nH4%_m?a&_k;z2Z`dCv8cW z0>dWw*K9U^+4K0>RR2;*_1*IlU$*na!+RXeWj>N*sSM0e$PIoWvvFI0%bg*qwbIks zSGIfh(2TiOoV#c(^Ks7F<1-^>%<=ToTG5BSO0lYToAdN&RkPjO&N`Rz+085Pkn^V` z-Q&?w_5~N3lfV>~wnNHJ3-Ql^82Nj>&<-Hi`GyC!F z6IS0(zAoKp&_2dv%G`^Vy2lO#ydV9n>58o9tR=3^H4n~j>2uFDy6t9BVR7{O$iri@ zq!;Bc*2=Dad#$h_`NG8P#PlRPy@5gg4r5^sF>KanBuV>}`v5T1r40uuI>Z;kj>=ja5iQyr4-8(GReeF_@oMpS)pG+L(b8EFdQ+=v))e%nv&&#+zkBk$;tv*jY=m5d3U z0bA_F7Wc~>ADeP9ae$5_yu#MkgIjN^a7?;-5qa26p7VZmgt*{`4uf-ccgPV1o2!-) z>KOwZ`_}H=+__-w6Kl3g(8sY-V@KQC+J^K9V7`0q=#gza*J$5a!H4pF{s&~jE3%^% z2iRQFypW@&5nF=hL^7JWS<{nGODCXaheTzW>j-`!~g z$G}?3?_+#JZTgq>A0IUzIh}p^eB|V?a5eUcw=zeU6h~I`f@2jmja;-(cxLISb7DG= zco!B)hu_mVVR0oeFMF;|osY9mm8wyx&!A@Qw+e?`8cz%;UVqC@<+i69s-8IDY(XP8zE>l~!&e_(!;e+F-(Me5Zul9*OadEP?8K16evchDdSy9fHfa&W;x

dSlaEcFxoc$2tTe;J$^)i+&@sFc(s)gI|M|TRcQzlmw?5-lLb&7i zB_8Lhy~z6ch5JncZ(dG)A2#Zu`PU-NyLKa-q~|!Awz2jk+GKGa28egq>uwqlrEB!! zu1oVWqrGPCJ(bHQ?{I%*vD>Xr!BvIYj#!iE4vFTEy!|K6uRPa(xn@dF&8pkem-=}` zTCA^2**0;*{ezpHYt@>Bg>+c!iY+pC&QJB5*c7|(^tJ2Hr_PC#=+pna!pEU*vvfc0 z9JniGWKY}6_Ac9^q-Q5p>R+vVJh5oQQSZ5_)iVO!N58+&w=lLM)7#8>*KI>y_KG?6 zMA`|xrquK#iz8P4>o>LRT-nR6{FZI?`kf2yk6&p|n4}`-Av<_Z+dxyVIgLjN-ZjRH zZyS`7mZX;#e*RRzK5{^L`ptXdsdl&Sg~_?>=_}nnjeWmo?X8KEx3uX#vYqAHa?kC< zh*)mQas9~L_~n&JCmJF@-hH;rhMjOW{qeR`o%!jurPgNxnZ6cF)vnACKlO3Ae$0~( z&mE1A$DL1Cmu7wST+>5hZ``Bfy#sewte&suYkRV3y~4Ut8d=h7iXXi5+fAIZ&-^EGGiSP`dwD@0p)z3RG?bY%F(rt2&mvidQ@#8O%H;V*& z)@b&Ns;Qrp^z;C4Vy)5JDV6?LoMu+`+WV+9#x_mNa!H>F*QT|-EoDw$zIV4m^b?+E zK>n5RPyUOIQ(i4k8fWrx`Q4W%8ZB#k-qFn(xkrEdZTZfX(uW=#ke=J3Tyku0%?s}> z#ls^Sni?NJU$f(sm7wOzDDBQ9qtOMfH~sXd{0QCLVLR<1&$eFPVA6RT)*|B>D=)DQ zrKHzSo#OMVXi9cKT6CKC?zos;xmP*74|!P)hT(<-*92L$&QKVkeYEvy>-94a_dGP1 zu->30?C!SObME`^NA9w1G>egsl|B5(zIf9YZvBX@i}N^FW;jOgJvORYyYHH$)#DyD_eWYgKKXw7_~5u{yhHe ze$kpQrGRrR-xVX!%OZ{9_{xDs3y3@haXY%?e*am4=>mE!t?YlVcZpIXiTkw?J3!3DnOOj+D@ouz|! z-^%_r!Ne>u+cU4c+~wtux}k5k)eReWZO6=6TL8EwKgheNIJ~j@YYzJMR?nrPJ$c z+Jz53H6Ml)>GvOy`|wno^HjCYlip2@>aP;HgW_|>Sf>t2b?>|ISYCCZ7w7V#FNF#f zo@y_?4Lh`daZE+ld(O@t8s<#XEZbR^qn7!)O#ZxJ)x=XTXNlVs{@6C^=B?8+{~EM* zjr-&<);|ZW$Fwy}#{Td~aL#U-y>hAitJQnM9_b~GOzd$)f*^8zt7g~RsleJ)Icc6N zx$f=C2pP7Ig2$lrdfo9#{n^GtcZ8gMd$GLdhnC#w7s`E%2i;<2-Mwq&)pE?k*MC-H z?YGPg5aV3G1u;&g|0EgdiX8`&9Y$OlenHG?>XIQU=Os6$yX;ap(i}X})%R-=FVICY zPJE$D#;Au8j~)&WIAfWiIK|X`ma*SCIcN4VqrjHTrMpM)-D0IOl3JY%gbf=2OKCV=;i!ivOVl%lu4|UR?WcJ! zrgiHlKi~37BTpCQC4J0Dzo)S!gxm2wub=9wK3!i~b2rPsJ@s(ml*5P9p3bgtI4^%o zZd$cWVy4}^#Xj|SR`&`|+4Z>JxVQD$o8L~&NfLjyM(pgTA?N!RTlRR_cC_M@In+ZwWu zo!MTb>%3>h>Pb<_Q%j!q%uSN!44bPl`uOs_26Ii9m_6^~&%L*F&iN17>n3lzwJR*Y z=uPq>?}gfKz0$$YomGTp_g(Jwk?veV2~ z9h*MiY2cc&ceYmy45t+Bu`Tek+ITcobyV7Y zS4VlDDjQh8KRD42eM@kspGP>Qhka8&W!m+7kb7s=^&*|wzDwuHjaX5%=jiUffn#1D zF7KS@a($}j_?y|4hr@c*9=G}!l6PI>t!W(JH*?_fyflG%@A=z|*UK@NPm-VRpw~Mj z^J|ilPn`?-;HY2>jStjVC17^@K}c}5q{jvxNIsh7#vg%N3oQ!Zww?P#c) zH15LQgC~bX$NQM_t0dPL`|o(Nwj55l_t`PW@npY;H?NKFlq!^hJd9n9C>L4_Lo&!C~_o;d?i~jZzrAc4ax! zsQB*Xq)(fl=%rWH+f5$YqTOJX@$~UD6G!`1b=yWRhd_9*3Y*R&tChoqEjc2{aAAR`(slW5AP~18vMPdspr>L+Y0fOTVD4H z)!ub=bK+dqdF?l~%UvUqZSTjNy(8aya=-Q=HW5C&EX#~taoaQYjGikvESNv5>_F3G z)4VfI=ZD>_Sg>&MkJar_)9PO}Otk4Kap|R%QrkSq>4P8V8%{M_o&N2_P0rpv6`S|| zKhEAdEY4)x9&TKMgamhjTX2`)?(XjHPH+hB?(XjH5L|->3GM_51pk^$=G@`Txp&U* z`zLwmr&d?>`|hf}YuB!|oTB&8H1#hv*gjOhxG_l{GWA+!?yz-UbmJuS*1L!E+VSKs#vKl;g*ECHRs`c! zzU;r7Y&3I265%~S*iW<+7!U1iekfyP%~l%U5Ru5-I*p=5K{A&hzazbgG#UH$F4;2Q zz{qoodWA{l90KuZ6yklbRWYSDpT2|NK)G&z0KTe)II-m>IO$Hv8zI?fl`qU~{E1|* z7*P|BkbGu2uP}QF-%=x0BouXJnd=iOeWeDgkR(?$WfE)hOkraHTRcPQ;4(l6aYC|@to+b*IJ(DvOwNiCKQIG^nyR3mI;inZFII&cMDKqlvsC~4hiW}cN( zLeQ9}Yk!EI82^ufR3VtjmMzmG8 zTzaaQ0u7Y>NN7xS`@yss{02+PU6_H>LHG27aVA#`QTEBl9ciAYpc!p(0~;d$r^mzC zMYHzkB5{)7i+eDpf0{4S@MdL||dp>2)(m3(4 zywBpp-aAuVJ5^hr;l`@jGzLqwoyOA-G zZKC@#$G6t$e#5@ig^W7#5tdZYe3e34V*M$qALr?-^QCj$ zhm_eYu~5bX+H@`n;)(+;X@4A)cw|`KBJ$*L_o~xbmKhx_R3ALi2$Okn&%7sM6*r_{ zS7BwzGfLVBgRJ5E-4hmfuG`~It*d10Fpt@$xm(95fk$uB{)7BH^{I&8n(pXu;V2DB2v#MWwG@@#B5bm4I2ce1#WTwz4ZO zNic9t4saDe-7zN&Cmo9cBz*Be0qT*K$7|V;O(LF^iX@shWanHTIoT(4!+een1p~3^ z<8KUDUFKQK%>3cmb0r}1&zok65J^mMDtSn7Ou`He48!pd0{u9Hq)YHOi@_VZ%zZ6B zwt915NhE*edB4?#33`~-AVo_dtPrc4N$lUxAnO)%03qk9LY|F!Uk*>LWzdpIef1HP z5gWa1h(+Z!rv;aMx~Gf^#-S<-cWX7VB>X|Sa?H)94d8schx;nKV#<;fYKEUbK&`kh zBCW|{orKmRZmx=mc1~kp&RZ>iS45M~Pf9A`l4!SG+({rl)6TQ9PBRBLe95D5REipG zMmZ8C{WNW3ez%cFIlAu5Uif|&o_Cyi%jGU1iKeeR*}4d<{eysHeM9P9mMRl{p}7v} z1TBNPoftAn0*aY5+J_99R%?mH<4V4un3J^f+=qcjZ}lmAQ~j%)3?V3HKRAl{`@Vj&My_-wIkn8*u)-mKN0ArLmx;~p z9wLS`Z;aEU5m7s|A$VUWRw<%Lg0XRaeEkFPO?@$u^c-h*Xp?M^gv#*vmc#R8`<+*G z>?{q!nQ(Z7HtFgfi5eSBEBjCGew?Qu7*FKv$7}2*%w;htc@OZ#fYK!C)VUdLw*S%= z|KFUs7y+_x)P*gTUU`AJYJ$Gv&3()yOpl*0UJr05IpH3-2TY| zq%R{mT%FKV(|-1zE^+x51eqK@d8<`ar?cot1E$K9U{6dM#u(fTveAOuMfE#LR4$Z# zJs8qhQVgjtHemUp5Nlwv)FwMpom}9ub)aTe}gEf9Qk3J2?!U) zG`EA_0he~)EtcY@Q(9u3Xcj+_F_k>~vYR z90lp0azB8qGt{WW!6ppeoNvc{gDX5yq?VEwno3r|OKI08vQjOFU%@N%`Urdp7B|sW z-Kq>_N(imnxzoB2H-B^-4Qi2KQH z9pjVu^Z8IIM*4YQ)PD-<8RVm-W|QA43PvJ{FLN!^S~%V7!lZ>d%g$PhDy_B|#e(m%^zxfo#DrT?R=wA1-JWjvS64b(Vt5}rxbEZ*#*VGg#DtyG zHWfODBCkN*)o8iNtLxR?pj(8zA_L`!y|xTC;2^bALNsqOun>Chb<}U895t#N*RF&SOeLc8F z`GX^@g+@>>)pKVL*0%VQc%6vICn%O=$VzOE8l0?=^A+c`T&q^{<$T_ywn+)2$Hy^U zQgD!?>d}%)I<*fa++cz+n)7g(;-7RBo+&*DBRBy(ARHecD$0}hUrJ*8IP4( zQNV4+`Qso7t6+}^`A*MWz)2}$Wltb4!I;Q`vlxlQVui|(-p0*c+6Bl;#*rz&i`s#` zl@gDAR4~lXP~X?1Ex8vdT8W|JjjegD%gTfryNYC7tuSytd5NIt4;2$!{7v9-$qGah zq`bqphDg_K>AFBSgdp>~ha)&cd_p_Vj@{N9boA0REMwUZ+S_v1utnp=GF3xjvbbRu%WXvXy|oa#p2h3 zVBSJD>f+aG08vzM})n&MD;dVhf@Wjn9@}U?U24uw@=$CjDi9w}!g3({(CHIYl_t6)b3l8 z#uRtl7E{=blMN5cz*Yel$QE0;@x;|f>rRk=3^)|6?18c~h6cbQxBq@l%f%pvmQqR1 z?$cp_I;IFSbQ*%iUBij_u1P`x_eKAcJ%HSu=6kmiu1{+U8d%^z#}#LXx7P{jCsh!^G2s@a`hYPp&M(isJ143h@6$*CWg@i{7- zz!XVIxXmF56I~913^~Z?e&7pNhCqvUg_9E;Bd#hVGQ}wLM@E7e(GD`I@>jBk1kJW= z)Kmu~WJZt9oS+}&BDi1G)9t0+98T%e2rp_FrV;X}uw=kyMd|kEP40Bnv7)@DSC-9y z`##<1%^>Y@&H)!mamo5~Of+itJLx1|MOYx5;8Oz^S~Ck;6q~#)g-Qo$*r?y)TOT2H ztMrLVQVF}5aS$*vd0Q)m*)f@e3|nE%qe@6!ExoM>_TZxWje%p* zEuMqyOAaeIH$D=H8J~D10zM0hmW+j^vLR_m?(7#Lpah+uw@Qh=3P!8X4CNl%s{Pl)2{?M=3FGV|0J zNa>9-YADF@*&j<<9!PD!vrakjTDX`ffcuR_5c8AMG;i0mCx$zCY2H)StLJ7&-PJcN z1h~SfOc#!eWXL;FUJ{=*v|G30JbHfJ?7j&3Ud=XQJfE6a$^B|S@J>y*pC4gfCJTYF zNn6c|>SWWy`TAzw_P9{V&F(I4pS_UdG%Rh6RW*nB2kkID9`p8gNJ_2&Ccn4va(UOO zLR*pdzNin5!qfa2Cob0$6w>d2=@$vsKL$XG>&QbEyI4rReAp}Ah;QH2O<=2)ezT=9i*+dyy z>)?oqF%fi114maHrI96CMa1pAi*WV>S>DZ$u9SP7)#PJf)71XMqQphbhIv=a;GLmp z!3`PIJ^nCfp)h36<2OE$UP+RG)zzg{Ot=MWRX9HWo-hL=P%3t=W}Q<*@;9wv-@wR7 zAZUwK2v810Psxn>6Ci*&@TPT4y$A}ciKD-b=cS;eo;LFXvM%FW_soZQDo0KGNAjoDKw4_N9 zn-xlf?yTapzYf%f8rDzd$zprEa~@)<+7&J5(T&hn*6d;5-%;JpeV0A)@u)WQ_6WXJ z_cVb>b-bQ!=r}sdpnUuMV)YA$#_a7QiH-i`xxQCb+u;afB4I|S=b;qQE%9b?)RIAU zM1<_6$ajxy2Ap(_LD%FicR0HC4+#tc#<0p#@a!>^I$-c*;xCj@UJteJsL%-%|{uAWD`V<0!Rg`R=+SnCk3ZWDo0U-X&l#e@o(u$$DTR z6Fn%DGbTwTs2bJ-hox3gJiLq*CVjWahRv;um#&oHBUkuo<~RpK8Dzi$M)9h*y@pE( zfQIQD6lBzUS`#EQ($zbMCrEwS!fyipDtLsixoF$r)vD&}50tXHAkfx{v%6VFB694v z&_?fKb?L_35z%fK>(j7s@M(8xRI}X*Midbg_TvImtC#9>m&pDtU+s1^zH(CZc-f-;l1&#BJRQ9Dl_ty;}0aREJ3#=*`}USRM4 zvRhxgN#LkDh`98M-YS=sfM8L31&>gI+#6fVlP9u~O}>}8ycp4jJiJz#vFTcn z`o6MB&i+0=hunJvpY1mGyHIg}e$H1Xebz5|{g1J`ETK{vO$w*eHu|m*C8lwibF199j~|XI*%WlX5+I>D zYKCWgsKgoun>%zYUvzBAxq~#2<_xpxHX_y8&Ts?OUFRS)C|?j^_Nh5NffsS9@8J`f z4JVbH0XamE$0{*8JbA^$%{k%0!vyZ5wLZBNO+1W6Z;0QI-YS|E+Vbir+O5D%vi@=Ic?UKEPlt&DnHl1f&+kf7J z-pr@CM=`zfMlYmEfzTWiGsj|>r+LFzlQ#V(c_eUcS7j8PS=jywwdkUtuKk@nA!$)>eRJ}sz-d==HE7cG>L0^ZO z&mw}#Cs4$6?Mu0c6E_DP{8r#Yai#%ZgABO?DoFSgKm6(=(f($?q$>i(@u_HnU2Jt! z?~h@XjFVH(w zCA8Dn%8&H%`ILi@KSp7K7KcrpZ$bIujf&XJO1rjH3uM48U8{|Vsap{#()dx%VATnZ z6V+)cw&lwgVWoJ^^VPXp0<3Ll{d)=SIsLT*ZNL!+)%|Zqr*QDU5ysM3`>ub#LXSkj zUe69csSrfy(iWHPA2P1PrQn1$Sph4jt%yoF-JHj1Ef%g^l{3BT53P6hD z-M;OJzo5J=0G>vBZsM?ujgpMf{sSa@;iTm@#yvLnlQwQC?%ocG@O7?LiCZBO8)?A$ zl{R$|N@{v{%Lem&%ns;$6Iu~#;4rrFtHQc2(0+ra+D9%(bmlid)0eM52kI5AWn?Ug zT82e=e_p#F+Dzf2ONSY1cjXPgjyiAZVBCwFRB@2iJ(RraRx>cx|CB`&;HdlVJFTVu zP{Bdj$oVcwnG^sej^$vAdo-xl66kh23Sr9i6!Z;H_Zop+D@i!yz)7Ofh8_ zXj?))q1{Lz%givt6_p+fWKB6h9Zn)WB|?`SdsgJn5VcF<*G2F|D$XgWz(;J5uq+2b8nBrU zs7wfB2i(#anG5b^sG>N2!`k-@Y{+3#9z#`{%o?Zafv7SVQi7Be8h^vt)h8wrjeqgx=v|9moI+GcX+cOGI6XFnJblH3I!I8ypUw8B7I(C?c0w9a6H=* znJK{(V)gV}(-`Swe*B~X7fTjKTJ6sQlWX99%jL5N^5PF$pe}n$hfv0g-b-cL8N;6| zn{!vcUp4R5X=w3D^zuAx3Z&N(vE5J`ak3JFPj;DPJlXtXr}Tu>_iQV$T!%~ zXF>bToe|Hl+UsVZ;gCoq(a9tus&BTfCX-B}->7R6;1s+92o@en*)j&cmj-bhnIXJ0#CCAa!suuB6LPhS_l zo&F{|v7G@uqwmX`(1K=|8AvkttkU@3CqeW>kRQ_&o@m=w?S$S~O>ox|)qu_g()*I0 z15aJT<-4txfc0mDXNZJuqIt6&Z+ZCQ6htHym@XB5&@TAZPP@%5sq&k|d7YNgLFQ!j zp{dtyUaz*frWVllus2mg(7D3J6~=x%72mEVLu%Mtv;k>G(omfSt0)i8 zP<`qCpq0{t7>o33`!%*dsqdCl@NxeAHa+BwA|iwsM(7de#~OD9 zSrNi2X0h_09LkL@(fc2(IWNg&ItNu^6q1lQPl#la?@QQ{Vq%ghDFwerZm}#?4r||X zO_C~JMb8=re`H}xD1bxvWhrGRJAMnvW4@x4#aD^#({^CDPEJ@GjAJ%ozb#56=4@`G zc22r71f%ITeqC5)72w2b!6c2?*9q~erNyB|KsyTa=S7z-*i6w`M?<&5!5sRWNr073 zcS-+V4r2ac=P831gGyDb4!!K4T?+kDI=bl2L~^-(%SA=lkK|<&J6JPaILg)r-`8q} zLsTJM5;%k(ehA{Aah-nMhx8`UNU@AuuGs5ILD+^!)tOB3!bAZtC_jkyE+d%a>KhC5 zho+Z4JX?qVmhVD@7lM};`;d05M?>9M$|CEHK6#cE+V9r^8JqMtYFlA%;?lyukX25O zkuSLoURk1yc^e7e@#bN&)kDbHvybhJgK|Gd-q zkI|D6HL`3&lg5%#veV5(hQP%Gj_2o~2^v2*d!XcexuUo<7TxO(;bAZI{2*Te=hN3w zCa@@S*>6Op6%k`sh6YOJwQhJt$)DO8R>xj}1~hc^sYZ5Myn#!Mz*U6FD z#~w>EdDNTb_sMhw-Sf#b47WIREKZ|C=mCbDYZ7^Z(S1NTP6n-}mPCRR-0UgFuaoI8 zG;W!6P2sl+l8c|`;0c@Pnz0&;Cr)p<)_>GbJB8eSuWGfy^p&4M-wPcKxl$ukm0pyb zRP3`2V{}98)cUB4twGgeZl#gLV>K{^Q+BG6#KzVy=&zrYeO32l>8yi?tTb?&1$*@+ z!NE+1rtN%j(K1_Kba#C2+|$5X1qH>CR*ZEKnKRoc;avb*jhZ}xp&MTOj#-&U0Kdwy zy8rvB8oT#DCI?%D8d(<~J#-ahioQsT1@xof&VQYfI9LfWU&!iB`QU?m=OQDYw0s_N z?RO8pT>A8mm|NtJ`JsO z*07f|n_IXZNmDPTQoP_;j>)M0nXLl|%F2k&=!jF5bD-3X8>vLYBQ1lKAX zG*TWtRa^XJ4f05S=_6`=T*L~PkqIH10r-^Gq4w7~Hp4F4lRIZ1L(MF7WA+9neSLy?t|G#+NK&K{ImzsG?GBP`b_4 z9kMHQDYEVUx~@N?G8ld%q8oYfwU1o7+PK9`x~_q$`UsJAMruPnQQs@PamucSz0TjZ zE!eKk(z&@uua@b1;For|MKp&CVO(YMe6K|eFRS7AhU5ifKTo`cx2Fzq9%#aU^r+Uf zPLZ6C-ZY1|7{CYUbzDNkzGuOK+vnZ8_vmsPx29UrTQNZubz?VI9P<;gi$dvc0U;9- zg?^W17{7Y!s4>^BQJ0RuQdj$)mo)iqP4FLm#BZk|WcW)({Lhon|9%>pRvUx=rrGaN18B1tVXL(1N#p~5y^&mCqP#8o0-FTA?M5m3xi-{;89R*$wG>m=Pf1*p zmjI^%#i=0lUSvD9}tjUbXkaa3NIjNF1W6!W&Uah;G)~>_45Ln8RZf47kK@2nyHY z>CF{3ZKoYqET6WkaxV0(l}#u&-f2@h!rbdKk7Tu3G$qJ?XPzXcG?a_c?4l$F-ple@ zmA=u`%MaJ@ju=s$tQV?xoHlHH@`r^OD=*%>4R_U3SB%riyE0%y#?IcL;>)(5{Gs1L zx$H@?NNJ1SODD;(Fxx>$eUxBLRWB(pS*J@eo@->ERC7GihvZYGASG-agHtPcg>)** z4c2LygN3-)Zn}HO&H-)ysUbZgCg9|!E@S9hq(qL2^iCIWgL5P1q2*()QIaxOZ0@p? z=1nZzbFG0;E|JQ*vy@Z69KkDT<-4XtRu9t4&GM4@X0a;LIBHP|*xRiPpZ1TA^ofGW zBq znUZ-uGx2?`6AJiFn`9`^70&*)JXEf)GmNi~E{@;a*MHZXIVtuKQJI-TDBxVH)U2xP z$oR+}V_q`f68;F*J=!5@djzX_-R46pwC z8DlYrd|J6gR?RC&RE^ugRZWcyKcNg($XbX?nt|5H&_BmT+(SWyKEuGxyB5~MpO zC5RX{w$NiR^m^Msb?S+GIMZ?xph*M9teqn>y}7xWi!(^uJG^|2fnm2t9u6!^ZJpLt z!athCFr*hj*;I?QND@1&0;m6hh^f!zW(XfCyeW&_YaAb?E7q<4osIW$+YUmxf!@>; z&VU!8jGzhu_7I%VUH}4PLN>h0?OTGCj4D1#uaKx&_u6tv|EpxH3gs0x5X?w8)IMSo z@J9D51%Wk+O-0_R0BSK_o5rmMJFTP-VZ!**REx$MC=e|VdeEAw3dA|^z3-Jp5%y|I zcCc9Sk+gk{iQEcF+hh)aO{k%1zd_~ET)zQeW!(gvCnWyf$)K(S+VZkNAW4UrmA zRGFVzW4%fyCV4{nv?nobfW9Cz%#sxD{?4TAHn7A>+$}`MgtTuV7pZbV(y{>KE$@a2 zLnby6=T6Sv4@HR$;JUkfpnrU_X=s8C&Obq#en%2YOGYqfd*X!2(r&?UpvfF+KHIAh z;opU*H4AFOxH#V8zzySvXM)y*7^Mj4qm7s#XB86>9Tc1}f>TpW#fVPBxsR$Zo1?Gy zTK9={%4o5ZhAJanL6mlm?;pz^8tZR$cR{an3QYR-P(abT4G=AN_hfJ{KLruYLS(e|| zoy#zRm=2o~5d{{Uu2#>R%86tFGu^-oEjLFE0k5c3xmoqZl8UWq4i79u_TKe?kz5^R zU55nmT=|Ma&!B$Vg`yW9I0~r$RWnn2`YGP+Gw6-Tq(}2oZ$0vfF~&mR?;A~=&o`P> zQx|oghRbd26l*VGomX?lyy9wpN{TivKg5oQ9fZ)uAS@sq35_AARtD5Y&RP&5>_j=m zok&`bd3`}yFr$9p6Aw!o7}?FGzV2XPmT&no#&*L`rw}#h({-y755}8ZAjCwn&L)pZ zB*DWgY5h9#b9(?YP0o^6ZAU9U6kO?-Y3GNyOUbFJ)>soY>;0=FY>WX(9>t#zPiRhT z@$WM~XsZO_BQ_End_X^lvEy5Z0f?S6NRP0h@}66^a0Qha}hw}Hk)P2SJdUhl>kL8YB-W60&EE7I}DPbh|e zvk|wLsPfuX;*|Xo#rusw#e8!@PFd^F zp>^eH4x{K4{p~&yPPf$@pJ`L224BuMvFRyjSK*tX%bk1UH6N~A$Ii)=H#;}yV#JP7LhHPpnf4Nki=N%3h-@ zm@#ikd5oM7F8{1-ww8|r8@RY&(s^YRyKQHFy-{_RE%F$%?W(%A=vD08poDocs`&Wx z;lW88Oo~d)7x)@)N70Sp*)6m*$}%cy^OQQ@_^k_2lGtQh$W31DHaSwLue7Bds3UCW zY0RH5IahW9{&A1?2gmL68#VZj33#|F`_;kWq;;iHu8BllDifCMDE^n*nA?q59;4?c?|84d7iQG z&Y`-V9AMhC9ELjbb*Mjb6l#%{!sHQ zh;?=;Ffg6l4|h?FNeao>8}wt6OEKx|z;!4T8$j6?<&9p|j~2lMU+BEhD;<59o82gA z`){Qeq2LZSMY_q>t^L6Ik+F}iGE&z+6=r zwjE-l-C+wO*9KWXH&AiZi~66b3S-&3eMhx>@^>bnhX}Q zPpa(RkDQAPJd1DS2XEIo<-N+3KRiNl{?jV@=br12>eK&zayio>lNa&6+g)wiCKYva zUVU{&dS4^B>Ju;XZ^T9Ib(2fa#6`4o!)rHXFsa7cxWIml9fCH zH$CHiLG*=5Luc+XJ69x3%+ga8)!J>~J^oh$VKfet^!3$PV!f-69-#gEJ?ODHEy(#) z!#Ne-YR$=D>$6}kMPxjim%7=v7o=#bpy={MqR{#DHusXqWE6@?0#_ImANweT_Q4Ux z^TNGETz9bInde)f(vac>`*^1H`KxdQ$Q4-FN?s|H%k72xH1;(HHfBD(e^n))dK<9y zIx1+y-eg&R6TwPO7y=x}&6g0C_F*()%p$9bG+}Bcj7_jBo%hSz=v(dh({yR~%h3M& znS6>?Po-Oug{kGYCY&_ioIc~If+^z)u1`FnS;X7tRu-#poFALRcGw*RJGywiS9Qxg zVO}gfw2Z;~=B>3S`pAwOoNl?vf3gy}i}hnj7cI8PeAL~{6k`f;Bd_K5%g?XVDe~x> zr4HtYD^n7iId8C#{U=k!80wFWaA%D$S8@?m+Dy*+n5`!~Rlhz#{CP#=e@%t`HUl6p z`5)T9|Ggo&vLgGH9=jp8=ZM9tv_3{mE@NX(qv`n6&;bp>^RE$=mYNBW&j@nb0nCRe zt_()mgh^ZhCow!5Nyb>MB;T!Gk{8 zM87 z4|B`ekDuv)FGhV;ZD)JZRMycpKOj}p6TpzxZm<$9pMG~dYA5S^3=RFjm+V}t^Q3R4 zm>0H#k(zk8Vt`?f+DV$W+Ic#csfQx=-f{H|f+4>76&muP42dgZqN()8@sDqWN3>+^caJT7v+VAzag}3g zCUfJ)3DP~+7vA@jH%|xQ@CZySs2UMNo>#0yb4Tt>Nx8NDx(bzJx5{`Sxv##l9%t6_ zQeF6-4aupJlj&B;c=9N^4`lYg+DEy*kl|thSF$Nnj%+jJ#639phWL+*g}k|`%`ag) zphml?!+&oh?pny`TwvvMHwGVghaY5zlHAy@YSf#2I`Dv*{CIgub6~c#o#x03{d0bR z)3ucbzs+0PzWmwo;!E0u0W~B~bki*-(~C8Z)>R_pH+u&)YWwXhcy2QdRee2Yx!F80 z$qub0rKR$Gn@At^V42Y;nK!$mHT*ZeRzbjSLh*kJv(W$i%SN1)WIyNm5ZVX>qwd9C zODf(-+9-J9Pd@l0-|2z_MFlcIca0PlI(zKUzEH(5_fCnKOr7c{Uj~XSk3GVW@;RbR z%5!JGTlkSY#Ih!)b6Bh@?DZy~F4qCI&ET=Mf=7vRDzVumvRJzvdqsL1nAeWM<%%yL z!MWkZl}<4G(o{5Q2%@glU-ZcmHd=k zj!7}=fHV1HF=T^gJEUM4`N5_m!Z=xpKQ;`9olJ%fl|49TKzNyJVP?f-Al&7QO;n{V z`AN_cGjOoQ?f%uj2XDW50-srC|6EUi%*alrhR(keeE$!Z8$2VB^`XxacX3cOl3Z`P z_(doPbL|O>eYFLEd5SS$p5oWx&&`LhJ>qD!J1K8iVqQL2MS-lulAvzfQL#f!=MPzo zW5C0o>KT&P5QQbP?K(8T%d@F8q%fCL91jGff{-|dL%$F%bQ$6*F%;3&C1z#ZJguudVn8 zn3tOKJ+a#IfNl_y9DgbAwQ5%{LAbX5ie#X> z=NW_35JCGijjM25%BR|kwf9~oAEDj1KS%*A0@Rg%HsmRkfh%Vu>MZDzZWXl9OzD8= zIwQ2yn>(}0WsOvQYR*0oU$XaJAyc)}whI)99&BVsHOiwC1SQBhFMnG`y%fLwW7p_g4^Bj>d)# zkdR#fZ#_5=0}y=>MGyoKcn~;H?<`R73{dY>Q13)g?>JEJSWxd6Q13EO?^00j5>W4A zQ12p8??PV{pxD>*IVXS~p#M9)P5tLb&-|IR)GY7m8JJk;-_udD=&>-dvC`=qG3XgE z(bMX&G8^hM8XC~j8tT(AG3&GH=`*q#G8*aufa(UujzDch06!t%4;^c2ATy;QwZ1j* z_!U6M!T_*#bg*%Bpf)$PG5`p;TIpJv0`*5NTqR7c%%4eU_3U)*Tmja95xxf48Cnsh+t=<#;6pm8IpxpZ{QFeg2o8R$E$5 zTUbtzS3ywj`2&W(eZcf@Er4hKFCmP7Yr#bKwWa*xX z{0;3~e>aQ6(V7F`Lja&)&KG5o$i)&qNq}VIy)yZe&Xt<~7eOk}tbpPuHoErqzj5Ea z`3(WyAOH%klI6)r3n9N5377qG?;xOUzqbRvL_0%$TcA2AP%BN>@|i5w{ymUE_ODoc zNC3m>?rAYwkVLJ{P5_Ym>00zxS8Bjm!c^~fQwrXoJpc~~pjeS3z48v5FSPo)Qm2YK zRLszU&ra9W3P`PLWo7+`s?;At`!!DiAc0y;4S;nJz&1&qgSC%`XtX9H-q-IBP?FD* z(K6QdKrPBYp3}pn^%fut43N9&wVdL`B%Yd9F(@*F<@c+hyrI6M9Z(1AcUy+tgPG@t zMfhlB#^*W27sDGf(-Z!MM~c_cz|{J8qkj8vMF0;JpfVEmHcX^fEX2dZF&3rZla!LR zogR=2_K$AI@Cy~6pWn(zph1J>2#^1F1I$#PeEQ$}vOm;?9D!uCz$N21WQ(Xg5x@fq z_>5R#dL$4a(z%N@SIGsGM);+E`2JaJ{&!1R?j=n?)?0vw*BdOD3~9bJmc^UM#fjM8 zE&mw7=Tf}^z&bg=3=8E{vsFU4rh6n9vZy}q&#wat3_N@6KN@2_e0gB&ze_pZ1F7H*U-X6X37OvFyyOETm zB~aJ^NSgacXTMr^0RUcYnQAm3-IA@Modx4-a#X)t|F4@B;FTKSa`F31HpK09pSw&2 z^=~6YGU97vNkHBH&X)XdUjnR4`ISKW>x2HF;IawuMgS;})N0x|MTuvh=&Wt)?(qMH z{+m%qd)H0_c)$SXN-#fgw0QsPzy_F^{PUMC6Nqd+ z8{g_}Vo4yUmqf^TCA;Pgoab+>ilxQxUlVEjIt0K&3qVg!K!l5w;w`vSRQ}OziSn0* zz$M-GcWaL$dhcgTnIkqe@;9E&nUA`A+(HD@WRIg9~J_w+9z?I2%z*IaOl7l2H9EtD+#LB?V+SEWy>Lv6Y z!^sgq2Lw>#J|lVVt1jIlr7ioxsYT}{)YS6V3w_ZkHbng*APW@0_5!Q*U{z$`o0kO9SE=G=41{Q`du-!ZYlK`L< zJA)-IZM?>iuC)J-jsH1^`UUoR-FSgAlkmxTUhv?uGxT?c6hx{i;V6-3DBk@Q1r#E6 zcveONihTWP9t&Ah&*LQI_(Fk-;2@D6=(k~odc*n><@l^zDQX3b2VQ`2;QH&HXG-fE zLZht*SP7r+L{rnzR}%jL{HLnN3%nDK{P{Cpgzy3+P>)eOh{LUHqo1|?1>V~3<*=;rN<>^+uN1Hw`a9c0hF)IYS$3JD^Ip@ryno_8OX=`}|<|S%{Aw zM?A1%+D&)3UjDCe0aKt80Hxog>@|r`3$C1w%~krfE9^SreG zD^k=F7+(V2(eGIG1%4GfX7{=0<+kl0^*8qt)u(u>n!Y3}FYuB;-Gmn?r$vKEKo=;0 zg1NviH|k8l?``n)TNi=87pP||l`u5c)pvb?{cKL)`#h-#gZu|^A0h-I8~O|^Sm@pU zhJArTfJx4M9_La5?0QY*icrX#JgrfMwZ{%a8^&(fbcoLZ2G zGteir&fC)bEBaUV!_@8Xi;n8s^MvO|%sjri!>Efa5#)I{*+H3b{Z}whAP-0x|EJ4* zG4i_3l_7vPC;&uzaft2%Gha3W+-6g@Kk^H>q1|(Et_xIZ{?C&|FaWpmc?@Ka{?oc)@SPi8{6skl?jy09mhpUQjJA=fwut$goZ$ARPz_m;t9sH=dO38j}#az++CRlmSG*a0Kye_saUf+%C2 zd(A2(Vb>hpl?({XVCrvyoqU0G)U$VZHjWqLWgS4Ae(sZx?yV%Wkd9~&yfb7B4GQAF zBY(w~_Aj81A7uibp-CdM{u<}7QZX0|+Ox&xKmH0;FtmFP&tKrk?v_FTSs(z|>>%Bn z<~IT%8HMk*h=_>)15V}-YkUEh0@u5E{;f5ksi)`<84_hkn zSmp31x8RiOlDfQbtFz_s-^~e%viqQcQnZ8F!H_Px)wxpV&zJ$IQS}nxv;`7h(1Iu2YO->XFcjt^Ayr~a- z0kH(86JDV1O=kC=e^5(s4b?ZZ3(@=|rTWB6Gs_n!;2!-2C^jsm^4U&&5G`ZpjWBo{ zJOJU#3w7r&K+lov|Hs^$$H#G82mUoZjh?|^Fc=JRpM(1b0T3j3f&lOPz9dp4A>QHv zQY0lq6oqO~c4YaI;xqCQABybwknh;>+LmL-N$ic4#97vHs*Z3=hossmkB$OURjfUYvqn#ZAkpp z?|H=^xZ`t}+9d>pIUm3J;J3afxSc%^`{!G|-`n!^kEl-w0Mer^23 z_=UMO{NAtqu?#u!`melu`JP|g^p-z+$1C6W$KRMEHfU`JPu(xpQ0fs~`)(5C*^mF} zUrA?vT=MzvR+s*C&8O_(Z~Wdj9rupT%&O`RfpYa{?SGR>3g7yR`>ws=*|pF8TizE( z>Ob(}zf;Ma@w{y$_Rk`!Z~K?;Y#ZJB#JXEMn%Dl%E%v|tJKu-5mCdQr;66bFMLT*@W`=`A8t7K=(=Z)zUw19{zvnh zW><0G6qhV>nfja$cXfBaC~g1YGjDm*y@_|Md-h!KkG|0~l9==1hC_3{`Q`WQ`vW|X@`t!a` zV-H>&=ishD>fP1zt@}my9rN}sK@G3AcQHx;f! zgpLzg5;ygxJU$sU#f}p(+uh05$fK@lbhdbA$SH}N*^_X3?eQ69chO?zhN%GK!&meaTX)rTebyu>b;bohSXS-84f>BnKk zYL&zCm7e*tckQVY=Ps1Z&Y0esaJ6n$c6cA#>}$T|qu#K1#qHNC>GgQ@ zreGEx<%##^RBk{ob;D7?EYOtY20sms-t`yHT}y=77&S^p<#L=;C%K~Ps@%%0H%6xA z#-z=cu3mfaI+w1GU%Hyy_VC5r4TYy3i9FX6`GR@VQu)~`Kd0sAG5L8)em){Uzac-r zD?fiCKYz#1n-|DWo%}3`Sjm3#PWd?;wXczMOn!X%(Z^@=`Rl`;{QhP_e!r1w2F;f3 zbPG({aiS*T+;mI{61h3*I>S6p^0zY?gIL(#dBE$&yS?CL(Wr?DG7h_wg=UfK6h?M9 zri?EPn`k4ZH*R7k;@)g=jag)0?eb7TH4CKH-L8{1OC6J(UA42ze#xT=XN&!+q|pQR z4>a9o|GTCa>~}R?WB*c8XPf=0KHqQuF?jZkrj35H*Pdt0puaL2GlQ~@@|}dNBd6J& zs5jA@hg?%_HhN}3YOKr{)8TK4<_Ckxx|0RrP@~)Y-CF-+{yiR!x2T=+$GjM8GvS|; z7iNQh*}Kdi_xTS+J<}l#4LDB1Ty`hRO`SZp$>RxkveZ<_V*`)Qg_6n5rrP7Nna9Wx z4oo%et~|P?(DXYdWx5^yYEH|K{M9RY^#ZQ@U86mDh5ug9qX(4<=k$Ca&7BCsH5#Tl z*_~nbw#nbwRDX)U*GVt3>1Ih5W;!HkDe3h;mjFYuU`U?>7A$nl0#oe*iljsTv+>D< zshfUm^gyh3Dc2@HB`!Za#!aUHCF?jblkderIYG&Zn2Al+B}|DoMp2KVT~ZW)<(qy1 z4v(GyEPnfs)(cMa89&Z8m#VkX8TqM=^3xjKmN2cRBVnSZ(&2~pJ=$PBbh}JIljDHO zd9)Rmhl!boMtyM1%J^iy>2eK&XA!t%F{jrZPZ(y(F$GS>H7)LV)OZe$)lP=--uCE> z)1tgR=#-RD_+n5vvQ(-}%IG%4ZMpL>&;K@?2TY@@q!*nipshqaWk!wBr{$2vj8#`EcptVm|@Qp zn^A|Ko$@m*SX<;WXG}-R+?Qu+oGVGe2xqd_Gwb3z^G(KGN>%zg7QO~YCLx(+iJhKI zLFrwcKiS)v83L1V4@@%mpSyszPM`(N|dJEHQ_ zEI%vm1osFKTCxa`LNE$Ut*pFO2blG^EdSL4DZtg`#$D6uPB=l%dLb)?4pL6iyE(O~ z5Ji7WG##yR%zdUH;pCY$-efTgoVv=S)&^>g*pE4;#x%-es&!cdjq*C*gX*&oynygj z3;Cd$jF8{BERF&=2tQ5k64rK}Ol!>4#;*!vaq^-i?&LyKl%PPy>87W7V89s>-kA48 zo@o-=mysIsOqB+ z8>t%1irL*_$E|5>-B1MLyD4ZTe>s?3T2BS#+|6>$g zGKwRN;*tZkQs9s2UoQPy>mp}7;5xk#`)l_M7G`Y+@Kn?RC$O}N7Ie860 zO~6VKcT(4JUetBWdJ};+0cK&kestL*MOb0|cpW@f7pu$4tpQVI{>}hg_ewr!;}jX^ zMk9!!^ivl4%{b_r@yH6-IG-s7D_-bl?crxksLrWO-OV@zAhSD9CbO7M9P{g=Yh@la zrz>qD_6>fUTQ78nl0w2&Qd5~~v+FbmSisjYzP`^NR4JvvUz(8T1^zNk^Za#*I;pRtOS|q&k7gzgLEeqyZ)(m zNt6Dmo))nGto=tP5j~!S-?u#qbZg^u)X6@WFe{wGI#bgAvf2g4yP5G)pl*8{m4^LS zMe^f1XAsloi_E|MukWNgLeUqOluME>Qr6Ry(PW@hlaUHdI;u6v*6xv#*{oMpV$A-w zXay3P(+31umGvIn6yQmT*5ZWLoYADFT$9xmn(VC6x=QNc2F8?T+awt&^6t=JL~B4V zxjawwS*h}SzH@h&tO%emRHl6$sMMsqxUVj!_k>EH+L*^L=T1JDt=GvN$yeu%yUge` z&%QkJ1*3y`_F4YA8+Q>1cV<>eQeM)hPo?@)TCS7OUaMHpc6@{uTe-7a$bVJoB|=`jyWnU4OKut zxB}thyDN<}Yif?>Ayv0-BP%+2)8iCC)UL;)#lpyvLJpI{HH&3bviPg)tD^^_o(43$s#hdMWdirRsz`mE_#jaB#>@F*0 zt6GKz%@hG2_Jc$eeCXb6;=?lgsVIwI82lDd99cpO;wBY2>6ji9@szZ*+Aj}EZ&UUw zKn3!o!V#RFoUheU8$Doiu<7pLHNb>0yQ=BAo;xvWI+ISZuy3F|zRxvPW^;iltQuo> ze$#bUNFxaifl(7gYUa=0wdXEepQmN_-u)oydyn&TH%!&Rblx@?v)`R)GaFo|CmhVf z(}T&(9*khal2t>B6q!0nl9{G80<1D5t4g8UpiZ7y=b8qzQV{Dw;e#FWSS2DCvTGvg zxu#Qqng}R8GoCYcOj~k#_u(44dWWzX(1!W4V!ZDWfmu`m$IttozLRpLp~`DlL{kxj zgHGT| zfn*}i3f{oFG563v_n5w|o_?E}ew&cDE9;EuYlx=ICQ(vRoDpY(HDJb^iR$UXqRNgf zKr3cFv*=lErS9aedOq&w;}OAz77>z^m%;7RW|a%wqApb|*SZr)5s~A8b{U=6;7JFe zlF4JUD8jO=F%_GjEVos-+MA3EHB3t*F>IE6JeQVq%9n@v66vnMESHv`PHGQGi&=%4 zRO&&m4>eHq+?|bRudzf)uhFFdX2P7xH#P2+B2y^_7X)vtQbG@$s{yUnIwOyj9jpeH zlhuvJjM!I1XM>{J13^M8*;E7_WQ{HEC<^&tE>6n6a-PV=+kOJBs}}VEvEAt+n59qM zMU|2sxjj(-Z zWP{fW?JnH1BxdU4wJMAXo`OQyrwhc=rD%g$B81fg(D(E)s2D0%UWDLbCZZq?9FZM^ zOmmvNh@J8#dl26#bXm&O$Ke$E%|r57Clsq( zbz-1%>~r?@-Y_EQCHqU!g%SIC$1IdJ)M^ep{GdRzMJ~vX{j3WvY~csO;F-1p`)i)@ ze_Je+iB^Gz*=B#;Yi;9C?CbV(pc<&3GJP10WCbk{+(NI&m@;>=sU0Q3ekZQdev3O% zE;dv+&W+FbY3+F;+XTGF_E2v43CY1PlK+h6njG@?2e2~k0-k%`ZWb{?Hv<3Y`^0~C5=vS!>;<+zQdZS^=^ zuMrq<>g4F9lcOge7(2l{?mNqzT~#MQZ0BWh16(cIGd_NC=fjtf@io6tp7)GjIHgba zRr5qqLPx-D6ZYX>eN1w`k>dBmUzxft$sgD$Nxo}e5$iN&n8j5vjcJ>A&Ks7!?STjq z(zKWqO7-M@r|)@9d4><|s}$QZ`H+^5#pGy_@JL zZI9S5sLr3YUsRp8p#UsJ9Sv05nhZV<7D?%9%?y;fni{p?H`Xtg%(h1G9_wby>H@fJ zRXXaLHCUAc(Rju$m-80RmykT8-F@uFoltJ;hX2>XUP8AHY-pk=(3zq)2E_h)9#=|o zOoz}B3_<=bU&uEb98=2Q#f$MysPV8|bUg;CrH6yk+QPb7E!4h53q1g7H{TrKd;Tsz z#5ecCVtVP}(OKVX58(@lcGEp9qKESR`B~pT7<}(7WYQj9DoN8LD?+j4Y_Mz@q%OZ;R;e=K-?!H#z4vSXy;9UA5b5^2H^-Qbb$*{GJiIf7 zFk5}IwSKWNB_+5|Ri;G|MVED*^58KP9;<6q;L6mhOjc6YmR@4;$N>IBj;U1nPt&cN zCHIBvGuhp++tPl(u|U99>?A-|2fOS2g*&h@)i50%Y`l>>S2daiTn%x<-JwDVc5{RLXmZsmwoi!)J*_<-~Qoyr##E-3ia z?FI1y+*VM)-HL3BdL?+UO|*BAAq#lR>^sTEae@g&Of5RNv({2vpWmQYH|IIs0_%^{-)&x%b{1rEHQMj z0u8t5-OC2Plkz8C{gXgVaJvOVQbD(vlWG?Q| zr^Ve~!AfJ6_eTq&cyZIKfWZntuv|3N{TS+oSp{p!sCUJ}j{nJ>XbR|G?8YV#Ex9tKl710CmnD`_ifh69NMXgm#LjE;q1+0ckO_QEl`=P zu%uF0N4DB67I0!oHrWRL#z(0%O4~g97y8lWG1M66e}D~Z&DUCMc&IFrs)~AE+L>Z{% zxKI!*j%v+HCdcLr0Rlsb*hucizNEvw4T~k&blyvBBrPOb?vmm{)fE+iJFX7O`;h|8 zY)xshH>pXwK$&+F_u8YCDaT&T(_Hgj- zQ8i{XT3ibRh1z8&`}mwZ>5wXS^7$aF2w4K@jsKYA8=a55gB}FK0~!;c$_ZI$2#F$xDqA!}rh_ zyRTH)EMabgz`k)dpq(BMGue> zb?xjp8#%(-vNO*I&s{saZ{qT)tJoMeTo?;Y3l(=MpiQQ7FCH2{PsPQAbzeU9;I)bA zs*9zv4eU+dA-lH5PMkeO9N~P1Bg#ru*WHX=^P{!oy(0?3zVNiKfr+zp{TJTpi*4eC zPx={2zUr4r@-1I1PcMAmuOkVp7cczGZ{*<%QNLA^X1`OCRerA|+x!7Zj`~a5H^ciM zFM?}hW+ZM*r0eryCWM96#$oIa$b-1JHybzpc%2v9Vw{o3+Y+&@CU4KV>tHqNbZ&r{H9O?x&gqx=__~9agcFEHk$wE& zGFgyrQE$&qvP!FRaR%^n_limYL>A1%85AZlYJ!DV^1i@v4f8QoPV%K`saxM5tfi>| z#iYXQsNZFr2Npy-O-&qF_6s+_>JR=TakZTm!#H zOmkw6eZrk=F)L6aoDtV)Ff|E0DgDR-j{O~nFz@@)lbHy9yk?19%n!m{vvC53lxkt6 zcOv#l*Es?zL$-)%jEloBiAmE9!*6dd)8$Pj&H9&ot?`-|P*v8j@7zP2%Jpb(u?pkuMfQTGad zEs2Tgj+?sVUR<_Vaq&t!W;g-H^?8$3X4G}+#HHZU27mExlN)a&MA@BKVmjgyj^W<4 z|FGAXF8i@)Od{qxBli8ClMOnGM2iqFKgi#OW}WmAC9Y6nd&2H5l3{2Q%Nz%>%N5Cd zrjN+ybNcx1upcWDrrd1x2;kDsR=blm!f2w?M&?d;LIh_7^5_j*_GM;w!fZ^ArNlhN zG=@&MMt341=A;&+d7K5&iCoeA)Oj^UFLE(OXGQ8l+?N7`n-SR@$1`#)w$C_m`+q!5 zeb+07;0^f+#QXb2;v;e>w%@of^NYPUu&>6iLPe0^2ZE~H$yLs_8V5IUd@_xfMoi{` zN8XA1P&~?a`zw~T93be|ABo1C?=i)_6`~+-Q;

p0fz`| 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 literal 133352 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

{jeovHHkBIP#b|GwSSZH)A%xw{D^ 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�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 z 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 diff --git a/1.4/Assemblies/System.Runtime.CompilerServices.Unsafe.dll b/1.4/Assemblies/System.Runtime.CompilerServices.Unsafe.dll deleted file mode 100644 index c5ba4e4047a15b3adc61340c781307d9c6e89413..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18024 zcmeHu2V7Ij()gYv^bRUTN+>EKgcA?}6{QMDm5zcKLVyS)m;@;*Lgb=Yu_1~|v7lb; zT~S2E-g_4-7Pz9qwd*(MB!S$k-gm$M_ulV)zwiAIp4pw*-PzgQ*`1v^F=%utq9TN7 z@P7M-&>l#M$DM?K4GN%G(`=t6+M#mRd=D0Q);uDWE2L)%_$dNb2A$2~@%SQoB8M)> z;?cQ0x_3x8J%gXbVQ6TmT1i=l`XCgDQPINyAxqX8N(ea) zA$3SfA#W@#`dbOTOLVfjGT?r44H+U%jtKB8y#PQNIaZKc{-Hzf41rL<1|lh&J7g5$ zHG)^}aR=!c0!}&~DiX31G81z^@`Xh9xFh5#%gfR&#Js{o$VNd5$h!|hLv;{RA*tOU zlrEXtZpx2y2@e^!2i)nG@^zo-qMNH%UdnN3(w{PA!Quw8Hi_^Dp~hubVA*Thp2Dx z1HLlapV|}TAMusaF;YEAzEF`0>q7$sMx#SfRkR_-DBB7Yvd{1Ft~Ji>o&!?%Nm(T` zb9rq*WeR3~NrF`YunNXkql`2HFHQ9rRi>0d(suAkVS^iR^|`y<-_ z9H&ww<+9@p^c9n=2eHE?574MTpee{`UF+VfnQTm~iA*nhk$Ne&´RVDkZYh5I? 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 diff --git a/1.4/Defs/GasDefs.xml b/1.4/Defs/GasDefs.xml new file mode 100644 index 0000000..6d2ec84 --- /dev/null +++ b/1.4/Defs/GasDefs.xml @@ -0,0 +1,42 @@ + + + + BlindSmoke + + 4 + false + (200,200,200) + + + + ToxGas + + 3 + true + (180,214,24) + + + + RotStink + + 4 + true + (214,90,24) + + + + FirstTestGas + + 2 + false + (229,52,235) + + + + SecondTestGas + + 1 + true + (52,113,235) + + \ No newline at end of file diff --git a/1.4/Defs/MainButtonDefs.xml b/1.4/Defs/MainButtonDefs.xml new file mode 100644 index 0000000..ab0b83a --- /dev/null +++ b/1.4/Defs/MainButtonDefs.xml @@ -0,0 +1,14 @@ + + + + \ No newline at end of file diff --git a/About/About.xml b/About/About.xml index 3f7aa32..9e3e869 100644 --- a/About/About.xml +++ b/About/About.xml @@ -3,7 +3,6 @@ Performance Fish bs.performance -

  • 1.3
  • 1.4
  • bradson diff --git a/Source/PerformanceFish/AccessToolsCaching.cs b/Source/PerformanceFish/AccessToolsCaching.cs index 80912db..ed46b9f 100644 --- a/Source/PerformanceFish/AccessToolsCaching.cs +++ b/Source/PerformanceFish/AccessToolsCaching.cs @@ -7,9 +7,9 @@ using System.Linq; namespace PerformanceFish; -public class AccessToolsCaching : ClassWithFishPatches +public sealed class AccessToolsCaching : ClassWithFishPatches { - public class AllTypes : FishPatch + public sealed class AllTypes : FishPatch { public override string? Description { get; } = "Caches AccessTools.AllTypes to only recalculate when the " + "loaded assembly count changes. Improves load times."; diff --git a/Source/PerformanceFish/AllocationProfiling.cs b/Source/PerformanceFish/AllocationProfiling.cs new file mode 100644 index 0000000..7a70edd --- /dev/null +++ b/Source/PerformanceFish/AllocationProfiling.cs @@ -0,0 +1,207 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +#if notWorking + +using System.Linq; +using System.Reflection.Emit; +using JetBrains.Annotations; + +namespace PerformanceFish; + +[UsedImplicitly] +public sealed class AllocationProfiling : ClassWithFishPatches +{ + public override bool RequiresLoadedGameForPatching => false; + + public static bool Active + { + get => _active; + set + { + return; + _active = value; + FishPatch.Get().Enabled = value; + } + } + + public static FishTable Data = new(); + private static bool _active; + + /// + /// The idea here was to patch object..ctor, fetch the type, count calls and get the allocation count for every + /// type by doing so, while ignoring structs which are expected to not construct as full object with type. + /// This however doesn't work. The IL method bodies of class constructors do contain calls to object..ctor, but + /// they appear to only go through for static constructor invocations and literal object construction. Everything + /// else somehow skips the call. + /// + public sealed class ObjectPatch : FishPatch + { + public override bool DefaultState => true; + + public override MethodBase? TargetMethodInfo { get; } + = MainTabWindow._objectConstructor; + // = AccessTools.Constructor(typeof(NotAClass)); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void P0stf1x(object __instance) + { + CallCount++; + + ref var typeData = ref Data.GetOrAddReference(__instance.GetType()); + typeData.Count++; + + // if ((typeData.Count & 1023) != 0) + // return; + + typeData.StackTraces.GetOrAddReference(StackTraceUtility.ExtractStackTrace())++; + } + + public static CodeInstructions Transpiler(CodeInstructions instructions) + { + var codes = instructions.AsOrToList(); + Log.Message(string.Join("\n", codes)); + var retIndex = codes.FindIndex(static code => code.opcode == OpCodes.Ret); + if (retIndex == -1) + retIndex = codes.Count - 1; + + codes.Insert(retIndex, new(OpCodes.Ldarg_0)); + codes.Insert(retIndex + 1, new(OpCodes.Call, methodof(P0stf1x))); + + return codes; + } + + // ReSharper disable once VirtualMemberCallInConstructor + //private ObjectPatch() => TryPatch(); + + public static class NotAClass + { + + } + } + + public static ulong CallCount; + + public record struct TypeData + { + public int Count; + public FishTable StackTraces = new(); + + [UsedImplicitly] + public TypeData() + { + } + } + + [UsedImplicitly] + public sealed class MainTabWindow : RimWorld.MainTabWindow + { + public MainTabWindow() + { + draggable = true; + resizeable = true; + absorbInputAroundWindow = false; + closeOnClickedOutside = false; + } + + private GUIScope.ScrollViewStatus _scrollViewStatus = new(); + private Listing_Standard _listing = new(); + + public override void PreOpen() + { + Active = true; + base.PreOpen(); + } + + public override void PostClose() + { + base.PostClose(); + Active = false; + } + + internal static MethodBase _objectConstructor + = (MethodBase)MethodBodyReader.GetInstructions(null, AccessTools.DeclaredConstructor(typeof(PreceptComp))) + .First(static code => code.opcode == OpCodes.Call + && code.operand is MethodBase method + && method.Name.Contains("ctor")) + .operand; + // = typeof(object).GetMembers(AccessTools.all).OfType() + // .First(static member => member.Name.Contains("ctor")); + // = AccessTools.Constructor(typeof(ObjectPatch.NotAClass)); + + public override void DoWindowContents(Rect inRect) + { + absorbInputAroundWindow = false; + closeOnClickedOutside = false; + + if (GUIHelper.CanSkip) + return; + + Widgets.Label(inRect with { height = Text.LineHeight }, $"Data: {Data}, count: { + Data.Count.ToStringCached()}, callCount: {CallCount.ToString()}"); + inRect.yMin += Text.LineHeight; + + var objectPatches = Harmony.GetPatchInfo(_objectConstructor); + + var patchWidgetLabel = $"Patches on {_objectConstructor.FullDescription()}: pre { + objectPatches?.Prefixes?.Select(static patch => patch.PatchMethod.FullDescription()).ToStringSafeEnumerable()}, post: { + objectPatches?.Postfixes?.Select(static patch => patch.PatchMethod.FullDescription()).ToStringSafeEnumerable()}, trans: { + objectPatches?.Transpilers?.Select(static patch => patch.PatchMethod.FullDescription()).ToStringSafeEnumerable()}, final: { + objectPatches?.Finalizers?.Select(static patch => patch.PatchMethod.FullDescription()).ToStringSafeEnumerable()}, Active? { + Active.ToString()}, Enabled? {FishPatch.Get().Enabled.ToString()}"; + + var patchWidgetHeight = Text.CalcHeight(patchWidgetLabel, inRect.width); + Widgets.Label(inRect with { height = patchWidgetHeight }, patchWidgetLabel); + inRect.yMin += patchWidgetHeight; + + var objectMembers = typeof(object).GetMembers(AccessTools.all).OfType() + .Where(static member => member.Name.Contains("ctor")); + var objectMembersLabel = $"object members:\n{string.Join("\n --- ", objectMembers.Select(static member + => member.FullDescription()))}"; + var objectMembersHeight = Text.CalcHeight(objectMembersLabel, inRect.width); + Widgets.Label(inRect with { height = objectMembersHeight }, objectMembersLabel); + inRect.yMin += objectMembersHeight; + + using var scrollView = new GUIScope.ScrollableListingStandard(inRect, _scrollViewStatus, _listing); + var listing = _listing; + + using var keyValuePairsPooled = new PooledArray>(Data); + keyValuePairsPooled.Sort(_typeDataComparer); + + var keyValuePairs = keyValuePairsPooled.Array; + var typeCount = keyValuePairsPooled.Length; + + for (var i = 0; i < typeCount; i++) + { + if (scrollView.TryCull(Text.LineHeight)) + continue; + + var kvp = keyValuePairs[i]; + var labelRect = listing.GetRect(Text.LineHeight); + + Widgets.Label(labelRect, + string.Concat(kvp.Key, " ", kvp.Value.Count.ToStringCached())); + + if (Mouse.IsOver(labelRect)) + { + var traces = kvp.Value.StackTraces; + using var traceArray = new PooledArray>(traces); + traceArray.Sort(_traceComparer); + // listing.Label(traceArray.Array[0].Key); + listing.Label(traceArray.FirstOrDefault(static kvp => !kvp.Key.Contains("cctor")).Key ?? "NULL"); + // TooltipHandler.TipRegion(labelRect, + // string.Join("\n", traceArray.Select(static kvp => kvp.Key))); + } + } + } + + private static IComparer> _typeDataComparer + = Comparer>.Create(static (x, y) => x.Value.Count.CompareTo(y.Value.Count)); + + private static IComparer> _traceComparer + = Comparer>.Create(static (x, y) => x.Value.CompareTo(y.Value)); + } +} +#endif \ No newline at end of file diff --git a/Source/PerformanceFish/AnalyzerFixes.cs b/Source/PerformanceFish/AnalyzerFixes.cs index 8dfe3b0..02084af 100644 --- a/Source/PerformanceFish/AnalyzerFixes.cs +++ b/Source/PerformanceFish/AnalyzerFixes.cs @@ -15,17 +15,31 @@ public static class AnalyzerFixes { public static void Patch() { - var modBase = AccessTools.Constructor(Reflection.Type("PerformanceAnalyzer", "Analyzer.Modbase"), - new[] { typeof(ModContentPack) }); - if (modBase is null) - return /*false*/; + var entryPoint = AccessTools.DeclaredMethod(ModCompatibility.Types.PerformanceAnalyzer.Window_Analyzer, + "LoadEntries") as MethodBase; - var success = PerformanceFishMod.Harmony!.Patch(modBase, postfix: new(methodof(XmlParser.CollectXmlData))) - != null; + var prefixEntryPoint = false; + if (entryPoint != null) + { + prefixEntryPoint = true; + } + else + { + entryPoint = AccessTools.DeclaredConstructor(ModCompatibility.Types.PerformanceAnalyzer.ModBase, + [typeof(ModContentPack)]); + } + + if (entryPoint is null) + return /*false*/; + + var entryPatchMethod = new HarmonyMethod(methodof(XmlParser.CollectXmlData)); + + var success = PerformanceFishMod.Harmony!.Patch(entryPoint, prefix: prefixEntryPoint ? entryPatchMethod : null, + postfix: prefixEntryPoint ? null : entryPatchMethod) != null; var methodTransplanting = Reflection.MethodInfo("PerformanceAnalyzer", "Analyzer.Profiling.MethodTransplanting", "UpdateMethod", - new[] { typeof(Type), typeof(MethodInfo) }); + [typeof(Type), typeof(MethodInfo)]); if (methodTransplanting is null || PerformanceFishMod.Harmony.Patch(methodTransplanting, transpiler: new(methodof(UpdateMethod_Transpiler))) @@ -145,7 +159,7 @@ public static class AnalyzerFixes public static class OverridingMethodUtility { - public static HashSet PatchedOverrides = new(); + public static HashSet PatchedOverrides = []; public static void ClearCaches() => PatchedOverrides.Clear(); @@ -247,7 +261,7 @@ public static class AnalyzerFixes public static CodeInstructions Parse_Transpiler(CodeInstructions CodeInstructions) { - var codes = CodeInstructions.ToList(); + var codes = CodeInstructions.AsOrToList(); var parseMethod = FishTranspiler.Call("PerformanceAnalyzer", "Analyzer.Profiling.XmlParser", "ParseMethod"); var errorMethod = FishTranspiler.Call("PerformanceAnalyzer", "Analyzer.Profiling.ThreadSafeLogger", "Error"); @@ -357,7 +371,7 @@ public static class AnalyzerFixes private static Action MakeGUIController_AddEntryMethod() { - var analyzer_Profiling_EntryType = Reflection.Type("PerformanceAnalyzer", "Analyzer.Profiling.Entry"); + var analyzer_Profiling_EntryType = ModCompatibility.Types.PerformanceAnalyzer.ProfilingEntry; if (analyzer_Profiling_EntryType == null) Log.Error("analyzer_Profiling_EntryType is null"); @@ -378,13 +392,13 @@ public static class AnalyzerFixes Log.Error("entry_Create is null");*/ var dictionary_Add = AccessTools.Method( - typeof(Dictionary<,>).MakeGenericType(new[] { analyzer_Profiling_EntryType, typeof(Type) }), - "Add", new[] { analyzer_Profiling_EntryType, typeof(Type) }); + typeof(Dictionary<,>).MakeGenericType([analyzer_Profiling_EntryType, typeof(Type)]), + "Add", [analyzer_Profiling_EntryType, typeof(Type)]); if (dictionary_Add == null) Log.Error("dictionary_Add is null"); var dynamicMethod = new DynamicMethod("GUIController_AddEntryMethod", typeof(void), - new[] { typeof(int), typeof(object), typeof(Type) }); + [typeof(int), typeof(object), typeof(Type)]); var il = dynamicMethod.GetILGenerator(); il.Emit(FishTranspiler.Argument(0)); //Category @@ -416,6 +430,7 @@ public static class AnalyzerFixes //Copied from Wiri's analyzer fork, with above fixes integrated. The steam version lacks this functionality public static class XmlParser { + [SuppressMessage("Security", "CA3075")] public static void CollectXmlData() { foreach (var dir in ModLister.AllActiveModDirs) @@ -484,7 +499,7 @@ public static class AnalyzerFixes var type = DynamicTypeBuilder_CreateType(node.Name, methods); var entry = Entry_Create(node.Name, category, type, false, true); - if (tip != string.Empty) + if (!string.IsNullOrEmpty(tip)) Entry_tip(entry) = tip; GUIController_AddSpecificEntry(category, entry, type); diff --git a/Source/PerformanceFish/Cache/BitCellGrid.cs b/Source/PerformanceFish/Cache/BitCellGrid.cs new file mode 100644 index 0000000..9e99ea6 --- /dev/null +++ b/Source/PerformanceFish/Cache/BitCellGrid.cs @@ -0,0 +1,43 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +namespace PerformanceFish.Cache; + +public sealed class BitCellGrid +{ + private long[] _innerArray; + private CellIndices _cellIndices; + + public BitCellGrid(Map map) + { + _innerArray = null!; + _cellIndices = null!; + map.InvokeWhenCellIndicesReady(Initialize); + } + + private void Initialize(Map map) + { + _cellIndices = map.cellIndices; + _innerArray = new long[(Math.Max(0, _cellIndices.NumGridCells - 1) >> 6) + 1]; + } + + public bool this[int index] + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => (_innerArray[index >> 6] & (1L << (index & 63))) != 0L; + set + { + ref var bucket = ref _innerArray[index >> 6]; + bucket ^= (-(long)value.AsInt() ^ bucket) & (1L << (index & 63)); + } + } + + public bool this[in IntVec3 c] + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => this[c.CellToIndex(_cellIndices)]; + set => this[c.CellToIndex(_cellIndices)] = value; + } +} \ No newline at end of file diff --git a/Source/PerformanceFish/Cache/ByIndex.cs b/Source/PerformanceFish/Cache/ByIndex.cs index b50b7e3..600525d 100644 --- a/Source/PerformanceFish/Cache/ByIndex.cs +++ b/Source/PerformanceFish/Cache/ByIndex.cs @@ -194,7 +194,7 @@ public class ByIndex : ByIndex where T : notnull where TResult : new() { - private static FishTable, TResult> _get - = Utility.AddNew, TResult>(); + public int Key; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public unsafe ByInt(T key) => Key = FunctionPointers.IndexGetter.Default(key); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public ByInt(int key) => Key = key; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(ByInt other) => Key == other.Key; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public override int GetHashCode() => Key; + + private static object _valueInitializerLock = new(); + + private static FishTable, TResult> _get = InitializeNew(); [ThreadStatic] private static FishTable, TResult>? _getThreadStatic; + private static Func, TResult>? _valueInitializer; + + public static Func, TResult>? ValueInitializer + { + get + { + lock (_valueInitializerLock) + return _valueInitializer; + } + set + { + lock (_valueInitializerLock) + { + value ??= static _ => Reflection.New(); + _valueInitializer = value; + _get.ValueInitializer = value; + } + } + } + public static FishTable, TResult> Get { [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => _getThreadStatic ??= Utility.AddNew, TResult>(); + get => _getThreadStatic ??= InitializeNew(); } public static FishTable, TResult> GetDirectly @@ -40,6 +75,15 @@ public record struct ByInt where T : notnull where TResult : new() [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ref TResult GetOrAddReference(ref ByInt key) => ref Get.GetOrAddReference(ref key); + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TResult GetOrAdd(int key) => Get.GetOrAdd(Unsafe.As>(ref key)); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TResult GetOrAdd(ByInt key) => Get.GetOrAdd(key); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TResult GetOrAdd(ref ByInt key) => Get.GetOrAdd(ref key); + [MethodImpl(MethodImplOptions.NoInlining)] public static ref TResult GetExistingReference(int key) => ref Get.GetReference(Unsafe.As>(ref key)); @@ -47,19 +91,8 @@ public record struct ByInt where T : notnull where TResult : new() [MethodImpl(MethodImplOptions.NoInlining)] public static ref TResult GetExistingReference(T key) => ref Get.GetReference(new(key)); - public int Key; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public unsafe ByInt(T key) => Key = FunctionPointers.IndexGetter.Default(key); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ByInt(int key) => Key = key; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Equals(ByInt other) => Key == other.Key; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public override int GetHashCode() => Key; + [MethodImpl(MethodImplOptions.NoInlining)] + private static FishTable, TResult> InitializeNew() => Utility.AddNew(ValueInitializer); } [PublicAPI] diff --git a/Source/PerformanceFish/Cache/ByMap.cs b/Source/PerformanceFish/Cache/ByMap.cs index ed800bc..7c02aeb 100644 --- a/Source/PerformanceFish/Cache/ByMap.cs +++ b/Source/PerformanceFish/Cache/ByMap.cs @@ -29,9 +29,9 @@ public static class ByMap where T : new() private static Func Initialize { get; } = typeof(MapComponent).IsAssignableFrom(typeof(T)) ? AccessTools.MethodDelegate>(AccessTools.Method(typeof(Map), nameof(Map.GetComponent), - Type.EmptyTypes, new[] { typeof(T) })) + Type.EmptyTypes, [typeof(T)])) // missing T constraints cause the compiler to complain when trying to just use map => map.GetComponent - : static _ => new(); + : static _ => Reflection.New(); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static T GetFor(Map map) @@ -39,7 +39,7 @@ public static class ByMap where T : new() var cache = GetCache; for (var i = 0; i < cache.Count; i++) { - ref var cacheEntry = ref cache.GetReferenceUnverifiable(i); + ref var cacheEntry = ref cache.GetReferenceUnsafe(i); if (cacheEntry.map == map) return cacheEntry.value; @@ -59,7 +59,7 @@ public static class ByMap where T : new() var cache = GetCache; for (var i = 0; i < cache.Count; i++) { - ref var cacheEntry = ref cache.GetReferenceUnverifiable(i); + ref var cacheEntry = ref cache.GetReferenceUnsafe(i); if (cacheEntry.map == map) return ref cacheEntry.value; @@ -74,7 +74,10 @@ public static class ByMap where T : new() } private static bool EntryValid(int i, Map map) - => Find.Maps.Count > i && Find.Maps.Contains(map); + { + var maps = Current.Game.Maps; + return maps.Count > i && maps.Contains(map); + } private static T AddEntry(Map map, List<(Map map, T value)> cache) { @@ -85,6 +88,6 @@ public static class ByMap where T : new() private static ref T AddEntryByRef(Map map, List<(Map map, T value)> cache) { cache.Add((map, Initialize(map))); - return ref cache.GetReferenceUnverifiable(cache.Count - 1).value; + return ref cache.GetReferenceUnsafe(cache.Count - 1).value; } } \ No newline at end of file diff --git a/Source/PerformanceFish/Cache/ByReference.cs b/Source/PerformanceFish/Cache/ByReference.cs index 15e3138..3a19181 100644 --- a/Source/PerformanceFish/Cache/ByReference.cs +++ b/Source/PerformanceFish/Cache/ByReference.cs @@ -134,7 +134,7 @@ public static class ByReferenceUnclearable Log.Error($"{e}"); } - return result ?? throw new(); + return result ?? ThrowHelper.ThrowInvalidOperationException(); } [SecuritySafeCritical] @@ -153,6 +153,7 @@ public static class ByReferenceUnclearable cacheCopy.Task = null; } // ReSharper disable once SuspiciousTypeConversion.Global + // ReSharper disable once PatternNeverMatches else if (centralCache.Task is Countdown taskCountdown) { Interlocked.Decrement(ref taskCountdown.Value); @@ -216,7 +217,7 @@ public static class ByReferenceUnclearable Log.Error($"{e}"); } - return result ?? throw new(); + return result ?? ThrowHelper.ThrowInvalidOperationException(); } public static unsafe void Initialize() @@ -239,17 +240,39 @@ public static class ByReferenceUnclearable public static class ByReference where T : notnull where TResult : new() { + private static object _valueInitializerLock = new(); + public static object SyncLock = new(); - private static FishTable _get = Utility.AddNew(); + private static FishTable _get = InitializeNew(); [ThreadStatic] private static FishTable? _getThreadStatic; + private static Func? _valueInitializer; + + public static Func? ValueInitializer + { + get + { + lock (_valueInitializerLock) + return _valueInitializer; + } + set + { + lock (_valueInitializerLock) + { + value ??= static _ => Reflection.New(); + _valueInitializer = value; + _get.ValueInitializer = value; + } + } + } + public static FishTable Get { [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => _getThreadStatic ??= Utility.AddNew(); + get => _getThreadStatic ??= InitializeNew(); } public static FishTable GetDirectly @@ -258,6 +281,12 @@ public static class ByReference get => _get; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TResult GetOrAdd(T key) => Get.GetOrAdd(key); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TResult GetOrAdd(ref T key) => Get.GetOrAdd(ref key); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ref TResult GetOrAddReference(T key) => ref Get.GetOrAddReference(key); @@ -266,6 +295,12 @@ public static class ByReference [MethodImpl(MethodImplOptions.NoInlining)] public static ref TResult GetExistingReference(T key) => ref Get.GetReference(key); + + public static void Remove(T key) + { + Get.Remove(key); + GetDirectly.Remove(key); + } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Update(T key) where VResult : TResult, ICacheable @@ -355,7 +390,7 @@ public static class ByReference Log.Error($"{e}"); } - return result ?? throw new(); + return result ?? ThrowHelper.ThrowInvalidOperationException(); } public static Task RequestFromCacheAsync(T key, TArgument2 second) @@ -406,7 +441,7 @@ public static class ByReference Log.Error($"{e}"); } - return result ?? throw new(); + return result ?? ThrowHelper.ThrowInvalidOperationException(); } public static unsafe void Initialize() @@ -423,6 +458,9 @@ public static class ByReference typeof(ByReference).FullName}\n{ex}"); } } + + [MethodImpl(MethodImplOptions.NoInlining)] + private static FishTable InitializeNew() => Utility.AddNew(ValueInitializer); } [PublicAPI] @@ -528,6 +566,7 @@ public record struct ByReference : IInitializable } [MethodImpl(MethodImplOptions.AggressiveInlining)] + // ReSharper disable once ConvertToPrimaryConstructor public ByReference(T1 first, T2 second) { First = first; diff --git a/Source/PerformanceFish/Cache/CellGrid.cs b/Source/PerformanceFish/Cache/CellGrid.cs new file mode 100644 index 0000000..d83ad3f --- /dev/null +++ b/Source/PerformanceFish/Cache/CellGrid.cs @@ -0,0 +1,46 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using System.Diagnostics.CodeAnalysis; + +namespace PerformanceFish.Cache; + +public sealed class CellGrid +{ + private T[] _innerArray; + private CellIndices _cellIndices; + + public CellGrid(Map map) + { + _innerArray = null!; + _cellIndices = null!; + map.InvokeWhenCellIndicesReady(Initialize); + } + + [MemberNotNull(nameof(_innerArray), nameof(_cellIndices))] + private void Initialize(Map map) + { + _cellIndices = map.cellIndices; + _innerArray = new T[_cellIndices.NumGridCells]; + } + + public ref T this[int index] + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => ref _innerArray[index]; + } + + public ref T this[in IntVec3 c] + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => ref _innerArray[c.CellToIndex(_cellIndices)]; + } + + public ref T this[CellIndex cellIndex] + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => ref _innerArray[cellIndex.Value]; + } +} \ No newline at end of file diff --git a/Source/PerformanceFish/Cache/ICacheable.cs b/Source/PerformanceFish/Cache/ICacheable.cs index c2ac64d..03d35b0 100644 --- a/Source/PerformanceFish/Cache/ICacheable.cs +++ b/Source/PerformanceFish/Cache/ICacheable.cs @@ -134,7 +134,7 @@ public interface IAsyncCacheable : IAsyncCacheable MakeResultAsync(TKey key, T2 second); } -internal record Countdown(int Value) +internal sealed record Countdown(int Value) { public volatile int Value = Value; } \ No newline at end of file diff --git a/Source/PerformanceFish/Cache/Utility.cs b/Source/PerformanceFish/Cache/Utility.cs index d9f2d67..4a9d420 100644 --- a/Source/PerformanceFish/Cache/Utility.cs +++ b/Source/PerformanceFish/Cache/Utility.cs @@ -5,16 +5,16 @@ using System.Collections.Concurrent; using System.Diagnostics.CodeAnalysis; +using System.Globalization; using System.Linq; using System.Reflection.Emit; using JetBrains.Annotations; +using PerformanceFish.Events; namespace PerformanceFish.Cache; public static class Utility { - public static event Action? ThingDestroyed; // TODO - public static event Action? Cleared; private static volatile int _destroyedThingCounter, _lastGCTick, _gcRate = 1000; @@ -24,11 +24,21 @@ public static class Utility private static ICollection[]? _cachesToProcessForGC; private static object _gcLock = new(); + + public static ConcurrentBag All { get; } = []; - public static void NotifyThingDestroyed(Thing thing) + public static void Clear() { - ThingDestroyed?.Invoke(thing); + foreach (var cache in All) + cache.Clear(); + + Cleared?.Invoke(); + } + internal static void Initialize() => ThingEvents.Destroyed += TryContinueGC; + + public static void TryContinueGC(Thing thing) + { if (Interlocked.Increment(ref _destroyedThingCounter) < 100 || Current.programStateInt != ProgramState.Playing || TickHelper.TicksGame - _lastGCTick < _gcRate) @@ -77,48 +87,59 @@ public static class Utility var count = 0; for (var i = collection.Length; i-- > 0;) { - if (collection.Length > 0) + if (collection[i].Count > 0) count++; } return count; } - public static ConcurrentBag All { get; } = new(); - - public static void Clear() - { - foreach (var cache in All) - cache.Clear(); - - Cleared?.Invoke(); - } - public static void LogCurrentCacheUtilization() { - var allCaches = All.ToArray(); - Log.Message($"Total utilized caches: {allCaches.CountNonEmpty()}\n\n" - + $"Individual counts:\n{string.Join("\n", - allCaches.Select(static cache => cache.GetType()).Distinct().Select(type - => $"{type.FullDescription()} :: {allCaches.Where(cache => cache.GetType() == type) - .Select(static cache => cache.Count).Sum()}{TryCalculateSize( - type, allCaches)}"))}\n============================================================="); + var allCaches = All.Where(static c => c.Count > 0).ToArray(); + var allCacheTypes = allCaches.Select(static cache => cache.GetType()).Distinct(); + var cacheData = allCacheTypes.Select(type + => + { + var cachesOfType = allCaches.Where(cache => cache.GetType() == type).ToList(); + return (type, cachesOfType.Select(static cache => cache.Count).Sum(), + TryCalculateSize(type, cachesOfType)); + }).ToArray(); + + Array.Sort(cacheData, static (x, y) + => y.Item3 is { } size ? size.CompareTo(x.Item3 ?? 0L) + : y.Item2 != x.Item2 ? y.Item2.CompareTo(x.Item2) + : string.Compare(x.Item1.ToString(), y.Item1.ToString(), StringComparison.Ordinal)); + + Log.Message($"Total utilized caches: {allCaches.Length} ({ + ToByteString(cacheData.Select(static tuple => tuple.Item3 ?? 0L).Sum())})\n\n" + + $"Individual counts:\n{string.Join("\n", cacheData.Select(static tuple + => $"{tuple.Item1.FullDescription()} :: {tuple.Item2.ToStringCached()}{ + (tuple.Item3 is { } size ? $" ({ToByteString(size)})" + : "")}"))}\n============================================================="); } - private static string TryCalculateSize(Type type, ICollection[] allCaches) - => (type.GetProperty(nameof(FishTable.SizeEstimate))?.GetMethod + private static long? TryCalculateSize(Type type, IEnumerable cachesOfType) + { + var sizeGetter = type.GetProperty(nameof(FishTable.SizeEstimate))?.GetMethod ?? (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Dictionary<,>) ? AccessTools.Method(typeof(FisheryLib.CollectionExtensions), nameof(FisheryLib.CollectionExtensions.GetSizeEstimate), generics: type.GetGenericArguments()) - : null)) is { } sizeGetter - ? $" ({(allCaches.Where(cache => cache.GetType() == type) - .Select(cache => (long)(uint)sizeGetter.Invoke(sizeGetter.IsStatic ? null : cache, - sizeGetter.IsStatic ? new object[] { cache } : null)).Sum() - is var sizeInBytes - && sizeInBytes > 1024L * 1024L ? $"{Math.Round(sizeInBytes / (1024d * 1024d), 2)} MiB" - : sizeInBytes > 1024L ? $"{Math.Round(sizeInBytes / 1024d, 2)} KiB" - : $"{sizeInBytes} B")})" - : ""; + : null); + + return sizeGetter is null + ? null + : cachesOfType.Select(cache + => (long)(uint)sizeGetter.Invoke(sizeGetter.IsStatic ? null : cache, + sizeGetter.IsStatic ? [cache] : null)).Sum(); + } + + private static string ToByteString(long sizeInBytes) + => sizeInBytes > 1024L * 1024L + ? $"{Math.Round(sizeInBytes / (1024d * 1024d), 2).ToString(CultureInfo.CurrentCulture)} MiB" + : sizeInBytes > 1024L + ? $"{Math.Round(sizeInBytes / 1024d, 2).ToString(CultureInfo.CurrentCulture)} KiB" + : $"{((int)sizeInBytes).ToStringCached()} B"; private static void Clear(this ICollection cache) { @@ -167,14 +188,29 @@ public static class Utility } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] - public static FishTable AddNew(Action>? onEntryAdded = null, + public static FishTable AddNew(Func? valueInitializer = null, + Action>? onEntryAdded = null, Action>? onEntryRemoved = null) { var newCollection = new FishTable(); + + if (valueInitializer != null) + newCollection.ValueInitializer = valueInitializer; if (onEntryAdded != null) newCollection.EntryAdded += onEntryAdded; + if (typeof(TKey).IsAssignableTo(typeof(Thing))) + { + newCollection.EntryAdded + += entry => + { + var data = new OnDestroyActionData(entry.Key, newCollection); + data.Action = data.Invoke; + data.Thing.Events().Destroyed += data.Action; + }; + } + if (onEntryRemoved != null) newCollection.EntryRemoved += onEntryRemoved; @@ -182,6 +218,26 @@ public static class Utility return newCollection; } + private sealed record OnDestroyActionData(TKey Key, FishTable Collection) + { + public Action? Action; + public Thing Thing => Unsafe.As(Key); + + public void Invoke(Thing thing) + { + Collection.Remove(Key); + Thing.Events().Destroyed -= Action; + } + } + + [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] + public static FishTable AddNew(Func> collectionInitializer) + { + var newCollection = collectionInitializer(); + All.Add(newCollection); + return newCollection; + } + [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static T AddNewUnclearable() where T : class, ICollection, new() { @@ -229,48 +285,13 @@ public interface IClearable public void Clear(); } -public interface IFishBool -{ - public bool Value - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get; - } -} - -public struct FishBool : IFishBool -{ - private byte _value; - - public bool Value - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => _value == 1; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - set => _value = value ? (byte)1 : (byte)0; - } - - public struct True : IFishBool - { - public bool Value => true; - } - - public struct False : IFishBool - { - public bool Value => false; - } -} - [PublicAPI] -public class CollectionRef : IClearable, ICollection where T : ICollection +public sealed class CollectionRef(AccessTools.FieldRef fieldRef) : IClearable, ICollection + where T : ICollection { - private readonly AccessTools.FieldRef _fieldRef; private static readonly ClearInvoker? _clearInvoker = CreateClearDelegate(); - public CollectionRef(AccessTools.FieldRef fieldRef) => _fieldRef = fieldRef; - - public ref T Get => ref _fieldRef(); + public ref T Get => ref fieldRef(); public void Create() => Get = Reflection.New(); @@ -304,7 +325,7 @@ public class CollectionRef : IClearable, ICollection where T : ICollection return null; var dm = new DynamicMethod($"ClearInvoker_{typeof(T).FullName}", null, - new[] { typeof(T).MakeByRefType() }, typeof(CollectionRef), true); + [typeof(T).MakeByRefType()], typeof(CollectionRef), true); var il = dm.GetILGenerator(); il.Emit(FishTranspiler.Argument(0)); diff --git a/Source/PerformanceFish/CellIndex.cs b/Source/PerformanceFish/CellIndex.cs new file mode 100644 index 0000000..dfbe248 --- /dev/null +++ b/Source/PerformanceFish/CellIndex.cs @@ -0,0 +1,21 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +namespace PerformanceFish; + +public record struct CellIndex(int Value) +{ + public int Value = Value; + + public CellIndex(IntVec3 cell, Map map) : this(cell, map.cellIndices.mapSizeX) {} + + public CellIndex(IntVec3 cell, int mapSizeX) : this(cell.CellToIndex(mapSizeX)) {} + + public IntVec3 ToCell(Map map) => ToCell(map.cellIndices.mapSizeX); + + public IntVec3 ToCell(int mapSizeX) => CellIndicesUtility.IndexToCell(Value, mapSizeX); + + public List GetThingList(Map map) => map.thingGrid.ThingsListAtFast(Value); +} \ No newline at end of file diff --git a/Source/PerformanceFish/ContentFinderCaching.cs b/Source/PerformanceFish/ContentFinderCaching.cs index 42d9c40..09d36fb 100644 --- a/Source/PerformanceFish/ContentFinderCaching.cs +++ b/Source/PerformanceFish/ContentFinderCaching.cs @@ -7,9 +7,9 @@ using PerformanceFish.Prepatching; namespace PerformanceFish; -public class ContentFinderCaching : ClassWithFishPrepatches +public sealed class ContentFinderCaching : ClassWithFishPrepatches { - public class Get_Patch : FishPrepatch + public sealed class Get_Patch : FishPrepatch { public override string? Description { get; } = "Caches texture lookups on the ContentFinder. This has a relatively large performance impact when used " diff --git a/Source/PerformanceFish/DDSLoader.cs b/Source/PerformanceFish/DDSLoader.cs index e7667a1..40dfc66 100644 --- a/Source/PerformanceFish/DDSLoader.cs +++ b/Source/PerformanceFish/DDSLoader.cs @@ -104,7 +104,7 @@ public static class DDSLoader if ((dds_pxlf_dwFlags & DDPF_FOURCC) != 0) { - // Texture dos not contain RGB data, check FourCC for format + // Texture does not contain RGB data, check FourCC for format isCompressed = true; if (FourCcEquals(dds_pxlf_dwFourCC, "DXT1")) diff --git a/Source/PerformanceFish/DebugActions.cs b/Source/PerformanceFish/DebugActions.cs new file mode 100644 index 0000000..8276624 --- /dev/null +++ b/Source/PerformanceFish/DebugActions.cs @@ -0,0 +1,56 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +#if RAINBOW_ERRORS +using JetBrains.Annotations; + +namespace PerformanceFish; + +[UsedImplicitly(ImplicitUseTargetFlags.WithMembers)] +public static class DebugActions +{ + [DebugOutput("Performance Fish", true, name = "Toggle Rainbow Errors")] + public static void SpamErrors() + { + lock (_debugLock) + { + if (_errorSpamEnabled) + { + _errorSpamEnabled = false; + Application.onBeforeRender -= _errorAction; + return; + } + + if (_random is null) + { + _random = new(); + _random.NextBytes(_colorBytes = new byte[3000]); + } + + _errorSpamEnabled = true; + Application.onBeforeRender += _errorAction; + } + } + + private static readonly object _debugLock = new(); + private static global::System.Random? _random; + private static bool _errorSpamEnabled; + private static byte[]? _colorBytes; + private static volatile int _logErrorCount = -1; + private static UnityEngine.Events.UnityAction _errorAction = () => + { + var i = Interlocked.Increment(ref _logErrorCount); + if (i >= 1000) + { + _random!.NextBytes(_colorBytes!); + _logErrorCount = 0; + i = 0; + } + + Log.Error("ERROR".Colorize(new ColorInt(_colorBytes![i], _colorBytes[i + 1000], _colorBytes[i + 2000]) + .ToColor)); + }; +} +#endif \ No newline at end of file diff --git a/Source/PerformanceFish/DeepResourceGridOptimization.cs b/Source/PerformanceFish/DeepResourceGridOptimization.cs new file mode 100644 index 0000000..5f6cc96 --- /dev/null +++ b/Source/PerformanceFish/DeepResourceGridOptimization.cs @@ -0,0 +1,38 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using Mono.Cecil; +using Mono.Cecil.Cil; +using PerformanceFish.Prepatching; + +namespace PerformanceFish; + +public sealed class DeepResourceGridOptimization : ClassWithFishPrepatches +{ + public sealed class AnyActiveDeepScannersOnMapPatch : FishPrepatch + { + public override string? Description { get; } + = "Optimizes lookups for active deep scanners to directly return the result of cached data instead of " + + "iterating over all buildings on the map trying to find any matches"; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(DeepResourceGrid), nameof(DeepResourceGrid.AnyActiveDeepScannersOnMap)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static bool ReplacementBody(DeepResourceGrid __instance) + { + foreach (var item in __instance.map.listerBuildings.Cache().ColonistDeepScanners) + { + var compDeepScanner = item.TryGetComp(); + if (compDeepScanner != null && compDeepScanner.ShouldShowDeepResourceOverlay()) + return true; + } + + return false; + } + } +} \ No newline at end of file diff --git a/Source/PerformanceFish/DefDatabasePatches.cs b/Source/PerformanceFish/Defs/DefDatabasePatches.cs similarity index 88% rename from Source/PerformanceFish/DefDatabasePatches.cs rename to Source/PerformanceFish/Defs/DefDatabasePatches.cs index 6b9367d..5a97455 100644 --- a/Source/PerformanceFish/DefDatabasePatches.cs +++ b/Source/PerformanceFish/Defs/DefDatabasePatches.cs @@ -8,11 +8,11 @@ using Mono.Cecil.Cil; using PerformanceFish.Prepatching; -namespace PerformanceFish; +namespace PerformanceFish.Defs; -public class DefDatabasePatches : ClassWithFishPrepatches +public sealed class DefDatabasePatches : ClassWithFishPrepatches { - public class GetNamedPatch : FishPrepatch + public sealed class GetNamedPatch : FishPrepatch { public override MethodBase TargetMethodBase { get; } = methodof(DefDatabase.GetNamed); @@ -36,7 +36,7 @@ public class DefDatabasePatches : ClassWithFishPrepatches DefDatabase.defsList.Count} defs of this type loaded."); } - public class GetByShortHashPatch : FishPrepatch + public sealed class GetByShortHashPatch : FishPrepatch { public override MethodBase TargetMethodBase { get; } = methodof(DefDatabase.GetByShortHash); diff --git a/Source/PerformanceFish/Defs/DefThingPair.cs b/Source/PerformanceFish/Defs/DefThingPair.cs new file mode 100644 index 0000000..5f80970 --- /dev/null +++ b/Source/PerformanceFish/Defs/DefThingPair.cs @@ -0,0 +1,18 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +namespace PerformanceFish.Defs; + +public record struct DefThingPair(int DefShortHash, int ThingIDNumber) +{ + public int + DefShortHash = DefShortHash, + ThingIDNumber = ThingIDNumber; + + public bool Equals(DefThingPair other) + => Unsafe.As(ref this) == Unsafe.As(ref other); + + public override int GetHashCode() => HashCode.Combine(DefShortHash, ThingIDNumber); +} \ No newline at end of file diff --git a/Source/PerformanceFish/FishDefOf.cs b/Source/PerformanceFish/Defs/FishDefOf.cs similarity index 96% rename from Source/PerformanceFish/FishDefOf.cs rename to Source/PerformanceFish/Defs/FishDefOf.cs index 86de5e5..0b74ea9 100644 --- a/Source/PerformanceFish/FishDefOf.cs +++ b/Source/PerformanceFish/Defs/FishDefOf.cs @@ -5,7 +5,8 @@ /*using System.Linq; -namespace PerformanceFish; +namespace PerformanceFish.Defs; + [StaticConstructorOnStartup] public static class FishDefOfOrNull { diff --git a/Source/PerformanceFish/RecipeDefCaching.cs b/Source/PerformanceFish/Defs/RecipeDefCaching.cs similarity index 90% rename from Source/PerformanceFish/RecipeDefCaching.cs rename to Source/PerformanceFish/Defs/RecipeDefCaching.cs index fd0e184..0692266 100644 --- a/Source/PerformanceFish/RecipeDefCaching.cs +++ b/Source/PerformanceFish/Defs/RecipeDefCaching.cs @@ -5,19 +5,19 @@ using RecipeUsersCache = PerformanceFish.Cache.ByInt; + PerformanceFish.Defs.RecipeDefCaching.AllRecipeUsers_Patch.RecipeUsersCacheValue>; -namespace PerformanceFish; +namespace PerformanceFish.Defs; -public class RecipeDefCaching : ClassWithFishPatches +public sealed class RecipeDefCaching : ClassWithFishPatches { public override bool RequiresLoadedGameForPatching => true; - public class AllRecipeUsers_Patch : FirstPriorityFishPatch + public sealed class AllRecipeUsers_Patch : FirstPriorityFishPatch { public override string Description { get; } = "Caches results of the AllRecipeUsers method. Becomes impactful with lots of unfinished things around, " - + "as those check everything for potentially accepting them"; + + "as those check everything for potentially accepting them"; public override MethodBase TargetMethodInfo { get; } = AccessTools.PropertyGetter(typeof(RecipeDef), nameof(RecipeDef.AllRecipeUsers)); @@ -68,7 +68,7 @@ public class RecipeDefCaching : ClassWithFishPatches } else { - RecipeUsers = new(result); + RecipeUsers = [..result]; } _def = instance; @@ -86,7 +86,7 @@ public class RecipeDefCaching : ClassWithFishPatches } } - /*public class PotentiallyMissingIngredients_Patch : FirstPriorityFishPatch + /*public sealed class PotentiallyMissingIngredients_Patch : FirstPriorityFishPatch { public override Expression TargetMethod { get; } = () => new RecipeDef().PotentiallyMissingIngredients(null, null); diff --git a/Source/PerformanceFish/Defs/ThingDefPatches.cs b/Source/PerformanceFish/Defs/ThingDefPatches.cs new file mode 100644 index 0000000..2ff4c6d --- /dev/null +++ b/Source/PerformanceFish/Defs/ThingDefPatches.cs @@ -0,0 +1,112 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using System.Linq; +using Mono.Cecil; +using Mono.Cecil.Cil; +using Mono.Cecil.Rocks; +using PerformanceFish.Prepatching; +using FieldAttributes = Mono.Cecil.FieldAttributes; +using MethodImplAttributes = Mono.Cecil.MethodImplAttributes; + +namespace PerformanceFish.Defs; + +public sealed class ThingDefPatches : ClassWithFishPrepatches +{ + public const string FISH_HASH_FIELD_NAME = "FishHash"; + + public sealed class GetHashCodePatch : FishClassPrepatch + { + public override string? Description { get; } + = "Def.GetHashCode is overridden to return defName.GetHashCode, which is rather slow as that's a string. " + + "This patch caches the hashcode in a field added through prepatcher and simply returns that instead."; + + public override Type Type { get; } = typeof(BuildableDef); + + public override void FreePatch(TypeDefinition typeDefinition) + { + var module = typeDefinition.Module; + + var fishHashField = new FieldDefinition(FISH_HASH_FIELD_NAME, FieldAttributes.Private, + module.TypeSystem.Int32); + + typeDefinition.Fields.Insert(0, fishHashField); + + var constructorBody = typeDefinition.GetConstructors().First().Body; + + constructorBody.GetILProcessor().InsertRange(constructorBody.Instructions.Count - 2, + OpCodes.Ldarg_0, + (OpCodes.Ldc_I4, -42), + (OpCodes.Stfld, fishHashField)); + + constructorBody.OptimizeMacros(); + + var getHashCodeBody = typeDefinition.GetMethod(nameof(BuildableDef.GetHashCode))!.Body; + + var variables = getHashCodeBody.Variables; + variables.Clear(); + + var hashVariable = new VariableDefinition(module.TypeSystem.Int32); + variables.Add(hashVariable); + + var instructions = getHashCodeBody.Instructions; + instructions.Clear(); + + var ilProcessor = getHashCodeBody.GetILProcessor(); + ilProcessor.InsertRange(0, + OpCodes.Ldarg_0, + (OpCodes.Ldfld, fishHashField), + (OpCodes.Stloc, hashVariable), + (OpCodes.Ldloc, hashVariable), + (OpCodes.Ldc_I4, -42), + // 5 bne_un_s ^2 + OpCodes.Ldarg_0, + (OpCodes.Call, methodof(CreateLongHash)), + OpCodes.Ret, + (OpCodes.Ldloc, hashVariable), + OpCodes.Ret); + + ilProcessor.InsertAt(5, OpCodes.Bne_Un_S, instructions[^2]); + + getHashCodeBody.MaxStackSize = 2; + getHashCodeBody.Method.ImplAttributes |= MethodImplAttributes.AggressiveInlining; + getHashCodeBody.OptimizeMacros(); + } + + // [MethodImpl(MethodImplOptions.AggressiveInlining)] + // public static int ReplacementBody(BuildableDef instance) + // { + // var hash = instance.FishHash; + // return hash != -42 ? hash : CreateLongHash(instance); + // } + + [MethodImpl(MethodImplOptions.NoInlining)] + public static int CreateLongHash(BuildableDef instance) + { + var defName = instance.defName; + if (defName is null) + return 0; + + var defHash = defName.GetHashCode(); + if (defName is "" or Def.DefaultDefName) + return defHash; + + ref var cacheHash = ref Lazy.FishHashField(instance); + cacheHash = defHash != -42 ? defHash : defHash + 1; + return cacheHash; + } + + private static class Lazy + { + internal static readonly AccessTools.FieldRef FishHashField + = AccessTools.FieldRefAccess(FISH_HASH_FIELD_NAME); + + static Lazy() + { + // prevent beforefieldinit + } + } + } +} \ No newline at end of file diff --git a/Source/PerformanceFish/DesignationManagerCaching.cs b/Source/PerformanceFish/DesignationManagerCaching.cs index f90de42..05f730a 100644 --- a/Source/PerformanceFish/DesignationManagerCaching.cs +++ b/Source/PerformanceFish/DesignationManagerCaching.cs @@ -16,9 +16,9 @@ using DesignationsOfDefCache = namespace PerformanceFish; -public class DesignationManagerCaching : ClassWithFishPatches +public sealed class DesignationManagerCaching : ClassWithFishPatches { - public class SpawnedDesignationsOfDef_Patch : FishPatch + public sealed class SpawnedDesignationsOfDef_Patch : FishPatch { public override string Description => "Designation caching"; @@ -62,7 +62,7 @@ public class DesignationManagerCaching : ClassWithFishPatches dict[new(instance, key)] = cache; } - public class AnySpawnedDesignationOfDef_Patch : FishPatch + public sealed class AnySpawnedDesignationOfDef_Patch : FishPatch { public override string Description => "Designation caching"; @@ -76,7 +76,7 @@ public class DesignationManagerCaching : ClassWithFishPatches => Reflection.GetCodeInstructions(AnySpawnedDesignationOfDef); } - public class AllDesignationsOn_Patch : FishPatch + public sealed class AllDesignationsOn_Patch : FishPatch { public override string Description => "Designation caching"; public override Expression TargetMethod => () => default(DesignationManager)!.AllDesignationsOn(null); @@ -99,7 +99,7 @@ public class DesignationManagerCaching : ClassWithFishPatches } } - public class DesignationOn_Patch : FishPatch + public sealed class DesignationOn_Patch : FishPatch { public override string Description => "Designation caching"; public override Expression TargetMethod => () => default(DesignationManager)!.DesignationOn(null); @@ -111,7 +111,7 @@ public class DesignationManagerCaching : ClassWithFishPatches => Reflection.GetCodeInstructions(DesignationOn); } - public class DesignationOn_ByDef_Patch : FishPatch + public sealed class DesignationOn_ByDef_Patch : FishPatch { public override string Description => "Designation caching"; public override Expression TargetMethod => () => default(DesignationManager)!.DesignationOn(null, null); @@ -149,7 +149,7 @@ public class DesignationManagerCaching : ClassWithFishPatches => Reflection.GetCodeInstructions(DesignationOn); } - public class HasMapDesignationOn_Patch : FishPatch + public sealed class HasMapDesignationOn_Patch : FishPatch { public override string Description => "Designation caching"; public override Expression TargetMethod => () => default(DesignationManager)!.HasMapDesignationOn(null); diff --git a/Source/PerformanceFish/Events/MapEvents.cs b/Source/PerformanceFish/Events/MapEvents.cs new file mode 100644 index 0000000..faf6990 --- /dev/null +++ b/Source/PerformanceFish/Events/MapEvents.cs @@ -0,0 +1,59 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using PerformanceFish.Prepatching; + +namespace PerformanceFish.Events; + +public sealed class MapEvents : ClassWithFishPrepatches +{ + public sealed class Instanced + { + public event Action? + ComponentsConstructed, + ComponentsLoaded; + + internal void OnComponentsConstructed(Map map) => ComponentsConstructed?.Invoke(map); + + internal void OnComponentsLoaded(Map map) => ComponentsLoaded?.Invoke(map); + } + + public sealed class MapConstructComponentsPatch : FishPrepatch + { + public override string? Description { get; } + = "Hook to raise an event when map components finish constructing. Does nothing by itself, but certain " + + "functions require this."; + + public override bool Enabled => true; + + public override bool ShowSettings => false; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(Map), nameof(Map.ConstructComponents)); + + public static void Postfix(Map __instance) => __instance.Events().OnComponentsConstructed(__instance); + } + + public sealed class MapExposeComponentsPatch : FishPrepatch + { + public override string? Description { get; } + = "Maps apparently construct all components twice when loading a save. Once in ConstructComponents and " + + "afterwards another time here. This is the companion patch to MapConstructCompanions, raising the " + + "ComponentsExposed event."; + + public override bool Enabled => true; + + public override bool ShowSettings => false; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(Map), nameof(Map.ExposeComponents)); + + public static void Postfix(Map __instance) + { + if (Scribe.mode == LoadSaveMode.LoadingVars) + __instance.Events().OnComponentsLoaded(__instance); + } + } +} \ No newline at end of file diff --git a/Source/PerformanceFish/Events/StaticEvents.cs b/Source/PerformanceFish/Events/StaticEvents.cs new file mode 100644 index 0000000..3ea8dc1 --- /dev/null +++ b/Source/PerformanceFish/Events/StaticEvents.cs @@ -0,0 +1,15 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +namespace PerformanceFish.Events; + +public static class StaticEvents +{ + public static event Action CacheCleared + { + add => Cache.Utility.Cleared += value; + remove => Cache.Utility.Cleared -= value; + } +} \ No newline at end of file diff --git a/Source/PerformanceFish/Events/ThingEvents.cs b/Source/PerformanceFish/Events/ThingEvents.cs new file mode 100644 index 0000000..3f9c301 --- /dev/null +++ b/Source/PerformanceFish/Events/ThingEvents.cs @@ -0,0 +1,167 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using PerformanceFish.Prepatching; + +namespace PerformanceFish.Events; + +public sealed class ThingEvents : ClassWithFishPrepatches +{ + public static event Action? + Initialized, + Destroyed; + + public sealed class Instanced + { + public event ThingGridEvents.EventHandler? + RegisteredAtThingGrid, + DeregisteredAtThingGrid; + + public event Action? Spawned; + + public event Action? + DeSpawning, + DeSpawned, + Destroying, + Destroyed; + + internal void OnSpawned(Thing thing, Map map) => Spawned?.Invoke(thing, map); + + internal void OnDeSpawning(Thing thing) => DeSpawning?.Invoke(thing); + + internal void OnDeSpawned(Thing thing) => DeSpawned?.Invoke(thing); + + internal void OnDestroying(Thing thing) => Destroying?.Invoke(thing); + + internal void OnDestroyed(Thing thing) => Destroyed?.Invoke(thing); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal void OnRegisteredAtThingGrid(Thing thing, Map map, in IntVec3 cell) + => RegisteredAtThingGrid?.Invoke(thing, map, cell); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal void OnDeregisteredAtThingGrid(Thing thing, Map map, in IntVec3 cell) + => DeregisteredAtThingGrid?.Invoke(thing, map, cell); + } + + public sealed class SpawnSetupPatch : FishPrepatch + { + public override string? Description { get; } + = "Hook to invoke an event whenever things spawn. Does nothing by itself, but certain functions require " + + "this."; + + public override bool Enabled => true; + + public override bool ShowSettings => false; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(Thing), nameof(Thing.SpawnSetup)); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Postfix(Thing __instance, Map map) => __instance.Events().OnSpawned(__instance, map); + } + + public sealed class DeSpawnPatch : FishPrepatch + { + public override string? Description { get; } + = "Hook to invoke an event whenever things despawn. Does nothing by itself, but certain functions require " + + "this."; + + public override bool Enabled => true; + + public override bool ShowSettings => false; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(Thing), nameof(Thing.DeSpawn)); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Prefix(Thing __instance) => __instance.Events().OnDeSpawning(__instance); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Postfix(Thing __instance) => __instance.Events().OnDeSpawned(__instance); + } + + public sealed class DestroyPatch : FishPrepatch + { + public override string? Description { get; } + = "Hook to invoke an event whenever things get destroyed. Does nothing by itself, but certain functions " + + "require this."; + + public override bool Enabled => true; + + public override bool ShowSettings => false; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(Thing), nameof(Thing.Destroy)); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Prefix(Thing __instance) => __instance.Events().OnDestroying(__instance); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Postfix(Thing __instance) + { + __instance.Events().OnDestroyed(__instance); + Destroyed?.Invoke(__instance); + } + } + + public sealed class ExposeDataInitializePatch : FishPrepatch + { + public override string? Description { get; } + = "Hook to invoke an event when things finish loading from a save file. Does nothing by itself, but " + + "certain functions require this."; + + public override bool Enabled => true; + + public override bool ShowSettings => false; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(Thing), nameof(Thing.ExposeData)); + + public static void Postfix(Thing __instance) + { + if (Scribe.mode == LoadSaveMode.LoadingVars && __instance is not ThingWithComps) + OnThingInitialized(__instance); + } + } + + public sealed class PostMakePatch : FishPrepatch + { + public override string? Description { get; } + = "Hook to invoke an event when things get created. Does nothing by itself, but certain functions require " + + "this."; + + public override bool Enabled => true; + + public override bool ShowSettings => false; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(Thing), nameof(Thing.PostMake)); + + public static void Postfix(Thing __instance) + { + if (__instance is not ThingWithComps) + OnThingInitialized(__instance); + } + } + + public sealed class InitializeCompsPatch : FishPrepatch + { + public override string? Description { get; } + = "Hook to invoke an event when things with comps get initialized. Does nothing by itself, but certain " + + "functions require this."; + + public override bool Enabled => true; + + public override bool ShowSettings => false; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(ThingWithComps), nameof(ThingWithComps.InitializeComps)); + + public static void Postfix(ThingWithComps __instance) => OnThingInitialized(__instance); + } + + private static void OnThingInitialized(Thing thing) => Initialized?.Invoke(thing); +} \ No newline at end of file diff --git a/Source/PerformanceFish/Events/ThingGridEvents.cs b/Source/PerformanceFish/Events/ThingGridEvents.cs new file mode 100644 index 0000000..1427387 --- /dev/null +++ b/Source/PerformanceFish/Events/ThingGridEvents.cs @@ -0,0 +1,74 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using Mono.Cecil; +using Mono.Cecil.Cil; +using PerformanceFish.Prepatching; + +namespace PerformanceFish.Events; + +public sealed class ThingGridEvents : ClassWithFishPrepatches +{ + /// + /// Invoked for every thing.Position change, including for motes and pawns + /// + public sealed class RegisterInCellPatch : FishPrepatch + { + public override string? Description { get; } + = "Hook to invoke an event whenever things register in a cell. Does nothing by itself, but certain " + + "functions require this."; + + public override bool Enabled => true; + + public override bool ShowSettings => false; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(ThingGrid), nameof(ThingGrid.RegisterInCell)); + + public static void OnRegistered(ThingGrid __instance, Thing t, in IntVec3 c) + => t.Events().OnRegisteredAtThingGrid(t, __instance.map, c); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.InsertRange(ilProcessor.instructions.FirstIndexOf(static code + => code.OpCode == OpCodes.Callvirt + && code.Operand is MethodReference { Name: "Add" } method + && method.DeclaringType.Name.Contains("List")) + + 1, + OpCodes.Ldarg_0, + OpCodes.Ldarg_1, + (OpCodes.Ldarga_S, ilProcessor.Body.GetParameter(2)), + (OpCodes.Call, methodof(OnRegistered))); + } + + public sealed class DeregisterInCellPatch : FishPrepatch + { + public override string? Description { get; } + = "Hook to invoke an event whenever things deregister from a cell. Does nothing by itself, but certain " + + "functions require this."; + + public override bool Enabled => true; + + public override bool ShowSettings => false; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(ThingGrid), nameof(ThingGrid.DeregisterInCell)); + + public static void OnDeregistered(ThingGrid __instance, Thing t, in IntVec3 c) + => t.Events().OnDeregisteredAtThingGrid(t, __instance.map, c); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.InsertRange(ilProcessor.instructions.FirstIndexOf(static code + => code.OpCode == OpCodes.Callvirt + && code.Operand is MethodReference { Name: "Remove" } method + && method.DeclaringType.Name.Contains("List")) + + 1, + OpCodes.Ldarg_0, + OpCodes.Ldarg_1, + (OpCodes.Ldarga, ilProcessor.Body.GetParameter(2)), + (OpCodes.Call, methodof(OnDeregistered))); + } + + public delegate void EventHandler(Thing thing, Map map, in IntVec3 cell); +} \ No newline at end of file diff --git a/Source/PerformanceFish/FishSettings.cs b/Source/PerformanceFish/FishSettings.cs index 7547b74..1d07f23 100644 --- a/Source/PerformanceFish/FishSettings.cs +++ b/Source/PerformanceFish/FishSettings.cs @@ -13,16 +13,22 @@ using PerformanceFish.Prepatching; namespace PerformanceFish; [PublicAPI] -public class FishSettings : ModSettings +public sealed class FishSettings : ModSettings { public static bool SettingsLoaded { get; private set; } - + + private const string VERSION_SCRIBE_LABEL = "Version"; + public override void ExposeData() { base.ExposeData(); + if (!TryScribeVersion()) + goto DoneLoading; + Scribe_Values.Look(ref _threadingEnabled, "ThreadingEnabled"); Scribe_Values.Look(ref MothballEverything, "MothballEverything"); + Scribe_Values.Look(ref ImproveHaulingAccuracy, "ImproveHaulingAccuracy", true); if (PerformanceFishMod.AllPatchClasses is { } allPatchClasses) { @@ -36,9 +42,33 @@ public class FishSettings : ModSettings patchClass.Patches.Scribe(); } + DoneLoading: SettingsLoaded = true; } + private static bool TryScribeVersion() + { + var currentVersion = PerformanceFishMod.LoadedVersion; + var lastSavedVersion = new Version().ToString(); + + var scribeMode = Scribe.mode; + if (scribeMode == LoadSaveMode.Saving) + { + lastSavedVersion = currentVersion.ToString(); + Scribe_Values.Look(ref lastSavedVersion, VERSION_SCRIBE_LABEL); + } + else if (scribeMode == LoadSaveMode.LoadingVars) + { + var defaultVersion = lastSavedVersion; + Scribe_Values.Look(ref lastSavedVersion, VERSION_SCRIBE_LABEL); + + if (new Version(lastSavedVersion ?? defaultVersion) < currentVersion) + return false; + } + + return true; + } + public static void DoSettingsWindowContents(Rect inRect) { var windowRect = Find.WindowStack.currentlyDrawnWindow.windowRect; @@ -49,7 +79,7 @@ public class FishSettings : ModSettings { ResetAll(); } - + Widgets.BeginScrollView(inRect, ref _scrollPosition, _scrollRect); var ls = new Listing_Standard(); ls.Begin(_scrollRect); @@ -62,7 +92,7 @@ public class FishSettings : ModSettings ModEnabled = checkModEnabled; ToggleAllPatches(checkModEnabled); } - + ls.Gap(); var curFontStyle = Text.CurFontStyle; var curFontSize = curFontStyle.fontSize; @@ -76,6 +106,9 @@ public class FishSettings : ModSettings { try { + if (!patchClass.ShowSettings) + continue; + ls.Label(patchClass.GetType().Name, tooltip: patchClass is IHasDescription classWithDescription ? classWithDescription.Description @@ -84,6 +117,9 @@ public class FishSettings : ModSettings ls.GapLine(2f); foreach (var patch in patchClass.Patches) { + if (!patch.ShowSettings) + continue; + if (ShouldSkipForScrollView(inRect.height, Text.LineHeight, ls.curY, _scrollPosition.y)) { ls.curY += Text.LineHeight; @@ -91,14 +127,14 @@ public class FishSettings : ModSettings } var check = patch.Enabled; - if (patch.Description == null) + if (patch.DescriptionWithNotes == null) Widgets.DrawHighlightIfMouseover(_scrollRect with { y = ls.curY, height = Text.LineHeight }); var label = patch.Name ?? patch.GetType().Name; if (label.EndsWith("_Patch")) label = label.Remove(label.Length - 6); else if (label.EndsWith("Patch")) label = label.Remove(label.Length - 5); - ls.CheckboxLabeled(label, ref check, patch.Description); + ls.CheckboxLabeled(label, ref check, patch.DescriptionWithNotes); if (check != patch.Enabled) patch.Enabled = check; } @@ -110,18 +146,21 @@ public class FishSettings : ModSettings Log.Error($"{ex}"); } } - + ls.Gap(); curFontStyle.fontSize = 20; ls.Label("Prepatches"); curFontStyle.fontSize = curFontSize; ls.GapLine(); ls.Gap(); - + foreach (var patchClass in PerformanceFishMod.AllPrepatchClasses!) { try { + if (!patchClass.ShowSettings) + continue; + ls.Label(patchClass.GetType().Name, // ReSharper disable once SuspiciousTypeConversion.Global tooltip: patchClass is IHasDescription classWithDescription @@ -131,6 +170,9 @@ public class FishSettings : ModSettings ls.GapLine(2f); foreach (var patch in patchClass.Patches) { + if (!patch.ShowSettings) + continue; + if (ShouldSkipForScrollView(inRect.height, Text.LineHeight, ls.curY, _scrollPosition.y)) { ls.curY += Text.LineHeight; @@ -138,14 +180,14 @@ public class FishSettings : ModSettings } var check = patch.Enabled; - if (patch.Description == null) + if (patch.DescriptionWithNotes == null) Widgets.DrawHighlightIfMouseover(_scrollRect with { y = ls.curY, height = Text.LineHeight }); var label = patch.Name ?? patch.GetType().Name; if (label.EndsWith("_Patch")) label = label.Remove(label.Length - 6); else if (label.EndsWith("Patch")) label = label.Remove(label.Length - 5); - ls.CheckboxLabeled(label, ref check, patch.Description); + ls.CheckboxLabeled(label, ref check, patch.DescriptionWithNotes); if (check != patch.Enabled) patch.Enabled = check; } @@ -157,10 +199,12 @@ public class FishSettings : ModSettings Log.Error($"{ex}"); } } - + + ls.Gap(); + ls.CheckboxLabeled("Improve hauling accuracy", ref ImproveHaulingAccuracy, ImproveHaulingAccuracyDescription); ls.Gap(); ls.CheckboxLabeled("Mothball everything", ref MothballEverything, MothballEverythingDescription); - + ls.Gap(); if (ls.ButtonText("Log hediffs affected by mothball optimization")) @@ -168,12 +212,12 @@ public class FishSettings : ModSettings Log.Message($"Allowed defs for mothballing: {MothballOptimization.AllowedDefs.ToStringSafeEnumerable()}"); Log.Message($"Blocking defs for mothballing: {DefDatabase.AllDefsListForReading.Where(static def => !MothballOptimization.AllowedDefs.Contains(def)).ToStringSafeEnumerable()}"); - + Verse.Log.TryOpenLogWindow(); } ls.Gap(); - + if (ls.ButtonText("Log patch count")) { PerformanceFishMod.LogPatchCount(); @@ -181,7 +225,7 @@ public class FishSettings : ModSettings } ls.Gap(); - + if (ls.ButtonText("Log cache utilization")) { Cache.Utility.LogCurrentCacheUtilization(); @@ -201,10 +245,16 @@ public class FishSettings : ModSettings }; } - public static string MothballEverythingDescription - = MothballOptimization.BASIC_DESCRIPTION + " This setting removes all conditions, enabling every world " - + "pawn for mothballing. Note, health conditions do not progress on mothballed pawns. Requires the " - + "WorldPawnsDefPreventingMothball patch to apply"; + public static string + MothballEverythingDescription + = MothballOptimization.BASIC_DESCRIPTION + + " This setting removes all conditions, enabling every world " + + "pawn for mothballing. Note, health conditions do not progress on mothballed pawns. Requires the " + + "WorldPawnsDefPreventingMothball patch to apply", + ImproveHaulingAccuracyDescription + = "Requires the StoreUtilityPrepatches:TryFindBestBetterStoreCellForWorker patch to function. Having this " + + "enabled makes hauling lookups more thorough, raising the odds of getting closer haul destinations at " + + "the cost of a usually minor performance hit"; private static void ToggleAllPatches(bool newState) => ToggleAllPatches(_ => newState, _ => newState); @@ -214,15 +264,21 @@ public class FishSettings : ModSettings foreach (var patchClass in PerformanceFishMod.AllPatchClasses!) { foreach (var patch in patchClass.Patches) - patch.Enabled = fishPatchFunc(patch); + { + if (patch.ShowSettings) + patch.Enabled = fishPatchFunc(patch); + } } foreach (var patchClass in PerformanceFishMod.AllPrepatchClasses!) { foreach (var patch in patchClass.Patches) - patch.Enabled = fishPrepatchFunc(patch); + { + if (patch.ShowSettings) + patch.Enabled = fishPrepatchFunc(patch); + } } - + Cache.Utility.Clear(); } @@ -259,7 +315,9 @@ public class FishSettings : ModSettings private static bool _modEnabled = true; - public static bool MothballEverything; + public static bool + MothballEverything, + ImproveHaulingAccuracy = true; public static bool ThreadingEnabled { @@ -275,7 +333,7 @@ public class FishSettings : ModSettings } private static bool _threadingEnabled; - public static List ThreadingPatches { get; } = new(); + public static List ThreadingPatches { get; } = []; private static Rect _scrollRect = new(0f, 0f, 500f, 9001f); private static Vector2 _scrollPosition; diff --git a/Source/PerformanceFish/FunctionPointers/IndexGetter.cs b/Source/PerformanceFish/FunctionPointers/IndexGetter.cs index 8873ccd..499daff 100644 --- a/Source/PerformanceFish/FunctionPointers/IndexGetter.cs +++ b/Source/PerformanceFish/FunctionPointers/IndexGetter.cs @@ -68,14 +68,15 @@ public static class IndexGetter Delegate func; while (!_indexFuncs.TryGetValue(type, out func!)) { - type = type.BaseType - ?? throw new($"Performance Fish failed to find a fallback method to handle type { - typeof(T).FullName} from mod {typeof(T).Assembly.GetName().Name}"); + type = type?.BaseType + ?? ThrowHelper.ThrowInvalidOperationException( + $"Performance Fish failed to find a fallback method to handle type { + typeof(T).FullName} from mod {typeof(T).Assembly.GetName().Name}"); } if (!isThing) { - Log.Message($"Found fallback of type {type.FullName}.{ + Log.Message($"Found fallback of type {type?.FullName ?? "NULL"}.{ (!isDef ? " This likely means we can safely continue from here." : "")}"); } diff --git a/Source/PerformanceFish/GasDef.cs b/Source/PerformanceFish/GasDef.cs new file mode 100644 index 0000000..f5422eb --- /dev/null +++ b/Source/PerformanceFish/GasDef.cs @@ -0,0 +1,25 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using JetBrains.Annotations; + +namespace PerformanceFish; + +[PublicAPI] +public class GasDef : Def +{ + public int dissipationRate; + public bool diffuses; + public Color color; + + public static GasDef? OfGasType(GasType gasType) + => gasType switch + { + GasType.BlindSmoke => GasDefOf.BlindSmoke, + GasType.RotStink => GasDefOf.RotStink, + GasType.ToxGas => GasDefOf.ToxGas, + _ => null + }; +} \ No newline at end of file diff --git a/Source/PerformanceFish/GasDefOf.cs b/Source/PerformanceFish/GasDefOf.cs new file mode 100644 index 0000000..5cddf50 --- /dev/null +++ b/Source/PerformanceFish/GasDefOf.cs @@ -0,0 +1,22 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using JetBrains.Annotations; + +namespace PerformanceFish; + +[DefOf] +[UsedImplicitly(ImplicitUseTargetFlags.WithMembers)] +#pragma warning disable CS8618 +public static class GasDefOf +{ + public static GasDef + BlindSmoke, + ToxGas, + RotStink; + + static GasDefOf() => DefOfHelper.EnsureInitializedInCtor(typeof(GasDefOf)); +} +#pragma warning restore CS8618 \ No newline at end of file diff --git a/Source/PerformanceFish/GasGridExtensions.cs b/Source/PerformanceFish/GasGridExtensions.cs new file mode 100644 index 0000000..a96060f --- /dev/null +++ b/Source/PerformanceFish/GasGridExtensions.cs @@ -0,0 +1,47 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using JetBrains.Annotations; + +namespace PerformanceFish; + +[PublicAPI] +public static class GasGridExtensions +{ + public static GasGridOptimization.ParallelGasGrid ForDef(this GasGridOptimization.ParallelGasGrid[] grids, + GasDef def) + => grids[def.index]; + + public static GasGridOptimization.ParallelGasGrid ForDef(this GasGrid grid, GasDef def) + => grid.ParallelGasGrids().ForDef(def); + + public static void AddGas(this GasGrid grid, in IntVec3 cell, GasDef gas, int amount, bool canOverflow = true) + => grid.ForDef(gas).AddGas(cell, amount, canOverflow); + + public static void AddGas(this GasGrid grid, in IntVec3 cell, GasDef gas, float radius) + => grid.AddGas(cell, gas, 255 * GenRadial.NumCellsInRadius(radius)); + + public static void SetDirect(this GasGrid grid, in IntVec3 cell, GasDef gas, byte density) + => grid.ForDef(gas).SetDirect(cell, density); + + public static byte DensityAt(this GasGrid grid, in IntVec3 cell, GasDef gas) => grid.ForDef(gas).DensityAt(cell); + + public static float DensityPercentAt(this GasGrid grid, in IntVec3 cell, GasDef gas) + => grid.DensityAt(cell, gas) / 255f; + + /// + /// For modders. Performance Fish doesn't automatically scribe added custom defs. + /// + public static void ScribeForDef(this GasGrid grid, GasDef gas, string label) + { + if (gas == GasDefOf.BlindSmoke || gas == GasDefOf.ToxGas || gas == GasDefOf.RotStink) + { + Log.Error($"Tried scribing vanilla gas '{gas}'. This should never be manually scribed by a mod."); + return; + } + + grid.ForDef(gas).Scribe(label); + } +} \ No newline at end of file diff --git a/Source/PerformanceFish/GasGridOptimization.cs b/Source/PerformanceFish/GasGridOptimization.cs new file mode 100644 index 0000000..4306a13 --- /dev/null +++ b/Source/PerformanceFish/GasGridOptimization.cs @@ -0,0 +1,995 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +// #define GAS_DEBUG_L1 // erroneous gas changes +// #define GAS_DEBUG_L2 // total gas grid changes +// #define GAS_DEBUG_L3 // individual cell changes + +using System.Diagnostics; +using System.Linq; +using Mono.Cecil; +using Mono.Cecil.Cil; +using MonoMod.Utils; +using PerformanceFish.Prepatching; + +namespace PerformanceFish; + +public sealed class GasGridOptimization : ClassWithFishPrepatches +{ + // public static readonly List ParallelGasGrids = new(); + // public static GasGrid[] RegisteredGasGrids = Array.Empty(); + + public sealed class SetDirectPatch : FishPrepatch + { + public override bool ShowSettings => false; + + public override string? Description { get; } + = "Required by the gas grid optimization"; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(GasGrid), nameof(GasGrid.SetDirect)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static void ReplacementBody(GasGrid __instance, int index, byte smoke, byte toxic, byte rotStink) + { + if (!ModsConfig.BiotechActive) + toxic = 0; + + var gasGrids = __instance.ParallelGasGrids(); + + gasGrids[0].SetDirect(index, smoke); + gasGrids[1].SetDirect(index, toxic); + gasGrids[2].SetDirect(index, rotStink); + } + } + + public sealed class TickPatch : FishPrepatch + { + public override List LinkedPatches { get; } = + [ + typeof(SetDirectPatch), typeof(ColorAtPatch), typeof(AddGasPatch), typeof(AnyGasAtPatch), + typeof(DensityAtPatch), typeof(Debug_ClearAllPatch), typeof(Debug_FillAllPatch), + typeof(Notify_ThingSpawnedPatch), typeof(ExposeDataPatch), typeof(MouseOverReadOutOnGUI), + typeof(DebugToolsGeneralPushGas) + ]; + + // public static EventWaitHandle? WaitHandle { get; private set; } + + public static object? MonitorObject { get; private set; } + + public override string? Description { get; } + = "Optimizes the gas grid to utilize highly performant bit manipulation for much faster processing of " + + "cells, usually in buckets of 64 simultaneously checked cells, and threading to process the different " + + "gas types in parallel. Additionally exposes gas to xml through the PerformanceFish.GasDef type. " + + "Performance impact scales with map size, but is generally large. Currently only utilizing single core " + + "parallelism, threading is planned"; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(GasGrid), nameof(GasGrid.Tick)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static void ReplacementBody(GasGrid __instance) + { + // Parallel.For(0, ParallelGasGrids.Length, static i => ParallelGasGrids[i].Tick()); + // (WaitHandle ?? Setup()).Set(); + + // if (!RegisteredGasGrids.Contains(__instance)) + // Setup(__instance); + + // ParallelNoAlloc.PulseRegisteredBackgroundWorkers(__instance.MonitorObject()); + + var gasGrids = __instance.ParallelGasGrids(); + + for (var i = 1; i < gasGrids.Length; i++) + gasGrids[i].Tick(); + + if (gasGrids.Length < 1) + return; + + var firstGasGrid = gasGrids[0]; + firstGasGrid.Tick(); + + __instance.cycleIndexDiffusion = firstGasGrid.CycleIndexDiffusion; + __instance.cycleIndexDissipation = firstGasGrid.CycleIndexDissipation; + } + + // [MemberNotNull(nameof(WaitHandle))] + // public static EventWaitHandle Setup() + // { + // WaitHandle = new ManualResetEvent(false); + // for (var i = ParallelGasGrids.Length; i-- > 1;) + // { + // var gasGrid = ParallelGasGrids[i]; + // ThreadPool.RegisterWaitForSingleObject(WaitHandle, (_, _) => gasGrid.Tick(), null, -1, false); + // } + // + // return WaitHandle; + // } + +// public static ParallelGasGrid[] Setup(GasGrid instance) +// { +// // lock (ParallelGasGrids) +// // { +// // if (RegisteredGasGrids.Contains(instance)) +// // { +// // // only possible if 2 threads try registering the same gas grid instance. Rimthreaded? Maybe throw? +// // SpinWait.SpinUntil(static () => MonitorObject != null); +// // #pragma warning disable CS8774 +// // return; +// // #pragma warning restore CS8774 +// // } +// // +// // RegisteredGasGrids = RegisteredGasGrids.Add(instance); +// // } +// +// return new ParallelGasGrid[DefDatabase.DefCount]; +// +// var gasDefsList = DefDatabase.AllDefsListForReading; +// +// var newGasGrids = new ParallelGasGrid[gasDefsList.Count]; +// try +// { +// for (var i = 0; i < newGasGrids.Length; i++) +// newGasGrids[i] = new(instance.map, gasDefsList[i]); +// +// // ParallelGasGrids.AddRangeFast(newGasGrids); +// +// instance.MonitorObject() = ParallelNoAlloc.RegisterBackgroundWaitingWorkers(MakeTickActions(newGasGrids, +// Math.Max(newGasGrids.Length - 1, 0), 1)); // 1st grid ticked on main thread +// } +// catch (Exception e) +// { +// Log.Error($"Caught exception in map with ID {instance.map.uniqueID} and hashCode {instance.map.GetHashCode()}: {e}"); +// return Array.Empty(); +// } +// +// return newGasGrids; +// } + + private static Action[] MakeTickActions(T gasGrids, int count, int startIndex) + where T : IList + { + var actions = new Action[count]; + count += startIndex; + for (var i = startIndex; i < count; i++) + { + var gasGrid = gasGrids[i]; + actions[i - startIndex] = () => gasGrid.Tick(); + } + + return actions; + } + + // for save-game compatibility. The two cycle indices get scribed with ExposeData + public static void AdvanceCycleIndex(ref int cycleIndex, int area, int increment) + { + cycleIndex += increment; + if (cycleIndex >= area) + cycleIndex = 0; + } + } + + public sealed class ColorAtPatch : FishPrepatch + { + public override bool ShowSettings => false; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(GasGrid), nameof(GasGrid.ColorAt)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static Color ReplacementBody(GasGrid __instance, IntVec3 cell) + { + var cellIndex = cell.CellToIndex(__instance.map); + + var gasGrids = __instance.ParallelGasGrids(); + var gasGridCount = gasGrids.Length; + + Span densities = stackalloc float[gasGridCount]; + var sum = 0f; + + for (var i = 0; i < gasGridCount; i++) + sum += densities[i] = gasGrids[i].DensityAt(cellIndex); + + var resultColor = default(Color); + + for (var i = 0; i < gasGridCount; i++) + resultColor += gasGrids[i].Color * (densities[i] / sum); + + resultColor.a = Mathf.Lerp(GasGrid.AlphaRange.min, GasGrid.AlphaRange.max, + sum / (/*gasGridCount*/ 3 * byte.MaxValue)); // maintain vanilla transparency + + return resultColor; + } + } + + public sealed class AddGasPatch : FishPrepatch + { + public override bool ShowSettings => false; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(GasGrid), nameof(GasGrid.AddGas)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static void ReplacementBody(GasGrid __instance, IntVec3 cell, GasType gasType, int amount, + bool canOverflow = true) + => __instance.ParallelGasGrids()[(int)gasType >> 3].AddGas(cell, amount, canOverflow); + } + + public sealed class AnyGasAtPatch : FishPrepatch + { + public override bool ShowSettings => false; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(GasGrid), nameof(GasGrid.AnyGasAt), [typeof(int)]); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static bool ReplacementBody(GasGrid __instance, int idx) + { + var gasGrids = __instance.ParallelGasGrids(); + for (var i = 0; i < gasGrids.Length; i++) + { + if (gasGrids[i].AnyGasAt(idx)) + return true; + } + + return false; + } + } + + public sealed class DensityAtPatch : FishPrepatch + { + public override bool ShowSettings => false; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(GasGrid), nameof(GasGrid.DensityAt), + [typeof(int), typeof(GasType)]); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static byte ReplacementBody(GasGrid __instance, int index, GasType gasType) + => __instance.ParallelGasGrids()[(int)gasType >> 3].DensityAt(index); + } + + public sealed class Debug_ClearAllPatch : FishPrepatch + { + public override bool ShowSettings => false; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(GasGrid), nameof(GasGrid.Debug_ClearAll)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static void ReplacementBody(GasGrid __instance) + { + var gasGrids = __instance.ParallelGasGrids(); + + for (var i = 0; i < gasGrids.Length; i++) + gasGrids[i].Clear(); + + __instance.map.mapDrawer.WholeMapChanged(MapMeshFlag.Gas); + } + } + + public sealed class Debug_FillAllPatch : FishPrepatch + { + public override string? Description { get; } = "Adds custom gases to the debug fill all action"; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(GasGrid), nameof(GasGrid.Debug_FillAll)); + + public static void Postfix(GasGrid __instance) + { + var gasGrids = __instance.ParallelGasGrids(); + if (gasGrids.Length < 3) + return; + + var cellCount = __instance.gasDensity.Length; + var cellIndices = __instance.map.cellIndices; + + for (var i = 0; i < cellCount; i++) + { + if (!__instance.GasCanMoveTo(cellIndices.IndexToCell(i))) + continue; + + for (var j = 3; j < gasGrids.Length; j++) + gasGrids[j].SetDirect(i, 255); + } + } + } + + public sealed class Notify_ThingSpawnedPatch : FishPrepatch + { + public override bool ShowSettings => false; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(GasGrid), nameof(GasGrid.Notify_ThingSpawned)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static void ReplacementBody(GasGrid __instance, Thing thing) + { + if (!thing.IsSpawned() || thing.def.Fillage != FillCategory.Full) + return; + + var grids = __instance.ParallelGasGrids(); + var gridCount = grids.Length; + var map = __instance.map; + var mapDrawer = map.mapDrawer; + var mapSizeX = GetMapSizeX(map); + + foreach (var occupiedCell in thing.OccupiedRect()) + { + var anyGridDirty = false; + + for (var i = gridCount; i-- > 0;) + { + var grid = grids[i]; + var cellIndex = occupiedCell.CellToIndex(mapSizeX); + + if (!grid.AnyGasAt(cellIndex)) + continue; + + grid.SetDirect(cellIndex, 0); + anyGridDirty = true; + } + + if (anyGridDirty) + mapDrawer.MapMeshDirty(occupiedCell, MapMeshFlag.Gas); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int GetMapSizeX(Map map) => map.cellIndices.mapSizeX; + } + + public sealed class ExposeDataPatch : FishPrepatch + { + public override bool ShowSettings => false; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(GasGrid), nameof(GasGrid.ExposeData)); + + public static void Prefix(GasGrid __instance) + { + if (Scribe.mode != LoadSaveMode.Saving) + return; + + var grids = __instance.ParallelGasGrids(); + var smokeGrid = grids[0]; + var toxicGrid = grids[1]; + var rotStinkGrid = grids[2]; + + for (var i = smokeGrid.CellCount; i-- > 0;) + { + __instance.gasDensity[i] = (rotStinkGrid.DensityAt(i) << 16) + | (toxicGrid.DensityAt(i) << 8) + | smokeGrid.DensityAt(i); + } + } + + public static void Postfix(GasGrid __instance) + { + if (Scribe.mode != LoadSaveMode.LoadingVars) + return; + + var grids = __instance.ParallelGasGrids(); + var smokeGrid = grids[0]; + var toxicGrid = grids[1]; + var rotStinkGrid = grids[2]; + + for (var i = smokeGrid.CellCount; i-- > 0;) + { + var gasDensityAtCell = __instance.gasDensity[i]; + + smokeGrid.SetDirect(i, (byte)gasDensityAtCell); + toxicGrid.SetDirect(i, (byte)((uint)gasDensityAtCell >> 8)); + rotStinkGrid.SetDirect(i, (byte)((uint)gasDensityAtCell >> 16)); + } + } + } + + public sealed class DebugToolsGeneralPushGas : FishPrepatch + { + public override string? Description { get; } = "Adds a debug action for adding custom gas defs"; + + public override MethodBase TargetMethodBase { get; } = methodof(DebugToolsGeneral.PushGas); + + public static List Postfix(List __result) + { + var gasDefs = DefDatabase.AllDefsListForReading; + + for (var i = 3; i < gasDefs.Count; i++) + { + var gasDef = gasDefs[i]; + + __result.Add(new(gasDef.LabelCap, DebugActionType.ToolMap, + () => Find.CurrentMap.gasGrid.AddGas(UI.MouseCell(), gasDef, 5f))); + } + + return __result; + } + } + + public sealed class MouseOverReadOutOnGUI : FishPrepatch + { + public override string? Description { get; } + = "Adds custom gas defs to the mouse over readout on the bottom left"; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(MouseoverReadout), nameof(MouseoverReadout.MouseoverReadoutOnGUI)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + { + var drawGasMethod = AccessTools.DeclaredMethod(typeof(MouseoverReadout), nameof(MouseoverReadout.DrawGas)); + + var instructions = ilProcessor.instructions; + + var lastDrawGasIndex = instructions.Count - instructions.Reverse().FirstIndexOf(instruction + => instruction.Operand is MethodReference method && method.Is(drawGasMethod)) - 1; + + var heightVariable = instructions[lastDrawGasIndex - 1]; + if (heightVariable.OpCode != OpCodes.Ldloca_S && heightVariable.OpCode != OpCodes.Ldloca) + { + ThrowHelper.ThrowInvalidOperationException( + $"Failed to find height variable for MouseOverReadOutOnGUI patch. Expected Ldloca_S or " + + $"Ldloca, got '{heightVariable}' instead."); + } + + var cellVariable = instructions[lastDrawGasIndex - 4]; + if (!cellVariable.OpCode.Name.Contains("ldloc", StringComparison.OrdinalIgnoreCase)) + { + ThrowHelper.ThrowInvalidOperationException( + $"Failed to cell variable for MouseOverReadOutOnGUI patch. Expected Ldloc, got { + cellVariable} instead."); + } + + ilProcessor.InsertRange(lastDrawGasIndex + 1, + cellVariable, + heightVariable, + (OpCodes.Call, methodof(DrawCustomGases))); + } + + public static void DrawCustomGases(IntVec3 cell, ref float curYOffset) + { + var map = Find.CurrentMap; + var gasGrids = map.gasGrid.ParallelGasGrids(); + var cellIndex = new CellIndex(cell, map); + + for (var i = 3; i < gasGrids.Length; i++) + { + var gasGrid = gasGrids[i]; + if (!gasGrid.AnyGasAt(cellIndex)) + continue; + + Widgets.Label( + new(MouseoverReadout.BotLeft.x, UI.screenHeight - MouseoverReadout.BotLeft.y - curYOffset, 999f, + 999f), + string.Concat(gasGrid.GasDef.LabelCap, " ", + (gasGrid.DensityAt(cellIndex) / 255f).ToStringPercent("F0"))); + + curYOffset += 19f; + } + } + } + + public class ParallelGasGrid + { + private ulong[] _gasCoverageForIndicesInRandomOrder; + private byte[] _gasDensity; + + public event Action? Ticked; + + public GasDef GasDef { get; private set; } + + public int DissipationRate => GasDef.dissipationRate; + + public bool Diffuses => GasDef.diffuses; + + public Color Color => GasDef.color; + + public bool CalculateGasEffects => anyGasEverAdded; + + public Map Map; + + public int + CycleIndexDiffusion, + CycleIndexDissipation; + + public IntVec3[] CardinalDirections; + + public List CellsInRandomOrder = null!; + + public int[] + CellIndicesInRandomOrder = null!, + SourceIndicesOfRandomCells = null!; + + public bool anyGasEverAdded; + + private DissipationTicker _dissipationTicker; + private DiffusionTicker _diffusionTicker; + + public int CellCount { get; private set; } + +#pragma warning disable CS8618 + public ParallelGasGrid(Map map, GasDef gasDef) +#pragma warning restore CS8618 + => map.InvokeWhenCellIndicesReady(m => Initialize(m, gasDef)); + + private void Initialize(Map map, GasDef gasDef) + { + GasDef = gasDef; + Map = map; + CellCount = map.cellIndices.NumGridCells; + _gasDensity = new byte[CellCount]; + _gasCoverageForIndicesInRandomOrder = new ulong[((_gasDensity.Length - 1) >> 6) + 1]; + CellIndicesInRandomOrder = new int[CellCount]; + SourceIndicesOfRandomCells = new int[CellCount]; + CardinalDirections = new IntVec3[GenAdj.CardinalDirections.Length]; + Array.Copy(GenAdj.CardinalDirections, CardinalDirections, GenAdj.CardinalDirections.Length); + CycleIndexDiffusion = Rand.Range(0, map.Area >> 1); + + _dissipationTicker = new() { GasGrid = this }; + _diffusionTicker = new() { GasGrid = this }; + + Ticked += _onFirstTickAction; + } + + private static Action _onFirstTickAction = TickInitialize; + + private static void TickInitialize(ParallelGasGrid grid) + { + // map.info is somehow null during ExposeData, which itself runs after CreateComponents and initializes a + // 2nd copy of every component for each map instance, of which apparently three get created per map, two + // of those thrown away, so cellsInRandomOrder.GetAll fails and throws when accessed from either + // CreateComponents or ExposeData while loading a game. A total of 6 instances of each component get + // created per map while loading it's stupid + // Also cellsInRandomOrder itself initializes after gasGrid within CreateComponents, but that's easy to + // solve + grid.CellsInRandomOrder = grid.Map.cellsInRandomOrder.GetAll(); + grid.UpdateCellIndicesInRandomOrder(); + grid.Ticked -= _onFirstTickAction; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public int CellToIndex(in IntVec3 cell) => cell.CellToIndex(Map); + + public void UpdateCellIndicesInRandomOrder() + { + if (Map.cellIndices.NumGridCells != CellCount) + { + Log.Error($"Map size changed from {CellCount} to { + Map.cellIndices.NumGridCells}. This is not supported."); + return; + } + + var mapSizeX = Map.Size.x; + for (var i = CellIndicesInRandomOrder.Length; i-- > 0;) + { + SourceIndicesOfRandomCells[ + CellIndicesInRandomOrder[i] = CellIndicesUtility.CellToIndex(CellsInRandomOrder[i], mapSizeX)] = i; + } + + _gasCoverageForIndicesInRandomOrder.Clear(); + + for (var i = _gasDensity.Length; i-- > 0;) + { + if (_gasDensity[i] > 0) + SetDirect(i, _gasDensity[i]); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool AnyGasAt(int idx) => _gasDensity[idx] > 0; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool AnyGasAt(in IntVec3 cell) => AnyGasAt(CellToIndex(cell)); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool AnyGasAt(CellIndex cellIndex) => AnyGasAt(cellIndex.Value); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public byte DensityAt(int index) => _gasDensity[index]; + + public byte DensityAt(in IntVec3 cell) => DensityAt(CellToIndex(cell)); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public byte DensityAt(CellIndex cellIndex) => DensityAt(cellIndex.Value); + + public void SetDirect(in IntVec3 cell, byte density) => SetDirect(CellToIndex(cell), density); + + public void SetDirect(CellIndex cellIndex, byte density) => SetDirect(cellIndex.Value, density); + + public void SetDirect(int index, byte density) + { + _gasDensity[index] = density; + + index = SourceIndicesOfRandomCells[index]; + + ref var gasCoverageBucket = ref _gasCoverageForIndicesInRandomOrder[index >> 6]; + var hasGas = density > 0; + gasCoverageBucket ^= ((ulong)-(long)hasGas.AsInt() ^ gasCoverageBucket) & (1UL << (index & 63)); + anyGasEverAdded |= hasGas; + } + + public void AddGas(CellIndex cellIndex, int amount, bool canOverflow = true) + => AddGas(IndexToCell(cellIndex.Value), amount, canOverflow); + + public void AddGas(in IntVec3 cell, int amount, bool canOverflow = true) + { + if (amount <= 0 || !GasCanMoveTo(cell)) + return; + + anyGasEverAdded = true; + var index = CellToIndex(cell); + + SetDirect(index, AdjustedDensity(_gasDensity[index] + amount, out var overflow)); + + Map.mapDrawer.MapMeshDirty(cell, MapMeshFlag.Gas); + + if (canOverflow && overflow > 0) + Overflow(cell, overflow); + } + + private static byte AdjustedDensity(int newDensity, out int overflow) + { + if (newDensity > 255) + { + overflow = newDensity - 255; + return byte.MaxValue; + } + + overflow = 0; + if (newDensity < 0) + return 0; + + return (byte)newDensity; + } + + private void Overflow(in IntVec3 cell, int amount) + { + if (amount <= 0) + return; + + var remainingAmount = amount; + + Map.floodFiller.FloodFill(cell, GasCanMoveTo, c => + { + var num = Mathf.Min(remainingAmount, 255 - DensityAt(c)); + if (num > 0) + { + AddGas(c, num, false); + remainingAmount -= num; + } + + return remainingAmount <= 0; + }, GenRadial.NumCellsInRadius(40f), true); + } + + public void Clear() + { + _gasCoverageForIndicesInRandomOrder.Clear(); + _gasDensity.Clear(); + anyGasEverAdded = false; + } + + private abstract class BitwiseGasTicker + { + public required ParallelGasGrid GasGrid; + public abstract ref int CellCycleIndex { get; } + + public void TickCells(int area, int cellCountToTick) + { + var cellCycleIndex = CellCycleIndex; + + if ((cellCycleIndex & 63) != 0) + TickOddCells(area, ref cellCycleIndex); + + var gasCoverageArray = GasGrid._gasCoverageForIndicesInRandomOrder; + + cellCountToTick >>= 6; + cellCountToTick += 1; + for (var i = 0; i < cellCountToTick; i++) + { + if (area - cellCycleIndex < 64) + TickOddCells(area, ref cellCycleIndex); + + var gasCoverage = gasCoverageArray[cellCycleIndex >> 6]; + if (gasCoverage != default) + TickBucket(gasCoverage, cellCycleIndex); + + cellCycleIndex += 64; + } + + CellCycleIndex = cellCycleIndex; + } + + private void TickBucket(ulong gasCoverage, int cellCycleIndex) + { + for (var i = 0; i < 64;) + { + var gasCoverageSlice = (gasCoverage >> i) & 0xFF; + if (gasCoverageSlice == default) + { + i += 8; + continue; + } + + for (var j = 0; j < 8; j++) + { + if (((gasCoverageSlice >> j) & 1UL) != default) + TickingAction(cellCycleIndex + i); + + i++; + } + } + } + + public abstract void TickingAction(int cellCycleIndex); + + [MethodImpl(MethodImplOptions.NoInlining)] + private void TickOddCells(int area, ref int cellCycleIndex) + { + if (cellCycleIndex < area) + { + var gasCoverage = GasGrid._gasCoverageForIndicesInRandomOrder[cellCycleIndex >> 6]; + + do + { + if ((cellCycleIndex & 63) == 0) + return; + + if (((gasCoverage >> cellCycleIndex) & 1UL) != default) + TickingAction(cellCycleIndex); + + cellCycleIndex++; + } + while (cellCycleIndex < area); + } + + cellCycleIndex = 0; + } + } + + private sealed class DissipationTicker : BitwiseGasTicker + { + public override ref int CellCycleIndex => ref GasGrid.CycleIndexDissipation; + + public override void TickingAction(int cellCycleIndex) + => GasGrid.DissipateGasAt(GasGrid.CellIndicesInRandomOrder[cellCycleIndex]); + } + + private sealed class DiffusionTicker : BitwiseGasTicker + { + public override ref int CellCycleIndex => ref GasGrid.CycleIndexDiffusion; + + public override void TickingAction(int cellCycleIndex) + => GasGrid.DiffuseGasAt(GasGrid.CellsInRandomOrder[cellCycleIndex]); + } + + public void Tick() + { + if (!CalculateGasEffects) + { +#if GAS_DEBUG_L1 + if (CheckCurrentlyContainsGas()) + { + anyGasEverAdded = true; + Debug.LogIncorrectAnyGasEverAdded(this); + } +#endif + + return; + } + + Ticked?.Invoke(this); + + var area = Map.Area; + // CellsInRandomOrder = Map.cellsInRandomOrder.GetAll(); + // UpdateCellIndicesInRandomOrder(); + // Assigned in PostInitialize instead. Ludeon was likely doing this due to component construction order in + // Map.ConstructComponents + +#if GAS_DEBUG_L2 + using var previousDensity = new PooledArray(_gasDensity.Length); + Array.Copy(_gasDensity, 0, previousDensity.BackingArray, 0, _gasDensity.Length); +#endif + + _dissipationTicker.TickCells(area, (area + 63) >> 6); // Mathf.CeilToInt(area * (1f / 64f)) + + if (Diffuses) + _diffusionTicker.TickCells(area, (area + 31) >> 5); // Mathf.CeilToInt(area * (1f / 32f)) + +#if GAS_DEBUG_L2 + Debug.LogTotalGasChange(this, previousDensity); +#endif + + if (Map.IsHashIntervalTick(600)) + RecalculateEverHadGas(); + } + + [MethodImpl(MethodImplOptions.NoInlining)] + public void RecalculateEverHadGas() => anyGasEverAdded = CheckCurrentlyContainsGas(); + + private bool CheckCurrentlyContainsGas() + { + for (var i = _gasCoverageForIndicesInRandomOrder.Length; i-- > 0;) + { + if (_gasCoverageForIndicesInRandomOrder[i] != default) + return true; + } + + return false; + } + + private void DissipateGasAt(int index) + { +#if GAS_DEBUG_L1 + var previousDensity = _gasDensity[index]; + if (previousDensity == 0) + Debug.LogInvalidDissipationAttempt(this, index); +#endif + + var densityAfterDissipation = Math.Max(_gasDensity[index] - DissipationRate, 0); + + Debug.LogDissipationRate(this, index, densityAfterDissipation); + SetDirect(index, (byte)densityAfterDissipation); + +#if GAS_DEBUG_L1 + if (_gasDensity[index] >= previousDensity) + Debug.LogFailedDissipation(this, index, previousDensity); +#endif + + if (densityAfterDissipation == 0) + { + Debug.LogMapMeshDirty(this, index); + Map.mapDrawer.MapMeshDirty(IndexToCell(index), MapMeshFlag.Gas); + } + } + + private void DiffuseGasAt(IntVec3 cell) + { + var originCellIndex = CellToIndex(cell); + int densityAtOriginCell = _gasDensity[originCellIndex]; + if (densityAtOriginCell < 17) + return; + + var diffusedToAnyCell = false; + CardinalDirections.Shuffle(); + + for (var i = 0; i < CardinalDirections.Length; i++) + { + var otherCell = cell + CardinalDirections[i]; + if (!GasCanMoveTo(otherCell)) + continue; + + var otherCellIndex = CellToIndex(otherCell); + int densityOtOtherCell = _gasDensity[otherCellIndex]; + + if (!TryDiffuseIndividualGas(ref densityAtOriginCell, ref densityOtOtherCell)) + continue; + + SetDirect(otherCellIndex, (byte)densityOtOtherCell); + Map.mapDrawer.MapMeshDirty(otherCell, MapMeshFlag.Gas); + diffusedToAnyCell = true; + if (densityAtOriginCell < 17) + break; + } + + if (!diffusedToAnyCell) + return; + + SetDirect(originCellIndex, (byte)densityAtOriginCell); + Map.mapDrawer.MapMeshDirty(cell, MapMeshFlag.Gas); + } + + private static bool TryDiffuseIndividualGas(ref int gasA, ref int gasB) + { + if (gasA < 17) + return false; + + var num = Mathf.Abs(gasA - gasB) >> 1; + + if (gasA <= gasB || num < 17) + return false; + + Debug.LogDiffusionRate(gasA, gasB, num); + + gasA -= num; + gasB += num; + +#if GAS_DEBUG_L1 + if (gasA < 0 || gasB < 0) + Log.Error("Diffused below 0!"); +#endif + + return true; + } + + public bool GasCanMoveTo(IntVec3 cell) + { + if (!cell.InBounds(Map)) + return false; + if (cell.Filled(Map)) + return cell.GetDoor(Map)?.Open ?? false; + return true; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private IntVec3 IndexToCell(int index) + => CellIndicesUtility.IndexToCell(index, Map.cellIndices.mapSizeX); + + /// + /// For modders. Performance Fish doesn't automatically scribe added custom defs. + /// + public void Scribe(string label) + => MapExposeUtility.ExposeUshort(Map, + cell => DensityAt(cell), + (cell, value) => SetDirect(cell, (byte)value), + label); + + // ReSharper disable UnusedMember.Local + private static class Debug + { + [MethodImpl(MethodImplOptions.NoInlining)] + [Conditional("GAS_DEBUG_L1")] + internal static void LogIncorrectAnyGasEverAdded(ParallelGasGrid grid) + { + var gasDensities = grid._gasDensity; + var firstCellIndexWithGas = Array.FindIndex(gasDensities, static g => g > 0); + + Log.Error($"GasGrid of type '{grid.GasDef.defName}' contains gas at cell '{ + grid.IndexToCell(firstCellIndexWithGas)}' with index { + firstCellIndexWithGas}, but anyGasEverAdded=false. This index had a source index of { + grid.SourceIndicesOfRandomCells[firstCellIndexWithGas]} before randomization"); + } + + [MethodImpl(MethodImplOptions.NoInlining)] + [Conditional("GAS_DEBUG_L1")] + internal static void LogInvalidDissipationAttempt(ParallelGasGrid grid, int index) + => Log.Error($"Tried to dissipate gas at cell '{ + grid.IndexToCell(index)}' with density of 0"); + + [MethodImpl(MethodImplOptions.NoInlining)] + [Conditional("GAS_DEBUG_L1")] + internal static void LogFailedDissipation(ParallelGasGrid grid, int index, byte previousDensity) + => Log.Error($"GasDensity went from '{previousDensity}' to '{grid._gasDensity[index]}' at cell '{ + grid.IndexToCell(index)}' while trying to dissipate. It should've decreased"); + + [MethodImpl(MethodImplOptions.NoInlining)] + [Conditional("GAS_DEBUG_L2")] + internal static void LogTotalGasChange(ParallelGasGrid grid, PooledArray previousDensity) + => Log.Message($"Total density for {grid.GasDef.defName} changed from { + previousDensity.Sum(static b => b)} to {grid._gasDensity.Sum(static b => b)}"); + + [Conditional("GAS_DEBUG_L3")] + internal static void LogMapMeshDirty(ParallelGasGrid grid, int index) + => Log.Message($"Dirtied MapMesh for '{grid.GasDef.defName}' at '{index}'"); + + [Conditional("GAS_DEBUG_L3")] + internal static void LogDissipationRate(ParallelGasGrid grid, int index, int desiredResult) + => Log.Message($"Dissipating {grid._gasDensity[index] - desiredResult} gas of type '{ + grid.GasDef.defName}' at cell '{grid.IndexToCell(index)}' with target rate { + grid.DissipationRate}. Was {grid._gasDensity[index]}, becomes {desiredResult}"); + + [Conditional("GAS_DEBUG_L3")] + internal static void LogDiffusionRate(int gasA, int gasB, int num) + => Log.Message($"Diffusing {num} gas from cell with density {gasA} to cell with density {gasB}"); + } + // ReSharper restore UnusedMember.Local + } +} \ No newline at end of file diff --git a/Source/PerformanceFish/GenLocalDateCaching.cs b/Source/PerformanceFish/GenLocalDateCaching.cs index 12676a5..0fcfb04 100644 --- a/Source/PerformanceFish/GenLocalDateCaching.cs +++ b/Source/PerformanceFish/GenLocalDateCaching.cs @@ -10,9 +10,9 @@ using System.Reflection.Emit; namespace PerformanceFish; -public class GenLocalDateCaching : ClassWithFishPatches +public sealed class GenLocalDateCaching : ClassWithFishPatches { - public class DayTickByThing_Patch : FishPatch + public sealed class DayTickByThing_Patch : FishPatch { public override string Description { get; } = "Caches results of GenLocalDate.DayTick for the first map. This is similar to Rim73's mind state " @@ -60,7 +60,7 @@ public class GenLocalDateCaching : ClassWithFishPatches //} } - public class DayTickByMap_Patch : FishPatch + public sealed class DayTickByMap_Patch : FishPatch { public override string Description { get; } = "Caches results of GenLocalDate.DayTick for the first map. This is similar to Rim73's mind state " diff --git a/Source/PerformanceFish/GenTypesPatches.cs b/Source/PerformanceFish/GenTypesPatches.cs index 8a120c5..8e3fab4 100644 --- a/Source/PerformanceFish/GenTypesPatches.cs +++ b/Source/PerformanceFish/GenTypesPatches.cs @@ -10,9 +10,9 @@ using PerformanceFish.Prepatching; namespace PerformanceFish; -public class GenTypesPatches : ClassWithFishPrepatches +public sealed class GenTypesPatches : ClassWithFishPrepatches { - public class AllTypes : FishPrepatch + public sealed class AllTypes : FishPrepatch { public override string? Description { get; } = "Fix for thread safety. The vanilla method was rarely breaking and preventing the game from loading"; @@ -29,7 +29,7 @@ public class GenTypesPatches : ClassWithFishPrepatches public static void Postfix() => Monitor.Exit(Lock); // TODO: replace with finalizer } - public class AllTypesWithAttribute : FishPrepatch + public sealed class AllTypesWithAttribute : FishPrepatch { public override string? Description { get; } = "Fix for thread safety. The vanilla method was rarely breaking and preventing the game from loading"; @@ -62,7 +62,7 @@ public class GenTypesPatches : ClassWithFishPrepatches => static type => type.HasAttribute(); } - public class AllSubclasses : FishPrepatch + public sealed class AllSubclasses : FishPrepatch { public override string? Description { get; } = "Fix for thread safety. The vanilla method was rarely breaking and preventing the game from loading"; @@ -94,14 +94,14 @@ public class GenTypesPatches : ClassWithFishPrepatches public static Func Predicate = new PredicateClass().Invoke; - public class PredicateClass + public sealed class PredicateClass { public Type? BaseType; public bool Invoke(Type type) => type.IsSubclassOf(BaseType!); } } - public class AllSubclassesNonAbstract : FishPrepatch + public sealed class AllSubclassesNonAbstract : FishPrepatch { public override string? Description { get; } = "Fix for thread safety, paired with a small optimization for faster loading. The vanilla method was " diff --git a/Source/PerformanceFish/GeneTrackerOptimization.cs b/Source/PerformanceFish/GeneTrackerOptimization.cs index 722eb07..e423e57 100644 --- a/Source/PerformanceFish/GeneTrackerOptimization.cs +++ b/Source/PerformanceFish/GeneTrackerOptimization.cs @@ -10,9 +10,9 @@ using PerformanceFish.Prepatching; namespace PerformanceFish; -public class GeneTrackerOptimization : ClassWithFishPrepatches +public sealed class GeneTrackerOptimization : ClassWithFishPrepatches { - public class GeneTrackerTickPatch : FishPrepatch + public sealed class GeneTrackerTickPatch : FishPrepatch { public override string? Description { get; } = "Every pawn has a gene tracker, which is responsible for ticking each of their genes. Normally it ticks " @@ -41,7 +41,7 @@ public class GeneTrackerOptimization : ClassWithFishPrepatches genesToTick[i].Tick(); } - if (instance.pawn.Spawned + if (instance.pawn.IsSpawned() && instance.Xenotype != XenotypeDefOf.Baseliner && instance.pawn.IsHashIntervalTick(300)) { diff --git a/Source/PerformanceFish/GetCompCaching.cs b/Source/PerformanceFish/GetCompCaching.cs index 0a01b50..5bbe788 100644 --- a/Source/PerformanceFish/GetCompCaching.cs +++ b/Source/PerformanceFish/GetCompCaching.cs @@ -10,9 +10,9 @@ using RimWorld.Planet; namespace PerformanceFish; -public class GetCompCaching : ClassWithFishPrepatches +public sealed class GetCompCaching : ClassWithFishPrepatches { - public class ThingCompPatch : FishPrepatch + public sealed class ThingCompPatch : FishPrepatch { public override string? Description { get; } = "Optimizes GetComp lookups with a fast custom dictionary implementation. This is often more than 10x " @@ -73,7 +73,132 @@ public class GetCompCaching : ClassWithFishPrepatches } } - public class HediffCompPatch : FishPrepatch + public sealed class ThingCompPropertiesPatch : FishPrepatch + { + public override string? Description { get; } + = "Optimizes GetCompProperties lookups with a fast custom dictionary implementation. This is often more " + + "than 10x faster than the vanilla method. Replaces Performance Optimizer's error prone and slower " + + "optimization."; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.Method(typeof(ThingDef), nameof(ThingDef.GetCompProperties)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(GetCompProperties); + + public static T? GetCompProperties(ThingDef thingDef) where T : CompProperties + { + if (thingDef.comps != null) + { + ref var cache = ref Cache.ByInt>.GetOrAddReference(thingDef.shortHash); + return !cache.IsDirty(thingDef.comps) ? cache.Comp : UpdateCache(thingDef, ref cache); + } + return null; + } + + [MethodImpl(MethodImplOptions.NoInlining)] + public static T? UpdateCache(ThingDef thingDef, ref CacheValue cache) + where T : CompProperties + { + for (var i = 0; i < thingDef.comps.Count; i++) + { + if (thingDef.comps[i] is not T comp) + continue; + + cache.Update(thingDef, comp); + return comp; + } + + cache.Update(thingDef, null); + return null; + } + + public record struct CacheValue where T : CompProperties + { + private int _listVersion = -1; + public T? Comp; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool IsDirty(List comps) => comps._version != _listVersion; + + [MethodImpl(MethodImplOptions.NoInlining)] + public void Update(ThingDef thingDef, T? comp) + { + if (thingDef.shortHash == default) + return; + + _listVersion = thingDef.comps._version; + Comp = comp; + } + + public CacheValue() {} + } + } + + public sealed class ThingDefHasCompPatch : FishPrepatch + { + public override string? Description { get; } + = "Optimizes HasComp lookups with a fast custom dictionary implementation. This is often more than 10x " + + "faster than the vanilla method. Replaces Performance Optimizer's error prone and slower optimization."; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.Method(typeof(ThingDef), nameof(ThingDef.HasComp)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(HasComp); + + public static bool HasComp(ThingDef thingDef, Type compType) + { + if (thingDef.comps != null) + { + ref var cache + = ref Cache.ByReference.GetOrAddReference(thingDef.shortHash, + compType.TypeHandle); + + return !cache.IsDirty(thingDef.comps) ? cache.HasComp : UpdateCache(thingDef, compType, ref cache); + } + return false; + } + + [MethodImpl(MethodImplOptions.NoInlining)] + public static bool UpdateCache(ThingDef thingDef, Type compType, ref CacheValue cache) + { + for (var i = 0; i < thingDef.comps.Count; i++) + { + if (thingDef.comps[i].compClass != compType) + continue; + + cache.Update(thingDef, true); + return true; + } + + cache.Update(thingDef, false); + return false; + } + + public record struct CacheValue + { + private int _listVersion = -1; + public bool HasComp; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool IsDirty(List comps) => comps._version != _listVersion; + + [MethodImpl(MethodImplOptions.NoInlining)] + public void Update(ThingDef thingDef, bool hasComp) + { + if (thingDef.shortHash == default) + return; + + _listVersion = thingDef.comps._version; + HasComp = hasComp; + } + + public CacheValue() {} + } + } + + public sealed class HediffCompPatch : FishPrepatch { public override string? Description { get; } = "Optimizes GetComp lookups with a fast custom dictionary implementation. This is often more than 10x " @@ -134,7 +259,7 @@ public class GetCompCaching : ClassWithFishPrepatches } } - public class HediffCompPropsPatch : FishPrepatch + public sealed class HediffCompPropsPatch : FishPrepatch { public override string? Description { get; } = "Optimizes GetComp lookups with a fast custom dictionary implementation. This is often more than 10x " @@ -195,7 +320,7 @@ public class GetCompCaching : ClassWithFishPrepatches } } - public class AbilityCompPatch : FishPrepatch + public sealed class AbilityCompPatch : FishPrepatch { public override string? Description { get; } = "Optimizes GetComp lookups with a fast custom dictionary implementation. This is often more than 10x " @@ -256,7 +381,7 @@ public class GetCompCaching : ClassWithFishPrepatches } } - public class WorldObjectCompPatch : FishPrepatch + public sealed class WorldObjectCompPatch : FishPrepatch { public override string? Description { get; } = "Optimizes GetComp lookups with a fast custom dictionary implementation. This is often more than 10x " @@ -312,7 +437,7 @@ public class GetCompCaching : ClassWithFishPrepatches } } - public class MapComponentPatch : FishPrepatch + public sealed class MapComponentPatch : FishPrepatch { public override string? Description { get; } = "Optimizes GetComp lookups with a fast custom dictionary implementation. This is often more than 10x " @@ -368,7 +493,7 @@ public class GetCompCaching : ClassWithFishPrepatches } } - public class WorldComponentPatch : FishPrepatch + public sealed class WorldComponentPatch : FishPrepatch { public override string? Description { get; } = "Optimizes GetComp lookups with a fast custom dictionary implementation. This is often more than 10x " @@ -419,7 +544,7 @@ public class GetCompCaching : ClassWithFishPrepatches } } - public class GameComponentPatch : FishPrepatch + public sealed class GameComponentPatch : FishPrepatch { public override string? Description { get; } = "Optimizes GetComp lookups with a fast custom dictionary implementation. This is often more than 10x " diff --git a/Source/PerformanceFish/GroupThingPair.cs b/Source/PerformanceFish/GroupThingPair.cs new file mode 100644 index 0000000..7984172 --- /dev/null +++ b/Source/PerformanceFish/GroupThingPair.cs @@ -0,0 +1,58 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using JetBrains.Annotations; + +namespace PerformanceFish; + +[UsedImplicitly(ImplicitUseTargetFlags.WithMembers)] +public record struct GroupThingPair +{ + private uint _data; + + public ThingRequestGroup ThingRequestGroup + { + get => (ThingRequestGroup)(byte)(_data >> 24); // fewer hash collisions this way than in rightmost bit + set => _data = (_data & 0x00_FF_FF_FF) | ((uint)value << 24); + } + + public int ThingIDNumber + { + get => (int)(_data & 0x00_FF_FF_FF); // 24 bit, 16.8m MaxValue + set => _data = (_data & 0xFF_00_00_00) | (uint)(value & 0x00_FF_FF_FF); + } + + public GroupThingPair(ThingRequestGroup thingRequestGroup, int thingIDNumber) + => _data = ((uint)thingRequestGroup << 24) | (0x00_FF_FF_FF & (uint)thingIDNumber); + + public bool Equals(GroupThingPair other) => _data == other._data; + + public override int GetHashCode() => unchecked((int)_data); +} + +// [UsedImplicitly(ImplicitUseTargetFlags.WithMembers)] +// public record struct GroupThingPair +// { +// private uint _data; +// +// public ThingRequestGroup ThingRequestGroup +// { +// get => (ThingRequestGroup)(byte)_data; +// set => _data = (_data & 0xFF_FF_FF_00) | (byte)value; +// } +// +// public int ThingIDNumber +// { +// get => (int)(_data >> 8); // 24 bit, 16.8m MaxValue +// set => _data = (_data & 0xFF) | (uint)(value << 8); +// } +// +// public GroupThingPair(ThingRequestGroup thingRequestGroup, int thingIDNumber) +// => _data = (uint)thingRequestGroup | ((uint)thingIDNumber << 8); +// +// public bool Equals(GroupThingPair other) => _data == other._data; +// +// public override int GetHashCode() => Unsafe.As(ref _data); +// } \ No newline at end of file diff --git a/Source/PerformanceFish/Hauling/GridsUtilityPatches.cs b/Source/PerformanceFish/Hauling/GridsUtilityPatches.cs new file mode 100644 index 0000000..a8e6dc1 --- /dev/null +++ b/Source/PerformanceFish/Hauling/GridsUtilityPatches.cs @@ -0,0 +1,62 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using Mono.Cecil; +using Mono.Cecil.Cil; +using PerformanceFish.Events; +using PerformanceFish.Prepatching; + +namespace PerformanceFish.Hauling; + +public sealed class GridsUtilityPatches : ClassWithFishPrepatches +{ + public sealed class GetItemCountPatch : FishPrepatch + { + public override int Priority => HarmonyLib.Priority.First; + + public override string? Description { get; } + = "Caches item counts in a grid, to not have to repeat counting on every request."; + + public override MethodBase TargetMethodBase { get; } = methodof(GridsUtility.GetItemCount); + + protected internal override void BeforeHarmonyPatching() => ThingEvents.Initialized += TryRegister; + + public static void TryRegister(Thing thing) + { + if (!thing.IsItem()) + return; + + var thingEvents = thing.Events(); + thingEvents.RegisteredAtThingGrid += Increment; + thingEvents.DeregisteredAtThingGrid += Decrement; + } + + public static void Increment(Thing thing, Map map, in IntVec3 cell) + => map.ItemCountGrid()[cell]++; + + public static void Decrement(Thing thing, Map map, in IntVec3 cell) + { + ref var itemCount = ref map.ItemCountGrid()[cell]; + itemCount--; + + if (itemCount < 0) + { + itemCount = 0; + ErrorForInvalidCount(thing); + } + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private static void ErrorForInvalidCount(Thing thing) + => Log.Error($"Tried decrementing item count at cell {thing.Position} for thing '{ + thing}', but it was already 0. This should never happen."); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int ReplacementBody(IntVec3 c, Map map) => map.ItemCountGrid()[c]; + } +} \ No newline at end of file diff --git a/Source/PerformanceFish/Hauling/HaulDestinationManagerCache.cs b/Source/PerformanceFish/Hauling/HaulDestinationManagerCache.cs new file mode 100644 index 0000000..1c67060 --- /dev/null +++ b/Source/PerformanceFish/Hauling/HaulDestinationManagerCache.cs @@ -0,0 +1,31 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +namespace PerformanceFish.Hauling; + +public record struct HaulDestinationManagerCache +{ + public static readonly int StoragePriorityCount = Enum.GetValues(typeof(StoragePriority)).Length; + + public event Action? PriorityChanged; + + public int[] GroupCountByPriority = new int[StoragePriorityCount]; + + [MethodImpl(MethodImplOptions.NoInlining)] + public void OnPriorityChanged(HaulDestinationManager manager) + { + var slotGroupsByPriority = manager.AllGroupsListInPriorityOrder; + + Array.Clear(GroupCountByPriority, 0, GroupCountByPriority.Length); + for (var i = slotGroupsByPriority.Count; i-- > 0;) + GroupCountByPriority[(int)slotGroupsByPriority[i].Settings.Priority]++; + + PriorityChanged?.Invoke(manager); + } + + public HaulDestinationManagerCache() + { + } +} \ No newline at end of file diff --git a/Source/PerformanceFish/Hauling/HaulDestinationManagerPatches.cs b/Source/PerformanceFish/Hauling/HaulDestinationManagerPatches.cs new file mode 100644 index 0000000..a1cf443 --- /dev/null +++ b/Source/PerformanceFish/Hauling/HaulDestinationManagerPatches.cs @@ -0,0 +1,53 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using PerformanceFish.Prepatching; + +namespace PerformanceFish.Hauling; + +public sealed class HaulDestinationManagerPatches : ClassWithFishPrepatches +{ + public sealed class Notify_HaulDestinationChangedPriorityPatch : FishPrepatch + { + public override bool ShowSettings => false; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(HaulDestinationManager), + nameof(HaulDestinationManager.Notify_HaulDestinationChangedPriority)); + + public static void Postfix(HaulDestinationManager __instance) + => __instance.Cache().OnPriorityChanged(__instance); + } + + public sealed class AddHaulDestinationPatch : FishPrepatch + { + public override bool ShowSettings => false; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(HaulDestinationManager), + nameof(HaulDestinationManager.AddHaulDestination)); + + public static void Postfix(HaulDestinationManager __instance, IHaulDestination haulDestination) + { + if (haulDestination is ISlotGroupParent) + __instance.Cache().OnPriorityChanged(__instance); + } + } + + public sealed class RemoveHaulDestinationPatch : FishPrepatch + { + public override bool ShowSettings => false; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(HaulDestinationManager), + nameof(HaulDestinationManager.RemoveHaulDestination)); + + public static void Postfix(HaulDestinationManager __instance, IHaulDestination haulDestination) + { + if (haulDestination is ISlotGroupParent) + __instance.Cache().OnPriorityChanged(__instance); + } + } +} \ No newline at end of file diff --git a/Source/PerformanceFish/Hauling/LwmCompCacheValue.cs b/Source/PerformanceFish/Hauling/LwmCompCacheValue.cs new file mode 100644 index 0000000..a0ef995 --- /dev/null +++ b/Source/PerformanceFish/Hauling/LwmCompCacheValue.cs @@ -0,0 +1,38 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +global using LwmCompCache = PerformanceFish.Cache.ByReference; + +namespace PerformanceFish.Hauling; + +public record struct LwmCompCacheValue +{ + public CompProperties? CompProperties; + + public static CompProperties? TryGetLwmProps(Thing slotGroupParent) + => ModCompatibility.Types.LWM.CompProperties != null + ? slotGroupParent.def.comps?.Find(static props + => props.GetType() == ModCompatibility.Types.LWM.CompProperties) + : null; + + static LwmCompCacheValue() => EnsureInitialized(); + + public static void EnsureInitialized() + { + if (Interlocked.Exchange(ref _initialized, 1) == 0) + LwmCompCache.ValueInitializer = static key => new() { CompProperties = TryGetLwmProps(key) }; + } + + private static volatile int _initialized; + + public static AccessTools.FieldRef? + LwmMaxNumberStacks = TryGetLwmField("maxNumberStacks"), + LwmMinNumberStacks = TryGetLwmField("minNumberStacks"); + + private static AccessTools.FieldRef? TryGetLwmField(string name) + => ModCompatibility.Types.LWM.CompProperties is { } propsType + ? AccessTools.FieldRefAccess(AccessTools.Field(propsType, name)) + : null; +} \ No newline at end of file diff --git a/Source/PerformanceFish/Hauling/SlotGroupExtensions.cs b/Source/PerformanceFish/Hauling/SlotGroupExtensions.cs new file mode 100644 index 0000000..7f4da02 --- /dev/null +++ b/Source/PerformanceFish/Hauling/SlotGroupExtensions.cs @@ -0,0 +1,147 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using System.Diagnostics.CodeAnalysis; +using FisheryLib.Pools; + +namespace PerformanceFish.Hauling; + +public static class SlotGroupExtensions +{ + public const int + MINIMUM_DISTRICT_COUNT = 3, + MINIMUM_DISTRICT_SLOTS = 9, + MINIMUM_DISTRICT_CELLS = 3; + + public static bool ShouldHaveDistricts([NotNullWhen(true)] this SlotGroup? slotGroup, out int cellCountIfTrue, + out int totalSlotsIfTrue) + { + if (slotGroup is null || slotGroup.parent is Building { Spawned: false }) + { + Unsafe.SkipInit(out cellCountIfTrue); + goto False; + } + + cellCountIfTrue = slotGroup.CellsList.Count; + if (cellCountIfTrue >= MINIMUM_DISTRICT_COUNT * MINIMUM_DISTRICT_CELLS) + { + return (totalSlotsIfTrue = slotGroup.GetTotalSlots(cellCountIfTrue)) + >= MINIMUM_DISTRICT_COUNT * MINIMUM_DISTRICT_SLOTS; + } + + False: + Unsafe.SkipInit(out totalSlotsIfTrue); + return false; + } + + [MethodImpl(MethodImplOptions.NoInlining)] + public static void ResetAndRemakeDistricts(this SlotGroup slotGroup) + { + slotGroup.ResetDistricts(); + slotGroup.NotifyCellCountChanged(); + } + + public static void ResetDistricts(this SlotGroup slotGroup) + { + ref var districts = ref slotGroup.Districts(); + + for (var i = districts.Length; i-- > 0;) + districts[i].Dispose(); + + districts = StorageDistrict.GetDefaultArray(); + } + + public static void NotifyCellCountChanged(this SlotGroup slotGroup) + { + if (slotGroup.ShouldHaveDistricts(out var cellCount, out var totalSlots)) + slotGroup.AdjustDistricts(totalSlots, cellCount); + else + slotGroup.ResetDistricts(); + } + + public static void AdjustDistricts(this SlotGroup slotGroup, int totalSlots, int cellCount, + Span cellsToAdd = default, Span cellsToRemove = default) + { + var districtCount = Math.Min(totalSlots / MINIMUM_DISTRICT_SLOTS, cellCount / MINIMUM_DISTRICT_COUNT); + ref var districts = ref slotGroup.Districts(); + + using var cellBufferPooled = new PooledIList>(); + var cellBuffer = cellBufferPooled.List; + var hasDistricts = districts.Length > 1; + + if (cellsToRemove.Length > 0) + { + if (hasDistricts) + { + for (var i = cellsToRemove.Length; i-- > 0;) + { + for (var j = districts.Length; j-- > 0;) + { + if (districts[j].TryRemoveCell(cellsToRemove[i])) + break; + } + } + } + else + { + Log.Error($"Tried removing cells from districts in slotGroup of { + slotGroup.parent}, but none exist."); + } + } + + if (cellsToAdd.Length > 0 && hasDistricts) + { + for (var i = cellsToAdd.Length; i-- > 0;) + cellBuffer.Add(cellsToAdd[i]); + } + + if (hasDistricts) + { + if (districts.Length > districtCount) + { + for (var i = districtCount - 1; i < districts.Length; i++) + cellBuffer.AddRange(districts[i].Cells); + } + } + else + { + cellBuffer.AddRange(slotGroup.CellsList); + } + + if (districts.Length != districtCount) + { + if (hasDistricts) + Array.Resize(ref districts, districtCount); + else + districts = new StorageDistrict[districtCount]; + + for (var i = 0; i < districts.Length; i++) + ((StorageDistrict?[])districts)[i] ??= new(slotGroup); + } + + var districtSize = cellCount / districtCount; + var finalDistrictSize = cellCount - (districtSize * (districtCount - 1)); + + for (var i = 0; i < districtCount; i++) + { + var district = districts[i]; + var desiredDistrictSize = i != districtCount - 1 ? districtSize : finalDistrictSize; + + while (district.Cells.Count > desiredDistrictSize) + cellBuffer.Add(district.PopCell()); + } + + for (var i = 0; i < districtCount; i++) + { + var district = districts[i]; + + while (district.Cells.Count < districtSize) + district.AddCell(cellBuffer.Pop()); + } + + while (cellBuffer.Count > 0) + districts[^1].AddCell(cellBuffer.Pop()); + } +} \ No newline at end of file diff --git a/Source/PerformanceFish/Hauling/SlotGroupPrepatches.cs b/Source/PerformanceFish/Hauling/SlotGroupPrepatches.cs new file mode 100644 index 0000000..a4449bb --- /dev/null +++ b/Source/PerformanceFish/Hauling/SlotGroupPrepatches.cs @@ -0,0 +1,44 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using PerformanceFish.Prepatching; + +namespace PerformanceFish.Hauling; + +public sealed class SlotGroupPrepatches : ClassWithFishPrepatches +{ + public sealed class Notify_AddedCellPatch : FishPrepatch + { + public override bool ShowSettings => false; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(SlotGroup), nameof(SlotGroup.Notify_AddedCell)); + + public static void Postfix(SlotGroup __instance, IntVec3 c) + { + if (__instance.ShouldHaveDistricts(out var cellCount, out var totalSlots)) + __instance.AdjustDistricts(totalSlots, cellCount, stackalloc IntVec3[] { c }); + } + } + + public sealed class Notify_LostCellPatch : FishPrepatch + { + public override bool ShowSettings => false; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(SlotGroup), nameof(SlotGroup.Notify_LostCell)); + + public static void Postfix(SlotGroup __instance, IntVec3 c) + { + if (__instance.Districts().Length <= 1) + return; + + if (__instance.ShouldHaveDistricts(out var cellCount, out var totalSlots)) + __instance.AdjustDistricts(totalSlots, cellCount, cellsToRemove: stackalloc IntVec3[] { c }); + else + __instance.ResetDistricts(); + } + } +} \ No newline at end of file diff --git a/Source/PerformanceFish/Hauling/StorageDistrict.cs b/Source/PerformanceFish/Hauling/StorageDistrict.cs new file mode 100644 index 0000000..b05ba87 --- /dev/null +++ b/Source/PerformanceFish/Hauling/StorageDistrict.cs @@ -0,0 +1,125 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +namespace PerformanceFish.Hauling; + +public class StorageDistrict +{ + public int FreeSlots = 0xFFFFFFF; + + private int _storedThingCount; + + public int TotalSlots => Parent.GetTotalSlots(Cells.Count); + + public List Cells { get; } = []; + + private FishTable> _storedThingsByDef = new(); + + public SlotGroup Parent { get; } + + public Map Map { get; } = null!; + + public StorageDistrict(SlotGroup? parent) + { + Parent = parent!; + + if (parent != null) + Map = parent.Map; + } + + public void AddCell(in IntVec3 cell) + { + Cells.Add(cell); + var cellIndex = new CellIndex(cell, Map); + Map.StorageDistrictGrid()[cellIndex] = this; + + FreeSlots = TotalSlots - _storedThingCount; + + var thingsAtCell = cellIndex.GetThingList(Map); + for (var i = 0; i < thingsAtCell.Count; i++) + { + var thing = thingsAtCell[i]; + if (!thing.IsItem()) + continue; + + AddThing(thing); + } + } + + public IntVec3 PopCell() + { + var cell = Cells.Pop(); + DeregisterCell(cell); + return cell; + } + + public bool TryRemoveCell(in IntVec3 cell) + { + if (!Cells.Remove(cell)) + return false; + + DeregisterCell(cell); + return true; + } + + private void DeregisterCell(in IntVec3 cell) + { + var cellIndex = new CellIndex(cell, Map); + + ref var districtGridSlot = ref Map.StorageDistrictGrid()[cellIndex]; + if (districtGridSlot == this) + districtGridSlot = null; + + var thingsAtCell = cellIndex.GetThingList(Map); + for (var i = 0; i < thingsAtCell.Count; i++) + { + var thing = thingsAtCell[i]; + if (!thing.IsItem()) + continue; + + RemoveThing(thing); + } + } + + public void AddThing(Thing thing) + { + StoredThingsOfDef(thing.def).Add(thing); + + FreeSlots = TotalSlots - ++_storedThingCount; + } + + public void RemoveThing(Thing thing) + { + if (!StoredThingsOfDef(thing.def).Remove(thing)) + ThrowHelper.ThrowInvalidOperationException(); + + FreeSlots = TotalSlots - --_storedThingCount; + } + + public List StoredThingsOfDef(ThingDef def) => _storedThingsByDef.GetOrAdd(def.shortHash); + + public bool CapacityAllows(Thing t) => FreeSlots > 0 || StoredThingsOfDef(t.def).ContainsThingStackableWith(t); + + public static StorageDistrict[] GetDefaultArray() => _defaultDistrictArray; + + public void Dispose() + { + if (this == _defaultDistrict) + return; + + var districtGrid = Map.StorageDistrictGrid(); + var cells = Cells; + + for (var i = cells.Count; i-- > 0;) + { + ref var district = ref districtGrid[cells[i]]; + if (district == this) + district = null; + } + } + + private static StorageDistrict _defaultDistrict = new(null); + private static StorageDistrict[] _defaultDistrictArray = [_defaultDistrict]; +} \ No newline at end of file diff --git a/Source/PerformanceFish/Hauling/StorageExtensions.cs b/Source/PerformanceFish/Hauling/StorageExtensions.cs new file mode 100644 index 0000000..ea16f52 --- /dev/null +++ b/Source/PerformanceFish/Hauling/StorageExtensions.cs @@ -0,0 +1,32 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +namespace PerformanceFish.Hauling; + +public static class StorageExtensions +{ + public static int TrueItemsPerCell(this Thing slotGroupParent) + => slotGroupParent.TrueItemsPerCell(slotGroupParent.TryGetLwmCompProperties()); + + public static int TrueItemsPerCell(this Thing slotGroupParent, CompProperties? lwmProps) + => lwmProps != null + ? Math.Max(LwmCompCacheValue.LwmMinNumberStacks!(lwmProps), LwmCompCacheValue.LwmMaxNumberStacks!(lwmProps)) + : slotGroupParent is Building building + ? building.MaxItemsInCell + : 1; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static CompProperties? TryGetLwmCompProperties(this Thing thing) + => LwmCompCache.GetOrAdd(thing).CompProperties; + + public static int GetTotalSlots(this SlotGroup slotGroup) => slotGroup.GetTotalSlots(slotGroup.CellsList.Count); + + public static int GetTotalSlots(this SlotGroup slotGroup, int cellCount) + => slotGroup.parent is Building storage + ? storage.TrueItemsPerCell() * cellCount + : cellCount; + + static StorageExtensions() => LwmCompCacheValue.EnsureInitialized(); +} \ No newline at end of file diff --git a/Source/PerformanceFish/Hauling/StorageSettingsPatches.cs b/Source/PerformanceFish/Hauling/StorageSettingsPatches.cs new file mode 100644 index 0000000..3ff1298 --- /dev/null +++ b/Source/PerformanceFish/Hauling/StorageSettingsPatches.cs @@ -0,0 +1,232 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +// #define StorageSettings_DEBUG + +using System.Diagnostics; +using System.Linq; +using FisheryLib.Pools; +using PerformanceFish.Events; + +namespace PerformanceFish.Hauling; + +public sealed class StorageSettingsPatches : ClassWithFishPatches +{ + public sealed class AllowedToAcceptPatch : FirstPriorityFishPatch + { + public override string Description { get; } + = "StorageSettings and capacity caching. High impact in colonies with multiple full storage buildings."; + + public override Expression TargetMethod { get; } + = static () => default(StorageSettings)!.AllowedToAccept(default(Thing)); + + protected internal override void OnPatchingCompleted() => ThingEvents.Initialized += TryRegister; + + public static void TryRegister(Thing thing) + { + var thingEvents = thing.Events(); + + if (thing is ISlotGroupParent) + thingEvents.Spawned += InitializeSlotGroupParent; + + if (!thing.IsItem()) + return; + + thingEvents.RegisteredAtThingGrid += TryNotifyReceivedThing; + thingEvents.DeregisteredAtThingGrid += TryNotifyLostThing; + } + + public static void TryNotifyReceivedThing(Thing thing, Map map, in IntVec3 cell) + { + if (cell.GetSlotGroupParent(map) is { } parent and Thing) + parent.GetStoreSettings()?.Cache().Notify_ReceivedThing(thing); + } + + public static void TryNotifyLostThing(Thing thing, Map map, in IntVec3 cell) + { + if (cell.GetSlotGroupParent(map) is { } parent and Thing) + parent.GetStoreSettings()?.Cache().Notify_LostThing(thing); + } + + public static void InitializeSlotGroupParent(Thing thing, Map map) + { + var slotGroupParent = (ISlotGroupParent)thing; + + if (slotGroupParent.GetStoreSettings() is not { } storeSettings) + return; + + ref var cache = ref storeSettings.Cache(); + cache.Initialize(thing); + + var slotCellsList = slotGroupParent.AllSlotCellsList(); + for (var i = slotCellsList.Count; i-- > 0;) + { + var thingsAtCell = slotCellsList[i].GetThingListUnchecked(map); + for (var j = thingsAtCell.Count; j-- > 0;) + { + var storedThing = thingsAtCell[j]; + if (!storedThing.IsItem() || cache.Contains(storedThing)) + continue; + + cache.Notify_ReceivedThing(storedThing); + } + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool Prefix(StorageSettings __instance, Thing t, ref bool __result, out bool __state) + { + var cachedAllowedToAcceptValue = __instance.Cache().AllowedToAccept.GetOrAdd(t.thingIDNumber); + + if (StorageSettingsCache.IsDirty(cachedAllowedToAcceptValue)) + return __state = true; + + __result = cachedAllowedToAcceptValue.AsBool() && CapacityAllows(__instance, t); + + return __state = false; + } + + [MethodImpl(MethodImplOptions.NoInlining)] + public static bool CapacityAllows(StorageSettings __instance, Thing t) + { + if (__instance.owner is not Thing ownerThing) + return true; + + ref var cache = ref __instance.Cache(); + Debug.VerifyItemCount(ownerThing, ref cache); + + return cache.FreeSlots > 0 + || (t.TryGetMap() is { } map && t.Position.GetSlotGroupParent(map) == ownerThing) + || AcceptsForStacking(ref cache, t); + } + + public static bool AcceptsForStacking(ref StorageSettingsCache cache, Thing t) + => cache.StoredThingsOfDef(t.def).ContainsThingStackableWith(t); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Postfix(StorageSettings __instance, Thing t, bool __result, bool __state) + { + if (!__state) + return; + + UpdateCache(__instance, t, __result); + } + + [MethodImpl(MethodImplOptions.NoInlining)] + public static void UpdateCache(StorageSettings __instance, Thing t, bool __result) + => __instance.Cache().Update(t.thingIDNumber, __result && t is { def: not null, thingIDNumber: not -1 }); + } + + public sealed class TryNotifyChanged_Patch : FishPatch + { + public static event Action? Changed; + + public override string Description { get; } = "StorageSettings cache resetting"; + + public override Expression TargetMethod { get; } + = static () => default(StorageSettings)!.TryNotifyChanged(); + + public static void Postfix(StorageSettings __instance) + { + __instance.Cache().OnSettingsChanged(__instance); + Changed?.Invoke(__instance); + } + } + + public record struct StorageSettingsCache + { + public FishTable AllowedToAccept = new(); + + private Thing? _parent; + + public int FreeSlots = 0xFFFFFFF; + + private int _storedThingCount; + + private FishTable> _storedThingsByDef = new(); + + private CompProperties? _lwmProps; + + public event Action? SettingsChanged; + + public int TotalSlots => _parent!.TrueItemsPerCell(_lwmProps) * _parent!.SlotGroupCellCount(); + + public List StoredThingsOfDef(ThingDef def) => _storedThingsByDef.GetOrAdd(def.shortHash); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool IsDirty(int allowedToAcceptValue) => allowedToAcceptValue == int.MaxValue; + + public void Update(int thingIDNumber, bool allowedToAccept) + => AllowedToAccept[thingIDNumber] = allowedToAccept.AsInt(); + + public void Initialize(Thing slotGroupParent) + { + _parent = slotGroupParent; + _storedThingsByDef.Clear(); + AllowedToAccept.Clear(); + _lwmProps = slotGroupParent.TryGetLwmCompProperties(); + FreeSlots = TotalSlots; + } + + public bool Contains(Thing thing) => StoredThingsOfDef(thing.def).Contains(thing); + + public void Notify_ReceivedThing(Thing thing) + { + if (_parent is null) + return; + + StoredThingsOfDef(thing.def).Add(thing); + FreeSlots = TotalSlots - ++_storedThingCount; + Debug.VerifyItemCount(_parent, ref this); + } + + public void Notify_LostThing(Thing thing) + { + if (_parent is null) + return; + + StoredThingsOfDef(thing.def).Remove(thing); + FreeSlots = TotalSlots - --_storedThingCount; + + Debug.VerifyItemCount(_parent, ref this); + } + + public void OnSettingsChanged(StorageSettings storageSettings) + { + AllowedToAccept.Clear(); + + if (_parent?.IsSpawned() ?? false) + FreeSlots = TotalSlots - _storedThingCount; + + SettingsChanged?.Invoke(storageSettings); + } + + public StorageSettingsCache() => AllowedToAccept.ValueInitializer = static _ => int.MaxValue; + } + + public static class Debug + { + [Conditional("StorageSettings_DEBUG")] + public static void LogMessage(PooledStringHandler stringHandler) => Log.Message(stringHandler); + + [Conditional("StorageSettings_DEBUG")] + public static void VerifyItemCount(Thing storageThing, ref StorageSettingsCache cache) + { + if (storageThing.TryGetMap() is not { } ownerMap || storageThing is not ISlotGroupParent slotGroup) + return; + + var realTotalSlots = cache.TotalSlots; + var realTotalItemCount = slotGroup.AllSlotCellsList().Sum(cell => cell.GetItemCount(ownerMap)); + if (cache.FreeSlots == realTotalSlots - realTotalItemCount) + return; + + Log.Error($"StorageSettings cache for '{storageThing}' has incorrect free slots count of '{ + cache.FreeSlots}'. Real total item count: '{realTotalItemCount}', real total slots: '{ + realTotalSlots}', real free slots: '{realTotalSlots - realTotalItemCount}'"); + + Current.Game.tickManager.Pause(); + } + } +} \ No newline at end of file diff --git a/Source/PerformanceFish/Hauling/StoreUtilityPrepatches.cs b/Source/PerformanceFish/Hauling/StoreUtilityPrepatches.cs new file mode 100644 index 0000000..267472b --- /dev/null +++ b/Source/PerformanceFish/Hauling/StoreUtilityPrepatches.cs @@ -0,0 +1,296 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using Mono.Cecil; +using Mono.Cecil.Cil; +using PerformanceFish.Events; +using PerformanceFish.Listers; +using PerformanceFish.Prepatching; + +namespace PerformanceFish.Hauling; + +public sealed class StoreUtilityPrepatches : ClassWithFishPrepatches +{ + public sealed class NoStorageBlockersInPatch : FishPrepatch + { + public override string? Description { get; } + = "Optimizes this frequently accessed storage check by caching fully blocked cells in a bit array and " + + "reordering instructions to make better use of caches."; + + public override MethodBase TargetMethodBase { get; } = methodof(StoreUtility.NoStorageBlockersIn); + + protected internal override void OnPatchingCompleted() => ThingEvents.Initialized += TryRegister; + + public static void TryRegister(Thing thing) + { + if (!IsStorageBlocker(thing.def)) + return; + + var thingEvents = thing.Events(); + thingEvents.RegisteredAtThingGrid += SetStorageBlocker; + thingEvents.DeregisteredAtThingGrid += TryUnsetStorageBlocker; + } + + public static bool IsStorageBlocker(ThingDef thingDef) + => (thingDef.entityDefToBuild != null && thingDef.entityDefToBuild.passability != 0) + || (thingDef.passability != 0 + && thingDef.surfaceType == SurfaceType.None + && thingDef.category != ThingCategory.Item); + + public static void SetStorageBlocker(Thing thing, Map map, in IntVec3 cell) + => map.StorageBlockerGrid()[cell] = true; + + public static void TryUnsetStorageBlocker(Thing thing, Map map, in IntVec3 cell) + { + var thingsList = map.thingGrid.ThingsListAt(cell); + + for (var i = thingsList.Count; i-- > 0;) + { + var otherThing = thingsList[i]; + if (otherThing != thing && IsStorageBlocker(otherThing.def)) + return; + } + + map.StorageBlockerGrid()[cell] = false; + } + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static bool ReplacementBody(IntVec3 c, Map map, Thing thing) + { + if (map.StorageBlockerGrid()[c]) + return false; + + if (c.GetItemCount(map) < c.GetMaxItemsAllowedInCell(map)) + return true; + + var thingsAtCell = map.thingGrid.ThingsListAt(c); + var thingCount = thingsAtCell.Count; + for (var i = 0; i < thingCount; i++) + { + var thingAtCell = thingsAtCell[i]; + + if (thingAtCell.stackCount < thingAtCell.def.stackLimit + && thingAtCell.CanStackWith(thing) + && thingAtCell.def.EverStorable(false)) + { + return true; + } + } + + return false; + } + } + + public sealed class TryFindBestBetterStoreCellForWorkerPatch : FishPrepatch + { + public override List LinkedPatches { get; } = + [ + typeof(SlotGroupPrepatches.Notify_AddedCellPatch), typeof(SlotGroupPrepatches.Notify_LostCellPatch) + ]; + + public override string? Description { get; } + = "Optimizes hauling by splitting storage areas into smaller regions with cached capacity information. " + + "Additionally makes lookups more thorough when having the 'Improve hauling accuracy' setting enabled, " + + "raising the odds of getting closer cells as haul destinations"; + + public override MethodBase TargetMethodBase { get; } + = methodof(StoreUtility.TryFindBestBetterStoreCellForWorker); + + protected internal override void OnPatchingCompleted() => ThingEvents.Initialized += TryRegister; + + public static void TryRegister(Thing thing) + { + var thingEvents = thing.Events(); + + if (thing is ISlotGroupParent) + { + thingEvents.Spawned += NotifySlotGroupCellCountChanged; + thingEvents.DeSpawned += NotifySlotGroupCellCountChanged; + } + + if (!thing.IsItem()) + return; + + thingEvents.RegisteredAtThingGrid += TryNotifyReceivedThing; + thingEvents.DeregisteredAtThingGrid += TryNotifyLostThing; + } + + public static void NotifySlotGroupCellCountChanged(Thing slotGroupParent, Map map) + => NotifySlotGroupCellCountChanged(slotGroupParent); + + public static void NotifySlotGroupCellCountChanged(Thing slotGroupParent) + => slotGroupParent.GetSlotGroup()?.NotifyCellCountChanged(); + + public static void TryNotifyReceivedThing(Thing thing, Map map, in IntVec3 cell) + => map.StorageDistrictGrid()[cell]?.AddThing(thing); + + public static void TryNotifyLostThing(Thing thing, Map map, in IntVec3 cell) + => map.StorageDistrictGrid()[cell]?.RemoveThing(thing); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static void ReplacementBody(Thing t, Pawn carrier, Map map, Faction faction, SlotGroup? slotGroup, + bool needAccurateResult, ref IntVec3 closestSlot, ref float closestDistSquared, + ref StoragePriority foundPriority) + { + if (slotGroup == null || !slotGroup.parent.Accepts(t)) + return; + + var thingPosition = t.SpawnedOrAnyParentSpawned ? t.PositionHeld : carrier.PositionHeld; + var slotGroupCells = slotGroup.CellsList; + + var maxValidCellsToCheck + = !FishSettings.ImproveHaulingAccuracy && needAccurateResult + ? Mathf.FloorToInt(slotGroupCells.Count * Rand.Range(0.005f, 0.018f)) + : 0; + + StartOfDistrictLoop: + var districts = slotGroup.Districts(); + + for (var districtIndex = 0; districtIndex < districts.Length; districtIndex++) + { + var district = districts[districtIndex]; + + if (!district.CapacityAllows(t)) + continue; + + var districtCells = districts.Length > 1 ? district.Cells : slotGroupCells; + + for (var i = 0; i < districtCells.Count; i++) + { + var slotGroupCell = districtCells[i]; + var cellDistance = (float)(thingPosition - slotGroupCell).LengthHorizontalSquared; + + if (cellDistance > closestDistSquared + || !StoreUtility.IsGoodStoreCell(slotGroupCell, map, t, carrier, faction)) + { + continue; + } + + if (districts.Length > 1 && slotGroupCell.GetSlotGroup(map) != district.Parent) + { + district.Parent.ResetAndRemakeDistricts(); // TODO: figure out why this happens + goto StartOfDistrictLoop; + } + + closestSlot = slotGroupCell; + closestDistSquared = cellDistance; + foundPriority = slotGroup.Settings.Priority; + if (!FishSettings.ImproveHaulingAccuracy && (districtIndex * i) + i >= maxValidCellsToCheck) + return; + } + } + } + } + + public sealed class TryFindBestBetterStoreCellForPatch : FishPrepatch + { + public override string? Description { get; } + = "Optimizes a loop in the method to make use of cached storage priorities for fewer comparisons against " + + "those. Also removes haulables from ListerHaulables if the found best store cell turns out to be the " + + "current cell"; + + public override MethodBase TargetMethodBase { get; } = methodof(StoreUtility.TryFindBestBetterStoreCellFor); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static bool ReplacementBody(Thing t, Pawn carrier, Map map, + StoragePriority currentPriority, Faction faction, out IntVec3 foundCell, bool needAccurateResult = true) + { + var haulDestinationManager = map.haulDestinationManager; + List listInPriorityOrder = haulDestinationManager.AllGroupsListInPriorityOrder; + if (listInPriorityOrder.Count == 0) + { + foundCell = IntVec3.Invalid; + return false; + } + + var foundPriority = currentPriority; + var closestDistSquared = (float)int.MaxValue; + var closestSlot = IntVec3.Invalid; + + var groupCountByPriority = GetCachedGroupCountByPriority(haulDestinationManager); + var i = 0; + for (var priorityGroupIndex = groupCountByPriority.Length; priorityGroupIndex-- > 0;) + { + var groupsOfPriorityCount = groupCountByPriority[priorityGroupIndex]; + + if ((StoragePriority)priorityGroupIndex < foundPriority) // succeeded finding a higher priority storage + break; + + if ((StoragePriority)priorityGroupIndex <= currentPriority) // current storage is highest valid priority + { + TryRemoveFromListerHaulables(t, currentPriority); + break; + } + + while (groupsOfPriorityCount-- > 0) + { + StoreUtility.TryFindBestBetterStoreCellForWorker(t, carrier, map, faction, listInPriorityOrder[i++], + needAccurateResult, ref closestSlot, ref closestDistSquared, ref foundPriority); + } + } + + if (!closestSlot.IsValid) + { + foundCell = IntVec3.Invalid; + return false; + } + + foundCell = closestSlot; + return true; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int[] GetCachedGroupCountByPriority(HaulDestinationManager haulDestinationManager) + => haulDestinationManager.Cache().GroupCountByPriority; + + [MethodImpl(MethodImplOptions.NoInlining)] + public static void TryRemoveFromListerHaulables(Thing t, StoragePriority currentPriority) + { + if (t.IsInAnyStorage() /*t.IsInValidStorage()*/ && t.TryGetMapHeld() is { } map) + map.listerHaulables.TryRemoveDirectly(t); + + // remove for any storage instead of only valid storage to prevent further haul attempts until the next + // automatic ListerHaulablesTick cycle + } + } + + public sealed class GetSlotGroupPatch : FishPrepatch + { + public override string? Description { get; } + = "Optimization for this method by reducing its amount of instructions without changing results"; + + public override MethodBase TargetMethodBase { get; } + = methodof((Func)StoreUtility.GetSlotGroup); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static SlotGroup? ReplacementBody(Thing thing) + => thing.TryGetMap() is { } map ? thing.Position.GetSlotGroup(map) : null; + } + + public sealed class CurrentHaulDestinationOfPatch : FishPrepatch + { + public override string? Description { get; } + = "Optimization for this method by reducing its amount of instructions without changing results"; + + public override MethodBase TargetMethodBase { get; } + = methodof(StoreUtility.CurrentHaulDestinationOf); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static IHaulDestination? ReplacementBody(Thing t) + => t.TryGetMap() is { } map + ? map.haulDestinationManager.SlotGroupParentAt(t.Position) + : t.ParentHolder as IHaulDestination; + } +} \ No newline at end of file diff --git a/Source/PerformanceFish/Hediffs/HealthTrackerOptimization.cs b/Source/PerformanceFish/Hediffs/HealthTrackerOptimization.cs index e01f046..7ef0f27 100644 --- a/Source/PerformanceFish/Hediffs/HealthTrackerOptimization.cs +++ b/Source/PerformanceFish/Hediffs/HealthTrackerOptimization.cs @@ -8,7 +8,7 @@ using PerformanceFish.Prepatching; namespace PerformanceFish.Hediffs; -public class HealthTrackerOptimization : ClassWithFishPrepatches +public sealed class HealthTrackerOptimization : ClassWithFishPrepatches { public static void Initialize() { @@ -24,7 +24,7 @@ public class HealthTrackerOptimization : ClassWithFishPrepatches } } - public class HealthTickPatch : FishPrepatch + public sealed class HealthTickPatch : FishPrepatch { public override MethodBase TargetMethodBase { get; } = AccessTools.Method(typeof(Pawn_HealthTracker), nameof(Pawn_HealthTracker.HealthTick)); diff --git a/Source/PerformanceFish/Hediffs/HediffComp_PsychicHarmonizer_Bugfix.cs b/Source/PerformanceFish/Hediffs/HediffComp_PsychicHarmonizer_Bugfix.cs index 5c7d2d9..952e935 100644 --- a/Source/PerformanceFish/Hediffs/HediffComp_PsychicHarmonizer_Bugfix.cs +++ b/Source/PerformanceFish/Hediffs/HediffComp_PsychicHarmonizer_Bugfix.cs @@ -3,18 +3,17 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. -using System.Linq; using static System.Reflection.Emit.OpCodes; namespace PerformanceFish.Hediffs; -public class HediffComp_PsychicHarmonizer_Bugfix : ClassWithFishPatches +public sealed class HediffComp_PsychicHarmonizer_Bugfix : ClassWithFishPatches { - public class CompPostTick_Patch : FishPatch + public sealed class CompPostTick_Patch : FishPatch { public override string Description { get; } = "Fixes a bug in the psychic harmonizer tick method that was causing it to recalculate results on 149 " - + "out of 150 ticks instead of once every 150 ticks. Large impact."; + + "out of 150 ticks instead of once every 150 ticks. Large impact."; public override MethodBase TargetMethodInfo { get; } = AccessTools.Method(typeof(HediffComp_PsychicHarmonizer), @@ -22,29 +21,19 @@ public class HediffComp_PsychicHarmonizer_Bugfix : ClassWithFishPatches public static CodeInstructions Transpiler(CodeInstructions codeInstructions) { - var codes = codeInstructions.ToList(); + var codes = codeInstructions.AsOrToList(); var pawn_int_IsHashIntervalTick = FishTranspiler.Call>(Gen.IsHashIntervalTick); var success = false; + for (var i = 0; i < codes.Count; i++) { - if (i + 2 < codes.Count - && codes[i].opcode == Ldc_I4 - && codes[i + 1] == pawn_int_IsHashIntervalTick - && codes[i + 2].opcode == Brfalse_S) + if (i - 2 >= 0 + && codes[i - 2].opcode == Ldc_I4 + && codes[i - 1] == pawn_int_IsHashIntervalTick + && codes[i].opcode == Brfalse_S) { - //codes[i].operand = 128; - yield return codes[i]; - yield return codes[i + 1]; - - codes[i + 2].opcode = Brtrue_S; - yield return codes[i + 2]; - + codes[i].opcode = Brtrue_S; success = true; - i += 2; - } - else - { - yield return codes[i]; } } @@ -55,6 +44,8 @@ public class HediffComp_PsychicHarmonizer_Bugfix : ClassWithFishPatches + "an actual failure to patch if settings were not toggled however, which would mean some other " + "patch or a vanilla change either messes with this or implements the same thing"); } + + return codes; } } } \ No newline at end of file diff --git a/Source/PerformanceFish/Hediffs/HediffSetCaching.cs b/Source/PerformanceFish/Hediffs/HediffSetCaching.cs index 873ba2f..ce06620 100644 --- a/Source/PerformanceFish/Hediffs/HediffSetCaching.cs +++ b/Source/PerformanceFish/Hediffs/HediffSetCaching.cs @@ -18,9 +18,9 @@ using NotMissingPartsCache namespace PerformanceFish.Hediffs; -public class HediffSetPrecaching : ClassWithFishPrepatches +public sealed class HediffSetPrecaching : ClassWithFishPrepatches { - public class GetFirstHediffOfDef : FishPrepatch + public sealed class GetFirstHediffOfDef : FishPrepatch { public override string Description { get; } = "Caches results of the HediffSet.GetFirstHediffOfDef method. Impact scales with hediff count."; @@ -94,7 +94,7 @@ public class HediffSetPrecaching : ClassWithFishPrepatches } } - public class HasHediff : FishPrepatch + public sealed class HasHediff : FishPrepatch { public override string Description { get; } = "Caches results of the HediffSet.HasHediff method. Impact scales with hediff count."; @@ -111,7 +111,7 @@ public class HediffSetPrecaching : ClassWithFishPrepatches => __instance.GetFirstHediffOfDef(def, mustBeVisible) != null; } - public class GetNotMissingParts : FishPrepatch + public sealed class GetNotMissingParts : FishPrepatch { public override string? Description { get; } = "Caches results of the HediffSet.GetNotMissingParts method. Impact scales with hediff count."; @@ -156,9 +156,9 @@ public class HediffSetPrecaching : ClassWithFishPrepatches } } -public class HediffSetCaching : ClassWithFishPatches +public sealed class HediffSetCaching : ClassWithFishPatches { - public class DirtyCache : FishPatch + public sealed class DirtyCache : FishPatch { public override string Description { get; } = "Patched to trigger psylink cache clearing for the psychic entropy optimization."; @@ -176,9 +176,9 @@ public class HediffSetCaching : ClassWithFishPatches public record struct NotMissingPartsCacheValue { private int _version = -1; - private List _hediffsInSet = new(); + private List _hediffsInSet = []; private int _nextRefreshTick; - public List Parts = new(); + public List Parts = []; [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Update(HediffSet set, ref IEnumerable result) @@ -209,7 +209,7 @@ public class HediffSetCaching : ClassWithFishPatches public record struct HediffCacheValue { private int _version = -1; - private List _hediffsInSet = new(); + private List _hediffsInSet = []; private int _nextRefreshTick; public Hediff? Hediff; diff --git a/Source/PerformanceFish/Hediffs/HediffWithCompsOptimization.cs b/Source/PerformanceFish/Hediffs/HediffWithCompsOptimization.cs new file mode 100644 index 0000000..815c3fd --- /dev/null +++ b/Source/PerformanceFish/Hediffs/HediffWithCompsOptimization.cs @@ -0,0 +1,99 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +#if useless + +using Mono.Cecil; +using Mono.Cecil.Cil; +using PerformanceFish.Prepatching; + +namespace PerformanceFish.Hediffs; + +public sealed class HediffWithCompsOptimization : ClassWithFishPrepatches +{ + public sealed class ShouldRemovePatch : FishPrepatch + { + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredPropertyGetter(typeof(HediffWithComps), nameof(HediffWithComps.ShouldRemove)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static unsafe bool ReplacementBody(HediffWithComps instance) + { + if (instance.comps is { } comps) + { + for (var i = 0; i < comps.Count; i++) + { + if (comps[i].CompShouldRemove) + return true; + } + } + + return BaseShouldRemove(instance); + } + + public static unsafe delegate* BaseShouldRemove + = (delegate*)AccessTools + .DeclaredPropertyGetter(typeof(Hediff), nameof(Hediff.ShouldRemove)).GetFunctionPointer(); + } + + public sealed class VisiblePatch : FishPrepatch + { + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredPropertyGetter(typeof(HediffWithComps), nameof(HediffWithComps.Visible)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static unsafe bool ReplacementBody(HediffWithComps instance) + { + if (instance.comps is { } comps) + { + for (var i = 0; i < comps.Count; i++) + { + if (comps[i].CompDisallowVisible()) + return false; + } + } + + return BaseVisible(instance); + } + + public static unsafe delegate* BaseVisible + = (delegate*)AccessTools + .DeclaredPropertyGetter(typeof(Hediff), nameof(Hediff.Visible)).GetFunctionPointer(); + } + + public sealed class PostTickPatch : FishPrepatch + { + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(HediffWithComps), nameof(HediffWithComps.PostTick)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static unsafe void ReplacementBody(HediffWithComps instance) + { + BasePostTick(instance); + + if (instance.comps is not { } comps) + return; + + var severityAdjustment = 0f; + for (var i = 0; i < comps.Count; i++) + comps[i].CompPostTick(ref severityAdjustment); + + if (severityAdjustment != 0f) + instance.Severity += severityAdjustment; + } + + public static unsafe delegate* BasePostTick + = (delegate*)AccessTools.DeclaredMethod(typeof(Hediff), nameof(Hediff.PostTick)) + .GetFunctionPointer(); + } +} + +#endif \ No newline at end of file diff --git a/Source/PerformanceFish/Hediffs/ImmunityHandlerCaching.cs b/Source/PerformanceFish/Hediffs/ImmunityHandlerCaching.cs index dc24188..2cb4a84 100644 --- a/Source/PerformanceFish/Hediffs/ImmunityHandlerCaching.cs +++ b/Source/PerformanceFish/Hediffs/ImmunityHandlerCaching.cs @@ -12,9 +12,9 @@ using ImmunityRecordExistsCache namespace PerformanceFish.Hediffs; -public class ImmunityHandlerCaching : ClassWithFishPatches +public sealed class ImmunityHandlerCaching : ClassWithFishPatches { - public class NeededImmunitiesNow : FirstPriorityFishPatch + public sealed class NeededImmunitiesNow : FirstPriorityFishPatch { public override string Description { get; } = "Caches results of the ImmunityHandler.NeededImmunitiesNow method. Impact scales with hediff quantity."; @@ -54,7 +54,7 @@ public class ImmunityHandlerCaching : ClassWithFishPatches .Update(__instance.pawn.health.hediffSet, __result); } - public class ImmunityRecordExists : FishPatch + public sealed class ImmunityRecordExists : FishPatch { public override string? Description { get; } = "Required by the TryAddImmunityRecord optimization."; @@ -82,7 +82,7 @@ public class ImmunityHandlerCaching : ClassWithFishPatches } } - public class TryAddImmunityRecord : FishPatch + public sealed class TryAddImmunityRecord : FishPatch { public override string? Description { get; } = "Optimization for this specific method to not run more checks than necessary."; @@ -113,9 +113,9 @@ public class ImmunityHandlerCaching : ClassWithFishPatches public record struct ImmunityInfoCacheValue { private int _version = -1; - private List _hediffsInSet = new(); + private List _hediffsInSet = []; private int _nextRefreshTick; - public List Infos = new(); + public List Infos = []; [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Update(HediffSet set, List infos) diff --git a/Source/PerformanceFish/Hediffs/Pawn_PsychicEntropyTrackerOptimization.cs b/Source/PerformanceFish/Hediffs/Pawn_PsychicEntropyTrackerOptimization.cs index dfe1d6f..7fa52ea 100644 --- a/Source/PerformanceFish/Hediffs/Pawn_PsychicEntropyTrackerOptimization.cs +++ b/Source/PerformanceFish/Hediffs/Pawn_PsychicEntropyTrackerOptimization.cs @@ -5,9 +5,9 @@ namespace PerformanceFish.Hediffs; -public class Pawn_PsychicEntropyTrackerOptimization : ClassWithFishPatches +public sealed class Pawn_PsychicEntropyTrackerOptimization : ClassWithFishPatches { - public class Psylink_Patch : FirstPriorityFishPatch + public sealed class Psylink_Patch : FirstPriorityFishPatch { public override string Description { get; } = "Caches/throttles the psylink method to only update every 32 ticks."; diff --git a/Source/PerformanceFish/IdeoBuildingPresenceDemandOptimization.cs b/Source/PerformanceFish/IdeoBuildingPresenceDemandOptimization.cs new file mode 100644 index 0000000..8a9b256 --- /dev/null +++ b/Source/PerformanceFish/IdeoBuildingPresenceDemandOptimization.cs @@ -0,0 +1,59 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using Mono.Cecil; +using Mono.Cecil.Cil; +using PerformanceFish.Prepatching; + +namespace PerformanceFish; + +public sealed class IdeoBuildingPresenceDemandOptimization : ClassWithFishPrepatches +{ + public sealed class BuildingPresentPatch : FishPrepatch + { + public override string? Description { get; } + = "Optimization to use cached ListerBuildings data instead of scanning through all colonist buildings, " + + "frequently"; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(IdeoBuildingPresenceDemand), + nameof(IdeoBuildingPresenceDemand.BuildingPresent)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static bool ReplacementBody(IdeoBuildingPresenceDemand __instance, Map map) + { + var buildings = map.listerBuildings.AllBuildingsColonistOfDef(__instance.parent.ThingDef); + + if (buildings is IndexedFishSet fishSet) + { + var list = fishSet.ReadOnlyList; + for (var i = list.Count; i-- > 0;) + { + if (list[i].StyleSourcePrecept == __instance.parent) + return true; + } + + return false; + } + else + { + return FallbackCheck(__instance, buildings); + } + } + + public static bool FallbackCheck(IdeoBuildingPresenceDemand __instance, IEnumerable buildings) + { + foreach (var building in buildings) + { + if (building.StyleSourcePrecept == __instance.parent) + return true; + } + + return false; + } + } +} \ No newline at end of file diff --git a/Source/PerformanceFish/IdeoUtilityCaching.cs b/Source/PerformanceFish/IdeoUtilityCaching.cs index 109f81e..79f1b31 100644 --- a/Source/PerformanceFish/IdeoUtilityCaching.cs +++ b/Source/PerformanceFish/IdeoUtilityCaching.cs @@ -10,9 +10,9 @@ using StyleDominanceCache namespace PerformanceFish; -public class IdeoUtilityCaching : ClassWithFishPrepatches +public sealed class IdeoUtilityCaching : ClassWithFishPrepatches { - public class GetStyleDominance_Patch : FishPrepatch + public sealed class GetStyleDominance_Patch : FishPrepatch { public override string Description { get; } = "Caches IdeoUtility.GetStyleDominance to only update about once every 900 ticks or so."; diff --git a/Source/PerformanceFish/JobSystem/DisabledWorkTypesOptimization.cs b/Source/PerformanceFish/JobSystem/DisabledWorkTypesOptimization.cs index 6fdd3e9..e3e3cea 100644 --- a/Source/PerformanceFish/JobSystem/DisabledWorkTypesOptimization.cs +++ b/Source/PerformanceFish/JobSystem/DisabledWorkTypesOptimization.cs @@ -3,12 +3,16 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. +using PerformanceFish.ModCompatibility; + namespace PerformanceFish.JobSystem; -public class DisabledWorkTypesOptimization : ClassWithFishPatches +public sealed class DisabledWorkTypesOptimization : ClassWithFishPatches { - public class PawnGetDisabledWorkTypes : FishPatch + public sealed class PawnGetDisabledWorkTypes : FishPatch { + public override List IncompatibleModIDs { get; } = [PackageIDs.MULTIPLAYER]; + public override string? Description { get; } = "Essentially fixes a bug in Pawn.GetDisabledWorkTypes that causes the method to discard its cache and " + "constantly keep recalculating. With the patch applied it'll return early when a valid cache exists."; diff --git a/Source/PerformanceFish/JobSystem/GenClosestPatches.cs b/Source/PerformanceFish/JobSystem/GenClosestPatches.cs index e0b909b..e64f722 100644 --- a/Source/PerformanceFish/JobSystem/GenClosestPatches.cs +++ b/Source/PerformanceFish/JobSystem/GenClosestPatches.cs @@ -9,9 +9,9 @@ using Verse.AI; namespace PerformanceFish.JobSystem; -public class GenClosestPatches : ClassWithFishPatches +public sealed class GenClosestPatches : ClassWithFishPatches { - public class ClosestThing_Global_Patch : FishPatch + public sealed class ClosestThing_Global_Patch : FishPatch { public override string Description { get; } = "Threading for job scanning. Disabled and unstable."; public override bool DefaultState => false; @@ -226,29 +226,4 @@ public class GenClosestPatches : ClassWithFishPatches } } #endif - -#if threadingEnabled - public class CanReach_Patch : FishPatch - { - protected CanReach_Patch() => FishSettings.ThreadingPatches.Add(this); - public override bool DefaultState => false; - public override string Description { get; } - = "Lock for threading. Only needed with threading enabled and off by default"; - public override Expression TargetMethod { get; } - = static () => default(Reachability)!.CanReach(default, null, default, default); - public static void Prefix() - { - if (FishSettings.ThreadingEnabled) - Monitor.Enter(Lock); - } - - public static Exception Finalizer(Exception __exception) - { - if (FishSettings.ThreadingEnabled) - Monitor.Exit(Lock); - return __exception; - } - private static object Lock { get; } = new(); - } -#endif //} \ No newline at end of file diff --git a/Source/PerformanceFish/JobSystem/JobGiver_HaulOptimization.cs b/Source/PerformanceFish/JobSystem/JobGiver_HaulOptimization.cs index be476da..202747e 100644 --- a/Source/PerformanceFish/JobSystem/JobGiver_HaulOptimization.cs +++ b/Source/PerformanceFish/JobSystem/JobGiver_HaulOptimization.cs @@ -7,22 +7,21 @@ using PerformanceFish.ModCompatibility; namespace PerformanceFish.JobSystem; -public class JobGiver_HaulOptimization : ClassWithFishPatches +public sealed class JobGiver_HaulOptimization : ClassWithFishPatches { - public class PotentialWorkThingsGlobal_Patch : FishPatch + public sealed class PotentialWorkThingsGlobal_Patch : FishPatch { + public override List IncompatibleModIDs { get; } = [PackageIDs.MULTIPLAYER]; + public override string Description { get; } = "Sorts haulables by distance before running expensive hauling calculations on them to avoid checks on " - + "far away items"; + + "far away items"; public override MethodBase TargetMethodInfo { get; } = AccessTools.Method(typeof(JobGiver_Haul), nameof(JobGiver_Haul.TryGiveJob)); public static CodeInstructions? Transpiler(CodeInstructions codes, MethodBase method) { - if (ActiveMods.Multiplayer) // PUAH has known issues with sorting and multiplayer - return codes; - var pawn_Map_listerHaulables_ThingsPotentiallyNeedingHauling = FishTranspiler.Call(static () => default(ListerHaulables)!.ThingsPotentiallyNeedingHauling()); diff --git a/Source/PerformanceFish/JobSystem/JobGiver_WorkPatches.cs b/Source/PerformanceFish/JobSystem/JobGiver_WorkPatches.cs index 19f14e3..8ef86cc 100644 --- a/Source/PerformanceFish/JobSystem/JobGiver_WorkPatches.cs +++ b/Source/PerformanceFish/JobSystem/JobGiver_WorkPatches.cs @@ -13,9 +13,9 @@ using static PerformanceFish.TranspilerHelpers; namespace PerformanceFish.JobSystem; -public class JobGiver_WorkPatches : ClassWithFishPatches +public sealed class JobGiver_WorkPatches : ClassWithFishPatches { - public class TryIssueJobPackage_InnerDelegate_Patch : FishPatch + public sealed class TryIssueJobPackage_InnerDelegate_Patch : FishPatch { public override string Description => "Work scanning optimization. Splits the IsForbidden and HasJobOnThing checks into separate loops, then threads the IsForbidden loop, sorts it, caches the result and skips any following duplicate checks"; public override MethodBase TargetMethodInfo => AccessTools.FindIncludingInnerTypes(typeof(JobGiver_Work), @@ -44,7 +44,7 @@ public class JobGiver_WorkPatches : ClassWithFishPatches } } - public class TryIssueJobPackage_Patch : FishPatch + public sealed class TryIssueJobPackage_Patch : FishPatch { public override string Description => "Work scanning optimization. Splits the IsForbidden and HasJobOnThing checks into separate loops, then threads the IsForbidden loop, sorts it, caches the result and skips any following duplicate checks"; public override MethodBase TargetMethodInfo => AccessTools.Method(typeof(JobGiver_Work), nameof(JobGiver_Work.TryIssueJobPackage)); @@ -243,7 +243,7 @@ public class JobGiver_WorkPatches : ClassWithFishPatches public static Dictionary, IEnumerable> PrefilteredPotentialWorkThingsGlobal { get; } = new(); } - public class ThingRequest_IsUndefined_Patch : FishPatch + public sealed class ThingRequest_IsUndefined_Patch : FishPatch { public override string Description => "Part of the work scanning optimization"; public override MethodBase TargetMethodInfo => AccessTools.PropertyGetter(typeof(ThingRequest), nameof(ThingRequest.IsUndefined)); @@ -259,7 +259,7 @@ public class JobGiver_WorkPatches : ClassWithFishPatches => __instance.group == ThingRequestGroup.Undefined && !((FishCache)__instance.singleDef).IsSingleDef; } - public class ThingRequest_CanBeFoundInRegion_Patch : FirstPriorityFishPatch + public sealed class ThingRequest_CanBeFoundInRegion_Patch : FirstPriorityFishPatch { public override string Description => "Part of the work scanning optimization"; public override MethodBase TargetMethodInfo => AccessTools.PropertyGetter(typeof(ThingRequest), nameof(ThingRequest.CanBeFoundInRegion)); @@ -276,7 +276,7 @@ public class JobGiver_WorkPatches : ClassWithFishPatches || (__instance.group != ThingRequestGroup.Undefined && (__instance.group == ThingRequestGroup.Nothing || __instance.group.StoreInRegion())); } - public class ListerThings_ThingsMatching_Patch : FirstPriorityFishPatch + public sealed class ListerThings_ThingsMatching_Patch : FirstPriorityFishPatch { public override string Description => "Part of the work scanning optimization"; public override Expression TargetMethod => () => new ListerThings(default).ThingsMatching(default); diff --git a/Source/PerformanceFish/JobSystem/WorkGiver_DoBillOptimization.cs b/Source/PerformanceFish/JobSystem/WorkGiver_DoBillOptimization.cs index 50a63a5..9ee418f 100644 --- a/Source/PerformanceFish/JobSystem/WorkGiver_DoBillOptimization.cs +++ b/Source/PerformanceFish/JobSystem/WorkGiver_DoBillOptimization.cs @@ -5,44 +5,55 @@ using System.Linq; using System.Reflection.Emit; +using Mono.Cecil; +using Mono.Cecil.Cil; +using PerformanceFish.Prepatching; using Verse.AI; using IngredientCacheList = PerformanceFish.Utility.KeyedList Defs, bool Found)>; +using OpCodes = System.Reflection.Emit.OpCodes; using RecipeIngredientCache = PerformanceFish.Cache.ByIndex; namespace PerformanceFish.JobSystem; -public class WorkGiver_DoBillOptimization : ClassWithFishPatches +public sealed class WorkGiver_DoBillPrepatches : ClassWithFishPrepatches { - public static List BlackListedModExtensions - => _blackListedModExtensions ??= new() { Reflection.Type("VFEAncients", "VFEAncients.RecipeExtension_Mend") }; + public static List BlackListedModExtensions + => _blackListedModExtensions ??= InitializeBlackListedModExtensions(); - private static List? _blackListedModExtensions; - - public class TryFindBestIngredientsHelper_InnerDelegate_Patch : FirstPriorityFishPatch + [MethodImpl(MethodImplOptions.NoInlining)] + private static List InitializeBlackListedModExtensions() { + var list = new List(); + + if (ModCompatibility.Types.VFEAncients.RecipeExtensionMend is { } VFEAncientsRecipeExtension) + list.Add(VFEAncientsRecipeExtension); + + return list; + } + + private static List? _blackListedModExtensions; + + public sealed class TryFindBestIngredientsHelper_InnerDelegate_Patch : FishPrepatch + { + public override List IncompatibleModIDs { get; } + = [ModCompatibility.PackageIDs.USE_BEST_MATERIALS]; + + public override List LinkedPatches { get; } = + [ + typeof(WorkGiver_DoBillOptimization.TryFindBestIngredientsHelper_Patch), + typeof(WorkGiver_DoBillOptimization.TryFindBestIngredientsInSet_NoMixHelper_Patch) + ]; + public override string Description { get; } = "Optimizes WorkGiver_DoBill to only check things that get accepted by a bill's filter for its " + "ingredient lookup, instead of looping over everything and then checking filters afterwards. " + "Also caches these filter acceptances. Large performance impact."; - public override bool Enabled - { - set - { - if (base.Enabled == value) - return; - - Get().Enabled - = Get().Enabled - = base.Enabled = value; - } - } - - public override MethodBase TargetMethodInfo { get; } + public override MethodBase TargetMethodBase { get; } = AccessTools.FirstMethod(DelegateInstanceType, static m => m.GetParameters() is { Length: 1 } parameterInfos && parameterInfos[0].ParameterType == typeof(Region) @@ -52,12 +63,15 @@ public class WorkGiver_DoBillOptimization : ClassWithFishPatches && instruction.operand is MethodInfo info && info == AccessTools.Method(typeof(ListerThings), nameof(ListerThings.ThingsMatching)))); - public static CodeInstructions Transpiler(CodeInstructions codeInstructions, MethodBase method) - => Reflection.MakeReplacementCall(AccessTools.Method( - typeof(TryFindBestIngredientsHelper_InnerDelegate_Patch), nameof(Replacement), - generics: new[] { DelegateInstanceType })); + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); - public static bool Replacement(T __instance, Region r) where T : class + // public static CodeInstructions Transpiler(CodeInstructions codeInstructions, MethodBase method) + // => Reflection.MakeReplacementCall(AccessTools.Method( + // typeof(TryFindBestIngredientsHelper_InnerDelegate_Patch), nameof(ReplacementBody), + // generics: new[] { DelegateInstanceType })); + + public static bool ReplacementBody(object __instance, Region r) { var instance = _delegateInstance.Get(__instance); var thingValidator = _thingValidatorInstance.Get(instance.ThingValidator.Target); @@ -75,7 +89,7 @@ public class WorkGiver_DoBillOptimization : ClassWithFishPatches #if V1_4 || bill.billStack?.billGiver is Building_MechGestator #endif - || (BlackListedModExtensions.Exists(static b => b != null) + || (BlackListedModExtensions.Count > 0 && IsBlackListed(bill))) // <-- Fuck these too { list = GetDefaultList(r); @@ -89,7 +103,7 @@ public class WorkGiver_DoBillOptimization : ClassWithFishPatches cache.Update(bill); } - list = GetList(r.listerThings.listsByDef, cache.thingDefs); + list = GetList(r, cache.thingDefs); } } @@ -110,10 +124,9 @@ public class WorkGiver_DoBillOptimization : ClassWithFishPatches instance.FoundAll = true; return true; - } - private static bool HasNoFilters(Bill bill) + public static bool HasNoFilters(Bill bill) => bill.ingredientFilter is null || bill.recipe.fixedIngredientFilter is null; @@ -135,13 +148,13 @@ public class WorkGiver_DoBillOptimization : ClassWithFishPatches return false; }*/ - private static bool IsBlackListed(Bill? bill) + public static bool IsBlackListed(Bill? bill) => bill is null || bill.recipe.modExtensions.ExistsAndNotNull(static e => BlackListedModExtensions.Contains(e.GetType())); - private static List GetDefaultList(Region r) - => r.ListerThings.ThingsMatching(ThingRequest.ForGroup(ThingRequestGroup.HaulableEver)); + public static List GetDefaultList(Region r) + => r.listerThings.ThingsMatching(ThingRequest.ForGroup(ThingRequestGroup.HaulableEver)); public static void InsertAtCorrectPosition(List list, List thingsToInsert, Pawn pawn) { @@ -159,7 +172,8 @@ public class WorkGiver_DoBillOptimization : ClassWithFishPatches } } - private static readonly ThingPositionComparer _insertAtCorrectPositionComparer = new(); + private static readonly WorkGiver_DoBillOptimization.ThingPositionComparer _insertAtCorrectPositionComparer + = new(); public static void ActualLoop(List list, Region r, Pawn pawn, Predicate baseValidator, bool billGiverIsPawn) @@ -182,8 +196,10 @@ public class WorkGiver_DoBillOptimization : ClassWithFishPatches } } - public static List GetList(Dictionary> listsByDef, IngredientCacheList cacheList) + public static List GetList(Region region, IngredientCacheList cacheList) { + var listsByDef = region.listerThings.listsByDef; + var list = _tempListForIngredients; list.Clear(); var set = _tempSetForIngredientDefs; @@ -216,7 +232,7 @@ public class WorkGiver_DoBillOptimization : ClassWithFishPatches { var recipe = bill.recipe; var ingredients = recipe.ingredients; - var listsByDef = r.Map.listerThings.listsByDef; + var listsByDef = r.GetMap().listerThings.listsByDef; var result = cacheList ?? new(3); for (var i = 0; i < ingredients.Count; @@ -229,7 +245,7 @@ public class WorkGiver_DoBillOptimization : ClassWithFishPatches } else { - result[ingredients[i]] = ingredientList = new(new(), false); + result[ingredients[i]] = ingredientList = new([], false); } var filter = ingredients[i].filter; @@ -291,8 +307,8 @@ public class WorkGiver_DoBillOptimization : ClassWithFishPatches (mediumFilter, largestFilter) = (largestFilter, mediumFilter); } - private static readonly List _tempListForIngredients = new(); - private static readonly HashSet _tempSetForIngredientDefs = new(); + private static readonly List _tempListForIngredients = []; + private static readonly HashSet _tempSetForIngredientDefs = []; } private static Type DelegateInstanceType { get; } @@ -308,8 +324,8 @@ public class WorkGiver_DoBillOptimization : ClassWithFishPatches && AccessTools.Field(t, "foundAllIngredientsAndChoose") != null && AccessTools.Field(t, "foundAll") != null && AccessTools.Field(t, "thingValidator") != null) - ?? throw new("Performance Fish failed to find the target type for its WorkGiver_DoBill patch. " - + "This means that specific patch won't apply."); + ?? ThrowHelper.ThrowInvalidOperationException("Performance Fish failed to find the target type " + + "for its WorkGiver_DoBill patch. This means that specific patch won't apply."); private static Type ThingValidatorInstanceType { get; } = AccessTools.FirstInner(typeof(WorkGiver_DoBill), static t @@ -320,20 +336,20 @@ public class WorkGiver_DoBillOptimization : ClassWithFishPatches //&& AccessTools.Field(t, "chosen") != null //&& AccessTools.Field(t, "billGiver") != null /*&& AccessTools.Field(t, "pawn") != null*/) - ?? throw new("Performance Fish failed to find the thingValidator type for its WorkGiver_DoBill patch. " - + "This likely flat out breaks the entire patch."); + ?? ThrowHelper.ThrowInvalidOperationException("Performance Fish failed to find the thingValidator " + + "type for its WorkGiver_DoBill patch. This likely flat out breaks the entire patch."); // ReSharper disable once InconsistentNaming - private static DelegateInstance _delegateInstance { get; } + public static DelegateInstance _delegateInstance { get; } = (DelegateInstance)Activator.CreateInstance( typeof(DelegateInstanceImplementation<>).MakeGenericType(DelegateInstanceType)); // ReSharper disable once InconsistentNaming - private static ThingValidatorInstance _thingValidatorInstance { get; } + public static ThingValidatorInstance _thingValidatorInstance { get; } = (ThingValidatorInstance)Activator.CreateInstance( typeof(ThingValidatorInstanceImplementation<>).MakeGenericType(ThingValidatorInstanceType)); - private abstract class DelegateInstance + public abstract class DelegateInstance { public abstract DelegateInstance Get(object obj); @@ -347,7 +363,7 @@ public class WorkGiver_DoBillOptimization : ClassWithFishPatches public abstract Predicate ThingValidator { get; set; } } - private class DelegateInstanceImplementation : DelegateInstance where T : class + private sealed class DelegateInstanceImplementation : DelegateInstance where T : class { #pragma warning disable CS8618 private T _instance; @@ -430,7 +446,7 @@ public class WorkGiver_DoBillOptimization : ClassWithFishPatches = AccessTools.FieldRefAccess>("thingValidator"); } - private abstract class ThingValidatorInstance + public abstract class ThingValidatorInstance { public abstract ThingValidatorInstance? Get(object obj); @@ -438,7 +454,7 @@ public class WorkGiver_DoBillOptimization : ClassWithFishPatches //public abstract Thing BillGiver { get; set; } } - private class ThingValidatorInstanceImplementation : ThingValidatorInstance where T : class + private sealed class ThingValidatorInstanceImplementation : ThingValidatorInstance where T : class { #pragma warning disable CS8618 private T _instance; @@ -467,27 +483,21 @@ public class WorkGiver_DoBillOptimization : ClassWithFishPatches private static AccessTools.FieldRef _bill = AccessTools.FieldRefAccess("bill"); //private static AccessTools.FieldRef _billGiver = AccessTools.FieldRefAccess("billGiver"); } +} - public class TryFindBestIngredientsHelper_Patch : FishPatch +public sealed class WorkGiver_DoBillOptimization : ClassWithFishPatches +{ + public sealed class TryFindBestIngredientsHelper_Patch : FishPatch { + public override bool ShowSettings => false; + public override string Description { get; } = "Part of the DoBill optimization"; - public override bool Enabled - { - set - { - if (base.Enabled == value) - return; - - Get().Enabled = base.Enabled = value; - } - } - public override Delegate TargetMethodGroup { get; } = WorkGiver_DoBill.TryFindBestIngredientsHelper; public static void Postfix(Predicate thingValidator) { - var thingValidatorInstance = _thingValidatorInstance.Get(thingValidator.Target); + var thingValidatorInstance = WorkGiver_DoBillPrepatches._thingValidatorInstance.Get(thingValidator.Target); if (thingValidatorInstance is null) return; @@ -505,8 +515,10 @@ public class WorkGiver_DoBillOptimization : ClassWithFishPatches } } - public class TryFindBestIngredientsInSet_NoMixHelper_Patch : FishPatch + public sealed class TryFindBestIngredientsInSet_NoMixHelper_Patch : FishPatch { + public override List LinkedPatches { get; } = [typeof(TryFindBestIngredientsHelper_Patch)]; + public override string Description { get; } = "Part of the DoBill optimization. Bills that need multiple ingredients, like for example steel and " + "components for guns, normally scan their surroundings for all those ingredients and count them, until " @@ -515,17 +527,6 @@ public class WorkGiver_DoBillOptimization : ClassWithFishPatches + "case of steel and components that could mean not having to go over 100s of steel stacks at times. " + "Prevents large spikes from these situations, does nothing for all other bills."; - public override bool Enabled - { - set - { - if (base.Enabled == value) - return; - - Get().Enabled = base.Enabled = value; - } - } - public override Delegate TargetMethodGroup { get; } = WorkGiver_DoBill.TryFindBestIngredientsInSet_NoMixHelper; public static void Prefix(ref bool alreadySorted, Bill? bill) @@ -549,16 +550,15 @@ public class WorkGiver_DoBillOptimization : ClassWithFishPatches && codes[i + 1] == FishTranspiler.Constant(1) // i++; && codes[i + 2] == FishTranspiler.Add && codes[i + 3] == i_variable.Store(), - code - => new[] - { + code => + [ new(OpCodes.Br_S, new_i_label), // else FishTranspiler.FirstLocalVariable(method, typeof(IngredientCount)) .WithLabels(code.ExtractLabels()), FishTranspiler.FirstArgument(method, typeof(Bill)), FishTranspiler.Call(MarkIngredientCountAsFound), code.WithLabels(new_i_label) - }); + ]); // if (!flag) // { @@ -599,7 +599,7 @@ public class WorkGiver_DoBillOptimization : ClassWithFishPatches } } - public class ThingPositionComparer : IComparer + public sealed class ThingPositionComparer : IComparer { public IntVec3 rootCell; diff --git a/Source/PerformanceFish/JobSystem/WorkGiver_HaulOptimization.cs b/Source/PerformanceFish/JobSystem/WorkGiver_HaulOptimization.cs index 8f095b9..3a92005 100644 --- a/Source/PerformanceFish/JobSystem/WorkGiver_HaulOptimization.cs +++ b/Source/PerformanceFish/JobSystem/WorkGiver_HaulOptimization.cs @@ -7,15 +7,15 @@ using PerformanceFish.ModCompatibility; namespace PerformanceFish.JobSystem; -public class WorkGiver_HaulOptimization : ClassWithFishPatches +public sealed class WorkGiver_HaulOptimization : ClassWithFishPatches { - public class PotentialWorkThingsGlobal_Patch : FishPatch + public sealed class PotentialWorkThingsGlobal_Patch : FishPatch { - public override bool Enabled => base.Enabled && !ActiveMods.Multiplayer; - + public override List IncompatibleModIDs { get; } = [PackageIDs.MULTIPLAYER]; + public override string Description { get; } = "Sorts haulables by distance before running expensive hauling calculations on them to avoid checks on " - + "far away items"; + + "far away items"; public override MethodBase TargetMethodInfo { get; } = AccessTools.Method(typeof(WorkGiver_Haul), nameof(WorkGiver_Haul.PotentialWorkThingsGlobal)); diff --git a/Source/PerformanceFish/JobSystem/WorkGiver_MergeOptimization.cs b/Source/PerformanceFish/JobSystem/WorkGiver_MergeOptimization.cs index 2b69252..ccf3afe 100644 --- a/Source/PerformanceFish/JobSystem/WorkGiver_MergeOptimization.cs +++ b/Source/PerformanceFish/JobSystem/WorkGiver_MergeOptimization.cs @@ -7,13 +7,13 @@ using Verse.AI; namespace PerformanceFish.JobSystem; -public class WorkGiver_MergeOptimization : ClassWithFishPatches +public sealed class WorkGiver_MergeOptimization : ClassWithFishPatches { - public class JobOnThing_Patch : FishPatch + public sealed class JobOnThing_Patch : FishPatch { public override string Description { get; } = "Removes mergeables from ListerMergeables if they no longer qualify as mergeable when trying to check " - + "for a merging job on them. Vanilla RimWorld just fails and keeps them in"; + + "for a merging job on them. Vanilla RimWorld just fails and keeps them in"; public override MethodBase TargetMethodInfo { get; } = AccessTools.Method(typeof(WorkGiver_Merge), nameof(WorkGiver_Merge.JobOnThing)); @@ -23,14 +23,16 @@ public class WorkGiver_MergeOptimization : ClassWithFishPatches if (t.GetSlotGroup() is not null) return true; - RemoveFromListerMergeables(t); + TryRemoveFromListerMergeables(t); __result = null; return false; } - private static void RemoveFromListerMergeables(Thing t) + private static void TryRemoveFromListerMergeables(Thing t) { - var map = t.MapHeld; + if (t.TryGetMapHeld() is not { } map) + return; + map.listerMergeables.TryRemove(t); map.listerHaulables.Check(t); } diff --git a/Source/PerformanceFish/ListerThingsExtensions.cs b/Source/PerformanceFish/ListerThingsExtensions.cs new file mode 100644 index 0000000..61e9f4b --- /dev/null +++ b/Source/PerformanceFish/ListerThingsExtensions.cs @@ -0,0 +1,26 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using JetBrains.Annotations; +using PerformanceFish.Listers; + +namespace PerformanceFish; + +[PublicAPI] +public static class ListerThingsExtensions +{ + public static void RemoveFromGroup(this ListerThings listerThings, Thing thing, ThingRequestGroup group) + => ThingsPrepatches.RemoveFromGroupList(listerThings, thing, group); + + public static void AddToGroup(this ListerThings listerThings, Thing thing, ThingRequestGroup group) + => ThingsPrepatches.AddToGroupList(listerThings, thing, group); + + + public static void RemoveFromDefList(this ListerThings listerThings, Thing thing) + => ThingsPrepatches.RemoveFromDefList(listerThings, thing); + + public static void AddToDefList(this ListerThings listerThings, Thing thing) + => ThingsPrepatches.AddToDefList(listerThings, thing); +} \ No newline at end of file diff --git a/Source/PerformanceFish/Listers/Buildings.cs b/Source/PerformanceFish/Listers/Buildings.cs index 776e33e..e69a416 100644 --- a/Source/PerformanceFish/Listers/Buildings.cs +++ b/Source/PerformanceFish/Listers/Buildings.cs @@ -3,300 +3,246 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. -using System.Linq; +using Mono.Cecil; +using Mono.Cecil.Cil; +using PerformanceFish.Prepatching; namespace PerformanceFish.Listers; -public class Buildings : ClassWithFishPatches +public sealed class Buildings : ClassWithFishPrepatches { - /// - /// Get Things from the ListerThings dictionary with a rather quick lookup instead of looping over every single element in the lists of listerBuildings - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static List ThingsOfDefFast(ListerThings listerThings, ThingDef def) - => listerThings.listsByDef.TryGetValue(def) ?? ListerThings.EmptyList; - - public class ColonistsHaveBuilding_Patch : FishPatch + public sealed class AllBuildingsColonistOfClassPatch : FishPrepatch { public override string Description { get; } - = "ListerBuildings optimization. Should be relatively riskfree, but doesn't impact performance much " - + "outside of a few prevented spikes here and there either"; + = "Optimizes building lookups for generic types on ListerBuildings to directly return the result of cached " + + "data instead of iterating over all buildings on the map trying to find all matches"; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(ListerBuildings), nameof(ListerBuildings.AllBuildingsColonistOfClass)); - public override Expression TargetMethod { get; } - = static () => default(ListerBuildings)!.ColonistsHaveBuilding(default(ThingDef)); + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); - public static bool Prefix(ListerBuildings __instance, ref bool __result, ThingDef def) - { - var lister = GetListerThings(__instance); - if (lister is null) - return true; + public static IEnumerable ReplacementBody(ListerBuildings __instance) where T : Building + => (IEnumerable)__instance.Cache().ColonistBuildingsByType.GetOrAdd(typeof(T)); + } + + public sealed class ColonistsHaveResearchBenchPatch : FishPrepatch + { + public override string Description { get; } + = "Optimizes research bench lookups on ListerBuildings to directly return the result of cached data " + + "instead of iterating over all buildings on the map trying to find the bench"; - __result = ContainsDefForColonists(lister, def); - return false; - } + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(ListerBuildings), nameof(ListerBuildings.ColonistsHaveResearchBench)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static bool ReplacementBody(ListerBuildings __instance) + => __instance.Cache().ColonistResearchBenches.Count > 0; + } + + public sealed class ColonistsHaveBuildingPatch : FishPrepatch + { + public override string Description { get; } + = "Optimizes building lookups by def on ListerBuildings to directly return the result of cached " + + "data instead of iterating over all buildings on the map trying to find any matches"; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(ListerBuildings), nameof(ListerBuildings.ColonistsHaveBuilding), + [typeof(ThingDef)]); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static bool ReplacementBody(ListerBuildings __instance, ThingDef def) + => __instance.Cache().ColonistBuildingsByDef.GetOrAdd(def).Count > 0; } - public class ColonistsHaveResearchBench_Patch : FishPatch + public sealed class AllBuildingsColonistOfDef_Patch : FishPrepatch { public override string Description { get; } - = "ListerBuildings optimization. Should be relatively riskfree, but doesn't impact performance much " - + "outside of a few prevented spikes here and there either"; + = "Optimizes building lookups by def on ListerBuildings to directly return the result of cached " + + "data instead of iterating over all buildings on the map trying to find all matches. Relatively large " + + "performance impact when having water power plants on the map"; - public override Expression TargetMethod { get; } - = static () => default(ListerBuildings)!.ColonistsHaveResearchBench(); + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(ListerBuildings), nameof(ListerBuildings.AllBuildingsColonistOfDef)); - public static bool Prefix(ListerBuildings __instance, ref bool __result) - { - var lister = GetListerThings(__instance); - if (lister is null) - return true; + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); - var researchBenches = LazyInit.ResearchBenches; - for (var i = 0; i < researchBenches.Length; i++) - { - if (!ContainsDefForColonists(lister, researchBenches[i])) - continue; - - __result = true; - break; - } - - return false; - } - - public static class LazyInit - { - public static ThingDef[] ResearchBenches = DefDatabase.AllDefsListForReading - .Where(static def => def.thingClass == typeof(Building_ResearchBench)).ToArray(); - - static LazyInit() - { - // beforefieldinit - } - } + public static IEnumerable ReplacementBody(ListerBuildings __instance, ThingDef def) + => __instance.Cache().ColonistBuildingsByDef.GetOrAdd(def); } - public class ColonistsHaveBuildingWithPowerOn_Patch : FishPatch + public sealed class AllBuildingsNonColonistOfDef_Patch : FishPrepatch { public override string Description { get; } - = "ListerBuildings optimization. Should be relatively riskfree, but doesn't impact performance much " - + "outside of a few prevented spikes here and there either"; + = "Optimizes building lookups by def on ListerBuildings to directly return the result of cached " + + "data instead of iterating over all buildings on the map trying to find all matches"; - public override Expression TargetMethod { get; } - = static () => default(ListerBuildings)!.ColonistsHaveBuildingWithPowerOn(null); + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(ListerBuildings), nameof(ListerBuildings.AllBuildingsNonColonistOfDef)); - public static bool Prefix(ListerBuildings __instance, ref bool __result, ThingDef def) + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static IEnumerable ReplacementBody(ListerBuildings __instance, ThingDef def) + => __instance.Cache().NonColonistBuildingsByDef.GetOrAdd(def); + } + + public sealed class ColonistsHaveBuildingWithPowerOnPatch : FishPrepatch + { + public override string Description { get; } + = "Optimizes lookups for powered buildings of a given def on ListerBuildings to directly return the result " + + "of cached data instead of iterating over all buildings on the map trying to find any matches"; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(ListerBuildings), + nameof(ListerBuildings.ColonistsHaveBuildingWithPowerOn)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static bool ReplacementBody(ListerBuildings __instance, ThingDef def) { - var lister = GetListerThings(__instance); - if (lister is null) - return true; - - var things = ThingsOfDefFast(lister, def); - var playerFaction = Faction.OfPlayerSilentFail; - for (var i = 0; i < things.Count; i++) + var colonistBuildingsOfDef = __instance.Cache().ColonistBuildingsByDef.GetOrAdd(def); + + for (var i = 0; i < colonistBuildingsOfDef.Count; i++) { - if (things[i].Faction != playerFaction - || things[i].TryGetComp() is { PowerOn: false }) - { - continue; - } - - __result = true; - break; + if (colonistBuildingsOfDef[i].TryGetComp() is not { PowerOn: false }) + return true; } return false; } } - - public class AllBuildingsColonistOfDef_Patch : FishPatch + + public sealed class AddPatch : FishPrepatch { - public override string Description { get; } - = "ListerBuildings optimization. Relatively large performance impact when having water power plants on the " - + "map."; + public override List LinkedPatches { get; } = + [ + typeof(AllBuildingsColonistOfClassPatch), typeof(ColonistsHaveResearchBenchPatch), + typeof(ColonistsHaveBuildingPatch), typeof(AllBuildingsColonistOfDef_Patch), + typeof(ColonistsHaveBuildingWithPowerOnPatch), + typeof(DeepResourceGridOptimization.AnyActiveDeepScannersOnMapPatch) + ]; + + public override string? Description { get; } + = "Required for all other ListerBuildings patches. This assigns buildings to the cache when they're " + + "spawned"; - public override Expression TargetMethod { get; } - = static () => default(ListerBuildings)!.AllBuildingsColonistOfDef(null); + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(ListerBuildings), nameof(ListerBuildings.Add)); - public static bool Prefix(ListerBuildings __instance, ref IEnumerable __result, ThingDef def) + public static void Postfix(ListerBuildings __instance, Building b) { - var lister = GetListerThings(__instance); - if (lister is null) - return true; + var def = b.def; + + if (def.building is { isNaturalRock: true }) + return; - __result = AllBuildingsColonistOfDefReplacement(lister, def); - return false; - } - - public static IEnumerable AllBuildingsColonistOfDefReplacement(ListerThings lister, ThingDef def) - { - var things = ThingsOfDefFast(lister, def); - var playerFaction = Faction.OfPlayerSilentFail; - for (var i = 0; i < things.Count; i++) + var cache = __instance.Cache(); + + if (b.Faction == Faction.OfPlayer) { - if (things[i] is Building building) - { - if (building.Faction == playerFaction) - yield return building; - } - else - { - ThrowWarning(def, things[i]); - yield break; - } - } - } - } - - public record struct AllBuildingsColonistOfDefCacheValue - { - public List Buildings; - } - - public class AllBuildingsNonColonistOfDef_Patch : FishPatch - { - public override string Description { get; } - = "ListerBuildings optimization. Should be relatively riskfree, but doesn't impact performance much " - + "outside of a few prevented spikes here and there either"; - - public override Expression TargetMethod { get; } - = static () => default(ListerBuildings)!.AllBuildingsNonColonistOfDef(null); - - public static bool Prefix(ListerBuildings __instance, ref IEnumerable __result, ThingDef def) - { - var lister = GetListerThings(__instance); - if (lister is null) - return true; - - __result = AllBuildingsNonColonistOfDefReplacement(lister, def); - return false; - } - - public static IEnumerable AllBuildingsNonColonistOfDefReplacement(ListerThings lister, ThingDef def) - { - var things = ThingsOfDefFast(lister, def); - var playerFaction = Faction.OfPlayerSilentFail; - for (var i = 0; i < things.Count; i++) - { - if (things[i] is Building building) - { - if (building.Faction != playerFaction) - yield return building; - } - else - { - ThrowWarning(def, things[i]); - yield break; - } - } - } - } - -#if harmonyIsFailingOnThisOne - public class AllBuildingsColonistOfClass_Patch : FishPatch - { - public override string Description { get; } - = "ListerBuildings optimization. Should be relatively riskfree, but doesn't impact performance much " - + "outside of a few prevented spikes here and there either"; - - public override Expression TargetMethod { get; } - = static () => default(ListerBuildings)!.AllBuildingsColonistOfClass(); - - public static bool Prefix(ListerBuildings __instance, MethodBase __originalMethod, ref IEnumerable __result) - { - var lister = GetListerThings(__instance); - if (lister is null) - return true; - - var type = __originalMethod.GetGenericArguments()[0]; //<-- This always returns Building instead of the - // type it's actually meant to look for - DebugLog.Message($"AllBuildingsColonistOfClass running for type {type.Name}"); - if (!Replacements.TryGetValue(type, out var replacement)) - { - Replacements.Add(type, - replacement = (GenericReplacementBase)Activator.CreateInstance( - typeof(GenericReplacement<>).MakeGenericType(type))); - } - - __result = replacement.Replacement(lister); - return false; - } - - public static Dictionary Replacements { get; } = new(); - - public abstract class GenericReplacementBase - { - public abstract IEnumerable Replacement(ListerThings lister); - } - - public class GenericReplacement : GenericReplacementBase where T : Building - { - public override IEnumerable Replacement(ListerThings lister) - { - buildingsOfClass ??= DefDatabase.AllDefsListForReading - .Where(static def => def.thingClass == typeof(T)).ToArray(); + cache.ColonistBuildingsByDef.GetOrAdd(def).Add(b); + if (b is Building_ResearchBench researchBench) + cache.ColonistResearchBenches.Add(researchBench); - foreach (var def in buildingsOfClass) + if (b.TryGetComp() != null) + cache.ColonistDeepScanners.Add(b); + + var buildingType = b.GetType(); + + do { - var things = ThingsOfDefFast(lister, def); - for (var i = 0; i < things.Count; i++) - { - if (things[i].Faction == Faction.OfPlayerSilentFail) - yield return things[i]; - } + if (buildingType == null) + break; + + cache.ColonistBuildingsByType.GetOrAdd(buildingType).Add(b); } + while ((buildingType = buildingType.BaseType) != typeof(Building)); + } + else + { + cache.NonColonistBuildingsByDef.GetOrAdd(def).Add(b); } - - public ThingDef[]? buildingsOfClass; } } -#endif - public class Map_Patch : FishPatch + public sealed class RemovePatch : FishPrepatch { - public override string Description { get; } - = "Part of the ListerBuildings optimizations. Without this patch mods like Colony Manager throw errors " - + "during loading"; + public override List LinkedPatches { get; } = + [ + typeof(AllBuildingsColonistOfClassPatch), typeof(ColonistsHaveResearchBenchPatch), + typeof(ColonistsHaveBuildingPatch), typeof(AllBuildingsColonistOfDef_Patch), + typeof(ColonistsHaveBuildingWithPowerOnPatch), + typeof(DeepResourceGridOptimization.AnyActiveDeepScannersOnMapPatch) + ]; - public override MethodBase TargetMethodInfo { get; } = AccessTools.Constructor(typeof(Map)); - public static void Postfix(Map __instance) => _tempMap = __instance; - } + public override string? Description { get; } + = "Required for all other ListerBuildings patches. This removes buildings from the map when they're " + + "despawned"; - private static Map? _tempMap; - // mapComps get constructed before maps are added to Game.Maps, so this makes the patches work there too + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(ListerBuildings), nameof(ListerBuildings.Remove)); - public static void ThrowWarning(ThingDef def, Thing thing) - => Log.Warning($"Tried to get building of def {def}, but its type is {thing.GetType()} instead of Building"); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ListerThings? GetListerThings(ListerBuildings listerBuildings) - { - var maps = Current.gameInt.Maps; - for (var i = 0; i < maps.Count; i++) + public static void Postfix(ListerBuildings __instance, Building b) { - if (maps[i].listerBuildings == listerBuildings) - return maps[i].listerThings; - } + var def = b.def; + + if (def.building is { isNaturalRock: true }) + return; - return GetListerThingsUsingTempMapFallback(listerBuildings); + var cache = __instance.Cache(); + + if (b.Faction == Faction.OfPlayer) + { + cache.ColonistBuildingsByDef.GetOrAdd(def).Remove(b); + if (b is Building_ResearchBench researchBench) + cache.ColonistResearchBenches.Remove(researchBench); + + cache.ColonistDeepScanners.Remove(b); + + var buildingType = b.GetType(); + + do + { + if (buildingType == null) + break; + + cache.ColonistBuildingsByType.GetOrAdd(buildingType).Remove(b); + } + while ((buildingType = buildingType.BaseType) != typeof(Building)); + } + else + { + cache.NonColonistBuildingsByDef.GetOrAdd(def).Remove(b); + } + } } - [MethodImpl(MethodImplOptions.NoInlining)] - private static ListerThings? GetListerThingsUsingTempMapFallback(ListerBuildings listerBuildings) - => _tempMap!.listerBuildings == listerBuildings ? _tempMap.listerThings : null; - - public static bool ContainsDefForColonists(ListerThings listerThings, ThingDef def) + public readonly record struct Cache { - if (!listerThings.listsByDef.TryGetValue(def, out var things)) - return false; + public readonly FishTable> + ColonistBuildingsByDef = new(), + NonColonistBuildingsByDef = new(); - var playerFaction = Faction.OfPlayerSilentFail; - for (var i = 0; i < things.Count; i++) + public readonly IndexedFishSet ColonistResearchBenches = []; + + public readonly IndexedFishSet ColonistDeepScanners = []; + + public readonly FishTable ColonistBuildingsByType = new() { - if (things[i].Faction == playerFaction) - return true; - } + ValueInitializer = static type + => (IList)Activator.CreateInstance(typeof(IndexedFishSet<>).MakeGenericType(type)) + }; - return false; + public Cache() + { + } } } \ No newline at end of file diff --git a/Source/PerformanceFish/Listers/Haulables.cs b/Source/PerformanceFish/Listers/Haulables.cs index 7460a54..fb819d3 100644 --- a/Source/PerformanceFish/Listers/Haulables.cs +++ b/Source/PerformanceFish/Listers/Haulables.cs @@ -3,375 +3,177 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. -global using HaulablesCache - = PerformanceFish.Cache.ByReference; -using System.Collections.Concurrent; -using System.Diagnostics; -using System.Reflection.Emit; -using System.Runtime.InteropServices; -using System.Threading.Tasks; -using PerformanceFish.Cache; -using PerformanceFish.ModCompatibility; +using Mono.Cecil; +using Mono.Cecil.Cil; +using MonoMod.Utils; +using PerformanceFish.Prepatching; namespace PerformanceFish.Listers; -public class Haulables : ClassWithFishPatches +public sealed class Haulables : ClassWithFishPrepatches { - public class MapPreTick_Patch : FishPatch + public sealed class CheckPatch : FishPrepatch { - public override bool Enabled => base.Enabled && !ActiveMods.Multiplayer; - - public override string Description { get; } - = "Throttling of the ListerHaulablesTick. This marks whether items should be moved from one stockpile to " - + "another. When throttled these checks get spread out more evenly, helping against spikes that can " - + "happen with large deep storage containers."; + public override string? Description { get; } + = "Optimizes the ListerHaulables by making frequent checks that happen every tick to only check for adding " + + "new haulables, skipping things that are already inside the lister. This generally results in them " + + "getting removed when actively checked by pawns or otherwise getting destroyed instead, which happens " + + "far less frequently. Hauling behaviour visible to the player remains identical"; - public override Expression TargetMethod { get; } = static () => default(Map)!.MapPreTick(); + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(ListerHaulables), nameof(ListerHaulables.Check)); - public static CodeInstructions Transpiler(CodeInstructions codes) - => codes.MethodReplacer(new ListerHaulables(null).ListerHaulablesTick, - ThreadedOrThrottled_ListerHaulablesTick); - - public static void ThreadedOrThrottled_ListerHaulablesTick(ListerHaulables instance) - { - MainThread = Environment.CurrentManagedThreadId; - - if (false && FishSettings.ThreadingEnabled) - Threaded_ListerHaulablesTick(instance); - else - Throttled_ListerHaulablesTick(instance); - } - - //disabled - public static void Threaded_ListerHaulablesTick(ListerHaulables instance) - { - DequeueQueuedThings(instance); - - var currentCellCheckCount = GetCellCheckCount(instance); - if (currentCellCheckCount is null) - return; - - if (_currentTask is { IsCompleted: false }) - { - if (currentCellCheckCount.value > 1) - currentCellCheckCount.value--; - if (Volatile.Read(ref _queue) == 0) - { - Interlocked.Increment(ref _queue); - _currentTask = _currentTask.ContinueWith(t => - { - if (t.Exception is { } taskException) - Log.Error(taskException.ToString()); - - lock (Lock) - { - _skippedTicks = 0; - Interlocked.Decrement(ref _queue); - ListerHaulablesTick_Patch.CurrentCellCheckCount = currentCellCheckCount.value; - instance.ListerHaulablesTick(); - } - }); - } - else - { - if (_skippedTicks >= 9) - { - Log.Warning("Skipped 10 or more ListerHaulables ticks. This often means there's some " - + "kind of hauling error happening"); - _skippedTicks = 0; - } - else - { - _skippedTicks++; - } - } - - return; - } - else - { - if (currentCellCheckCount.value < ListerHaulables.CellsPerTick) - currentCellCheckCount.value++; - } - - if (_currentTask?.Exception is { } exception) - Log.Error(exception.ToString()); - - _currentTask = Task.Run(() => - { - lock (Lock) - { - _skippedTicks = 0; - ListerHaulablesTick_Patch.CurrentCellCheckCount = currentCellCheckCount.value; - instance.ListerHaulablesTick(); - } - }); - } - - public static void DequeueQueuedThings(ListerHaulables instance) - { - while (ThingsToRemove.TryDequeue(out var thing)) - TryRemove(instance, thing); - - while (ThingsToAdd.TryDequeue(out var thing)) - TryAdd(instance, thing); - } - - public static void Throttled_ListerHaulablesTick(ListerHaulables instance) - { - var cellCheckCount = GetCellCheckCount(instance); - if (cellCheckCount is null) - return; - - ListerHaulablesTick_Patch.CurrentCellCheckCount = cellCheckCount.value; - Stopwatch.Start(); - try - { - instance.ListerHaulablesTick(); - } - catch (Exception ex) - { - Log.Error(ex.ToString()); - } - - Stopwatch.Stop(); - if (Stopwatch.ElapsedTicks > 4000L) - { - if (cellCheckCount.value > 0) - cellCheckCount.value--; - } - else - { - if (cellCheckCount.value < 4) - cellCheckCount.value++; - } - - Stopwatch.Reset(); - } - - private static ListerHaulablesTick_Patch.CellCheckCount? GetCellCheckCount(ListerHaulables instance) - { - var groupCycleIndex = ListerHaulables.groupCycleIndex + 1; - if (groupCycleIndex >= int.MaxValue) - groupCycleIndex = 0; - if (groupCycleIndex == _lastGroupCycleIndex) - { - groupCycleIndex++; - if (groupCycleIndex >= int.MaxValue) - groupCycleIndex = 0; - } - - _lastGroupCycleIndex = groupCycleIndex; - - var allGroupsListForReading = instance.map.haulDestinationManager.AllGroupsListForReading; - if (allGroupsListForReading.Count == 0) - return null; - - var num = groupCycleIndex % allGroupsListForReading.Count; - var slotGroup = allGroupsListForReading[num]; - return slotGroup.CellsList.Count == 0 - ? null - : ListerHaulablesTick_Patch.CellCheckCountsBySlotGroup.GetOrCreateValue(slotGroup); - } - - public static int MainThread { get; private set; } - public static ConcurrentQueue ThingsToRemove { get; } = new(); - public static ConcurrentQueue ThingsToAdd { get; } = new(); - private static Stopwatch Stopwatch { get; } = new(); - - private static int _lastGroupCycleIndex; - private static int _skippedTicks; - private static int _queue; - private static Task? _currentTask; - - private static object Lock { get; } = new(); + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(CheckAddPatch.ReplacementBody); } - - public class ListerHaulablesTick_Patch : FishPatch + + public sealed class CheckAddPatch : FishPrepatch { - public override bool Enabled => base.Enabled && !ActiveMods.Multiplayer; - - public override string Description { get; } = "Part of the ListerHaulables throttling optimization"; + public override string? Description { get; } + = "Caches haulables in a fast custom hash set to not have to look them up in a large list"; - public override Expression TargetMethod { get; } - = static () => default(ListerHaulables)!.ListerHaulablesTick(); + public override List LinkedPatches { get; } = [typeof(TryRemovePatch)]; - public static CodeInstructions Transpiler(CodeInstructions codes) - => codes //.MethodReplacer(GridsUtility.GetThingList, GetCopyOfThingList) - .Manipulator(static c => c.LoadsConstant(4), static c => - { - c.opcode = OpCodes.Call; - c.operand = typeof(ListerHaulablesTick_Patch).GetProperty(nameof(CurrentCellCheckCount))!.GetMethod; - }); + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(ListerHaulables), nameof(ListerHaulables.CheckAdd)); - /*public static List GetCopyOfThingList(IntVec3 c, Map map) + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static void ReplacementBody(ListerHaulables __instance, Thing t) { - if (FishSettings.ThreadingEnabled) - { - PrivateThingList.ReplaceContentsWith(map.thingGrid.ThingsListAt(c)); - return PrivateThingList; - } - else - { - return map.thingGrid.ThingsListAt(c); - } - }*/ - public static int CurrentCellCheckCount { get; set; } = ListerHaulables.CellsPerTick; - public static ConditionalWeakTable CellCheckCountsBySlotGroup { get; } = new(); - - public class CellCheckCount - { - public int value = ListerHaulables.CellsPerTick; - } - //private static List PrivateThingList { get; } = new(); - } - - public static void TryAdd(ListerHaulables instance, Thing t) - { - ref var cache = ref HaulablesCache.GetAndCheck(t, instance); - if (cache.Contains) - return; - - if (!instance.haulables.Contains(t)) - instance.haulables.Add(t); - - cache.SetValue(true, t); - } - - public static void ThreadSafeTryAdd(ListerHaulables instance, Thing t) - { - if (Environment.CurrentManagedThreadId == MapPreTick_Patch.MainThread || !FishSettings.ThreadingEnabled) - { - TryAdd(instance, t); - } - else - { - if (!HaulablesCache.GetAndCheck(t, instance).Contains) - MapPreTick_Patch.ThingsToAdd.Enqueue(t); - } - } - - public static void TryRemove(ListerHaulables instance, Thing t) - { - ref var cache = ref HaulablesCache.GetAndCheck(t, instance); - if (!cache.Contains) - return; - - instance.haulables.Remove(t); - cache.SetValue(false, t); - } - - public static void ThreadSafeTryRemove(ListerHaulables instance, Thing t) - { - if (Environment.CurrentManagedThreadId == MapPreTick_Patch.MainThread || !FishSettings.ThreadingEnabled) - { - TryRemove(instance, t); - } - else - { - if (HaulablesCache.GetAndCheck(t, instance).Contains) - MapPreTick_Patch.ThingsToRemove.Enqueue(t); - } - } - - public class Check_Patch : FishPatch - { - public override string Description { get; } = "Optimization for haulables checking"; - public override Expression TargetMethod { get; } = static () => default(ListerHaulables)!.Check(null); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void Check(ListerHaulables instance, Thing t) - { - // So the situation here is this: Vanilla RimWorld normally checks 4 storage cells per tick for valid haul - // destinations, usually with the intent of reaching higher priority storage. This check itself can get - // quite expensive, but 4 of them aren't at all enough to be worth bothering with. Now problems arise when - // LWM's deep storage comes into play: You put 5 stacks of items in one cell and suddenly 4 checks turn - // into 20. 20 hauling checks in turn is a number large enough to cause performance issues in colonies with - // high wealth. - - if (!t.def.alwaysHaulable && !t.def.designateHaulable) - return; - - if (instance.ShouldBeHaulable(t)) - ThreadSafeTryAdd(instance, t); - else - ThreadSafeTryRemove(instance, t); - } - - public static CodeInstructions Transpiler(CodeInstructions codeInstructions, ILGenerator generator) - => Reflection.GetCodeInstructions(Check, generator); - } - - public class TryRemove_Patch : FishPatch - { - public override string Description { get; } = "Part of the ListerHaulables optimization"; - - public override Expression TargetMethod { get; } - = static () => default(ListerHaulables)!.TryRemove(null); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void TryRemove(ListerHaulables instance, Thing t) - { - if (t.def.category == ThingCategory.Item) - ThreadSafeTryRemove(instance, t); - } - - public static CodeInstructions Transpiler(CodeInstructions codeInstructions, ILGenerator generator) - => Reflection.GetCodeInstructions(TryRemove, generator); - } - - public class CheckAdd_Patch : FishPatch - { - public override string Description { get; } = "Part of the ListerHaulables optimization"; - - public override Expression TargetMethod { get; } - = static () => default(ListerHaulables)!.CheckAdd(null); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void CheckAdd(ListerHaulables instance, Thing t) - { - if (!t.def.alwaysHaulable && !t.def.designateHaulable) + if (!t.IsItem()) return; - if (HaulablesCache.GetAndCheck(t, instance).Contains - || !instance.ShouldBeHaulable(t)) - { + var haulables = __instance.haulables; + + ref var cache = ref __instance.Cache(); + cache.CheckUpdate(haulables); + + var haulablesInCache = cache.ContainedThings; + var thingKey = t.GetKey(); + if (haulablesInCache.Contains(thingKey)) return; - } - - ThreadSafeTryAdd(instance, t); + + if (!__instance.ShouldBeHaulable(t)) + return; + + haulables.Add(t); + haulablesInCache.Add(thingKey); } + } + + public sealed class TryRemovePatch : FishPrepatch + { + public override string? Description { get; } + = "Caches haulables in a fast custom hash set to not have to look them up in a large list"; + + public override List LinkedPatches { get; } = [typeof(CheckAddPatch)]; - public static CodeInstructions Transpiler(CodeInstructions codeInstructions, ILGenerator generator) - => Reflection.GetCodeInstructions(CheckAdd, generator); + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(ListerHaulables), nameof(ListerHaulables.TryRemove)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static void ReplacementBody(ListerHaulables __instance, Thing t) + { + if (t.def.category != ThingCategory.Item) + return; + + var haulables = __instance.haulables; + + ref var cache = ref __instance.Cache(); + cache.CheckUpdate(haulables); + + if (cache.ContainedThings.Remove(t.GetKey())) + haulables.Remove(t); + } } - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public record struct HaulablesCacheValue : ICacheable + public sealed class TickPatch : FishPrepatch { - private int _nextRefreshTick; - public bool Contains; + public override string? Description { get; } + = "Essentially fixes a bug that was causing the method to tick cells multiple times for storages with less " + + "than 4 cells. Not ticking multiple times leads to a performance improvement"; - public void Update(ref HaulablesCache key) + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(ListerHaulables), nameof(ListerHaulables.ListerHaulablesTick)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) { - Contains = key.Second.haulables.Contains(key.First); - SetDirty(false, key.First.thingIDNumber); + var instructions = ilProcessor.instructions; + + var fourInstructionIndex = instructions.FirstIndexOf(static code + => code.OpCode == OpCodes.Ldc_I4_4 || (code.OpCode == OpCodes.Ldc_I4 && code.Operand is 4)); + + ilProcessor.InsertRange(fourInstructionIndex + 1, + (OpCodes.Ldloc, + ilProcessor.Body.Variables.First(static local => local.VariableType.Is(typeof(SlotGroup)))), + (OpCodes.Call, methodof(GetCellCountToTick))); } - public void SetValue(bool contains, Thing thing) - { - Contains = contains; - SetDirty(false, thing.thingIDNumber); - } - - public void SetDirty(bool value, int offset) - => _nextRefreshTick = value ? 0 : TickHelper.Add(3072, offset, 2048); + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int GetCellCountToTick(int original, SlotGroup slotGroup) + => Math.Min(original, slotGroup.CellsList.Count); + } + + public record struct Cache + { + public readonly FishSet ContainedThings = []; - public bool Dirty + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void CheckUpdate(List haulables) { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => TickHelper.Past(_nextRefreshTick); + if (IsDirty(haulables)) + Update(haulables); } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool IsDirty(List haulables) => haulables.Count != ContainedThings.Count; + + [MethodImpl(MethodImplOptions.NoInlining)] + public void Update(List haulables) + { + ContainedThings.Clear(); + + for (var i = haulables.Count; i-- > 0;) + ContainedThings.Add(haulables[i].GetKey()); + } + + public Cache() + { + } + } +} + +public static class ListerHaulablesExtensions +{ + public static void TryAddDirectly(this ListerHaulables lister, Thing t) + { + if (!t.IsItem()) + return; + + var haulables = lister.haulables; + + ref var cache = ref lister.Cache(); + cache.CheckUpdate(haulables); + + if (cache.ContainedThings.Add(t.GetKey())) + haulables.Add(t); + } + + public static void TryRemoveDirectly(this ListerHaulables lister, Thing t) + { + if (!t.IsItem()) + return; + + var haulables = lister.haulables; + + ref var cache = ref lister.Cache(); + cache.CheckUpdate(haulables); + + if (cache.ContainedThings.Remove(t.GetKey())) + haulables.Remove(t); } } \ No newline at end of file diff --git a/Source/PerformanceFish/Listers/Mergeables.cs b/Source/PerformanceFish/Listers/Mergeables.cs index 5aabf8f..7c39b9a 100644 --- a/Source/PerformanceFish/Listers/Mergeables.cs +++ b/Source/PerformanceFish/Listers/Mergeables.cs @@ -3,6 +3,8 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. +#if bad + global using MergeablesCache = PerformanceFish.Cache.ByReference; @@ -10,10 +12,21 @@ using PerformanceFish.Cache; namespace PerformanceFish.Listers; -public class Mergeables : ClassWithFishPatches +public sealed class Mergeables : ClassWithFishPatches { - public class Check_Patch : FishPatch + public sealed class Check_Patch : FishPatch { + protected internal override void OnPatchingCompleted() + { + Hauling.StorageSettingsPatches.TryNotifyChanged_Patch.Changed += _ => MergeablesCache.Get.Clear(); + + Events.ThingEvents.Initialized += thing => + { + if (thing is IHaulDestination) + thing.Events().Destroying += _ => MergeablesCache.Get.Clear(); + }; + } + public override string Description { get; } = "Optimization for mergeables checking"; public override Expression TargetMethod { get; } = static () => default(ListerMergeables)!.Check(null); @@ -46,7 +59,7 @@ public class Mergeables : ClassWithFishPatches => Reflection.MakeReplacementCall(Check); } - public class CheckAdd_Patch : FishPatch + public sealed class CheckAdd_Patch : FishPatch { public override string Description { get; } = "Part of the ListerMergeables optimization"; @@ -70,7 +83,7 @@ public class Mergeables : ClassWithFishPatches => Reflection.MakeReplacementCall(CheckAdd); } - public class TryRemove_Patch : FishPatch + public sealed class TryRemove_Patch : FishPatch { public override string Description { get; } = "Part of the ListerMergeables optimization"; @@ -79,16 +92,16 @@ public class Mergeables : ClassWithFishPatches public static void TryRemove(ListerMergeables instance, Thing t) { - if (t.def.category == ThingCategory.Item) - { - ref var cache = ref MergeablesCache.GetAndCheck(t, instance); + if (!t.IsItem()) + return; - if (!cache.Contains) - return; + ref var cache = ref MergeablesCache.GetAndCheck(t, instance); - instance.mergeables.Remove(t); - cache.SetValue(false, t); - } + if (!cache.Contains) + return; + + instance.mergeables.Remove(t); + cache.SetValue(false, t); } public static CodeInstructions Transpiler(CodeInstructions codeInstructions) @@ -121,4 +134,5 @@ public class Mergeables : ClassWithFishPatches get => TickHelper.Past(_nextRefreshTick); } } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/Source/PerformanceFish/Listers/Misc.cs b/Source/PerformanceFish/Listers/Misc.cs deleted file mode 100644 index 05b28ba..0000000 --- a/Source/PerformanceFish/Listers/Misc.cs +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2023 bradson -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at https://mozilla.org/MPL/2.0/. - -namespace PerformanceFish.Listers; - -public class Misc : ClassWithFishPatches -{ - public class Building_Destroy_Patch : FishPatch - { - public override string Description { get; } - = "Used for haulables caching. Items don't become haulable after deconstructing stockpiles without this " - + "patch"; - - public override Expression TargetMethod { get; } = static () => default(Building)!.Destroy(default); - - public static void Prefix(Building __instance) - { - if (__instance is not IHaulDestination) - return; - - HaulablesCache.Get.Clear(); - MergeablesCache.Get.Clear(); - } - } -} \ No newline at end of file diff --git a/Source/PerformanceFish/Listers/StorageSettingsPatches.cs b/Source/PerformanceFish/Listers/StorageSettingsPatches.cs deleted file mode 100644 index 4606a03..0000000 --- a/Source/PerformanceFish/Listers/StorageSettingsPatches.cs +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (c) 2023 bradson -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at https://mozilla.org/MPL/2.0/. - -using System.Runtime.InteropServices; -using PerformanceFish.Cache; -using StorageSettingsCache - = PerformanceFish.Cache.ByReference; - -namespace PerformanceFish.Listers; - -public class StorageSettingsPatches : ClassWithFishPatches -{ - public class AllowedToAccept_Patch : FirstPriorityFishPatch - { - public override string Description { get; } = "StorageSettings caching"; - - public override Expression TargetMethod { get; } - = static () => default(StorageSettings)!.AllowedToAccept(default(Thing)); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool Prefix(StorageSettings __instance, Thing t, ref bool __result, out bool __state) - { - ref var cache = ref StorageSettingsCache.GetOrAddReference(new(t, __instance)); - - if (cache.Dirty) - return __state = true; - - __result = cache.AllowedToAccept; - return __state = false; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void Postfix(StorageSettings __instance, Thing t, bool __result, bool __state) - { - if (!__state) - return; - - StorageSettingsCache.Update(t, __instance, __result); - } - } - - public class TryNotifyChanged_Patch : FishPatch - { - public override string Description { get; } = "StorageSettings cache resetting"; - public override Expression TargetMethod { get; } = static () => default(StorageSettings)!.TryNotifyChanged(); - - public static void Postfix(StorageSettings __instance) - { - StorageSettingsCache.Get.Clear(); - HaulablesCache.Get.Clear(); - MergeablesCache.Get.Clear(); - } - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public record struct StorageSettingsCacheValue : ICacheable - { - private int _nextRefreshTick; - public bool AllowedToAccept; - - public bool Dirty - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => TickHelper.Past(_nextRefreshTick); - } - - public void Update(ref StorageSettingsCache key, bool allowedToAccept) - { - AllowedToAccept = allowedToAccept; - _nextRefreshTick = TickHelper.Add(3072, key.First.thingIDNumber, 2048); - } - } -} \ No newline at end of file diff --git a/Source/PerformanceFish/Listers/ThingOwnerOptimization.cs b/Source/PerformanceFish/Listers/ThingOwnerOptimization.cs new file mode 100644 index 0000000..f920952 --- /dev/null +++ b/Source/PerformanceFish/Listers/ThingOwnerOptimization.cs @@ -0,0 +1,148 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using Mono.Cecil; +using Mono.Cecil.Cil; +using PerformanceFish.Prepatching; + +namespace PerformanceFish.Listers; + +public sealed class ThingOwnerOptimization : ClassWithFishPrepatches +{ + public sealed class ExposeDataPatch : FishPrepatch + { + public override string? Description { get; } + = "Required to keep the ThingOwner cache synced"; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(ThingOwner), nameof(ThingOwner.ExposeData)); + + public static void Postfix(ThingOwner __instance) where T : Thing + { + if (Scribe.mode != LoadSaveMode.PostLoadInit) + return; + + var indexMap = __instance.IndexMap(); + var innerList = __instance.innerList; + innerList.RemoveAll(static thing => thing is null); + + indexMap.Clear(); + for (var i = innerList.Count; i-- > 0;) + indexMap[innerList[i].GetKey()] = i; + } + } + + public sealed class TryAddPatch : FishPrepatch + { + public override string? Description { get; } + = "Required to keep the ThingOwner cache synced"; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(ThingOwner), nameof(ThingOwner.TryAdd), + [typeof(Thing), typeof(bool)]); + + public static void Postfix(ThingOwner __instance, Thing? item, bool canMergeWithExistingStacks, + bool __result) where T : Thing + { + if (!__result + || item is null + || (canMergeWithExistingStacks && (item.Destroyed || item.stackCount == 0))) + { + return; + } + + __instance.IndexMap()[item.GetKey()] = __instance.innerList.Count - 1; + } + } + + /*public sealed class IndexOfPatch : FishPrepatch // not really used enough to be worth patching + { + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(ThingOwner), nameof(ThingOwner.IndexOf)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static int ReplacementBody(ThingOwner instance, Thing? item) where T : Thing + => item is not T itemOfT || item.holdingOwner != instance + ? -1 + : instance.innerList is var innerList + && instance.IndexMap().TryGetValue(GetKey(itemOfT), out var knownIndex) + && knownIndex < innerList.Count + && innerList[knownIndex] == item + ? knownIndex + : innerList.IndexOf(itemOfT); + }*/ + + public sealed class RemovePatch : FishPrepatch + { + public override string? Description { get; } + = "Optimizes ThingOwner to keep a cache of thing indices, to greatly speed up removal and in turn improve " + + "performance when despawning happens. Late game colonies and maps in biomes with large amounts of plants " + + "benefit most from this"; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(ThingOwner), nameof(ThingOwner.Remove)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + { + var codes = ilProcessor.instructions; + + var lastIndexOfIndex = codes.FirstIndexOf(static code + => code.Operand is MethodReference { Name: "LastIndexOf" }); + + for (var i = lastIndexOfIndex; i-- > 0;) + { + if (codes[i].OpCode != OpCodes.Ldfld || !codes[i - 1].LoadsArgument(0)) + continue; + + codes.RemoveAt(i); + lastIndexOfIndex--; + break; + } + + var removeAtIndex = codes.FirstIndexOf(static code + => code.Operand is MethodReference { Name: "RemoveAt" }); + + for (var i = removeAtIndex + 1; i-- > 0;) + { + if (i == lastIndexOfIndex) + break; + + codes.RemoveAt(i); + } + + codes[lastIndexOfIndex].OpCode = OpCodes.Call; + codes[lastIndexOfIndex].Operand + = module.ImportMethodWithGenericArguments(methodof(Remove).GetGenericMethodDefinition(), + ilProcessor.Body.Method.DeclaringType.GenericParameters); + + var variables = ilProcessor.Body.Variables; + variables.RemoveAt(variables.FirstIndexOf(variable => variable.VariableType == module.TypeSystem.Int32)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Remove(ThingOwner instance, Thing item) where T : Thing + { + var indexMap = instance.IndexMap(); + var innerList = instance.innerList; + var itemKey = item.GetKey(); + + var index = indexMap.TryGetValue(itemKey, out var knownIndex) + && knownIndex < innerList.Count + && innerList[knownIndex] == item + ? knownIndex + : innerList.LastIndexOf((T)item); + + if (index >= 0) + innerList.RemoveAtFastUnordered(index); + + indexMap.Remove(itemKey); + + if (index < innerList.Count && index >= 0) + indexMap[innerList[index].GetKey()] = index; + } + } +} \ No newline at end of file diff --git a/Source/PerformanceFish/Listers/Things.cs b/Source/PerformanceFish/Listers/Things.cs index 12ddc23..b7886cf 100644 --- a/Source/PerformanceFish/Listers/Things.cs +++ b/Source/PerformanceFish/Listers/Things.cs @@ -3,27 +3,196 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. +using Mono.Cecil; +using Mono.Cecil.Cil; +using PerformanceFish.Prepatching; + namespace PerformanceFish.Listers; -public class Things : ClassWithFishPatches +public sealed class ThingsPrepatches : ClassWithFishPrepatches { - public class ThingsMatching_Patch : FirstPriorityFishPatch + public sealed class AddPatch : FishPrepatch { + public override string? Description { get; } + = "Required to keep the ListerThings cache synced"; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(ListerThings), nameof(ListerThings.Add)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static void ReplacementBody(ListerThings __instance, Thing t) + { + if (!ListerThings.EverListable(t.def, __instance.use)) + return; + + AddToDefList(__instance, t); + + var allGroups = ThingListGroupHelper.AllGroups; + foreach (var thingRequestGroup in allGroups) + { + if ((__instance.use == ListerThingsUse.Region && !thingRequestGroup.StoreInRegion()) + || !thingRequestGroup.Includes(t.def)) + { + continue; + } + + AddToGroupList(__instance, t, thingRequestGroup); + } + } + } + + public sealed class RemovePatch : FishPrepatch + { + public override string? Description { get; } + = "Optimizes ListerThings to keep a cache of thing indices within the lister, to greatly speed up removal " + + "and in turn improve performance when despawning happens. Late game colonies and maps in biomes with " + + "large amounts of plants benefit most from this"; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(ListerThings), nameof(ListerThings.Remove)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static void ReplacementBody(ListerThings __instance, Thing t) + { + if (!ListerThings.EverListable(t.def, __instance.use)) + return; + + RemoveFromDefList(__instance, t); + + var allGroups = ThingListGroupHelper.AllGroups; + for (var i = 0; i < allGroups.Length; i++) + { + var thingRequestGroup = allGroups[i]; + if ((__instance.use == ListerThingsUse.Region && !thingRequestGroup.StoreInRegion()) + || !thingRequestGroup.Includes(t.def)) + { + continue; + } + + RemoveFromGroupList(__instance, t, thingRequestGroup); + } + } + } + + public static void AddToDefList(ListerThings lister, Thing thing) + { + if (!lister.listsByDef.TryGetValue(thing.def, out var value)) + { + value = []; + lister.listsByDef.Add(thing.def, value); + } + + value.Add(thing); + lister.IndexMapByDef()[thing.GetKey()] = lister.listsByDef[thing.def].Count - 1; + } + + public static void AddToGroupList(ListerThings lister, Thing thing, ThingRequestGroup thingRequestGroup) + { + var list = lister.listsByGroup[(uint)thingRequestGroup]; + if (list == null) + { + list = []; + lister.listsByGroup[(uint)thingRequestGroup] = list; + lister.stateHashByGroup[(uint)thingRequestGroup] = 0; + } + + list.Add(thing); + lister.stateHashByGroup[(uint)thingRequestGroup]++; + + lister.IndexMapByGroup()[new(thingRequestGroup, thing.GetKey())] + = lister.listsByGroup[(uint)thingRequestGroup].Count - 1; + } + + public static void RemoveFromDefList(ListerThings lister, Thing thing) + { + var thingKey = thing.GetKey(); + var indexMapByDef = lister.IndexMapByDef(); + var listByDef = lister.listsByDef[thing.def]; + + var indexByDef = indexMapByDef.TryGetValue(thingKey, out var knownIndexByDef) + && knownIndexByDef < listByDef.Count + && listByDef[knownIndexByDef] == thing + ? knownIndexByDef + : listByDef.LastIndexOf(thing); + + if (indexByDef >= 0) + listByDef.RemoveAtFastUnordered(indexByDef); + + indexMapByDef.Remove(thingKey); + if (indexByDef < listByDef.Count && indexByDef >= 0) + indexMapByDef[listByDef[indexByDef].GetKey()] = indexByDef; + } + + public static void RemoveFromGroupList(ListerThings lister, Thing thing, ThingRequestGroup thingRequestGroup) + { + var indexMapByGroup = lister.IndexMapByGroup(); + var listByGroup = lister.listsByGroup[(int)thingRequestGroup]; + + var groupMapKey = new GroupThingPair(thingRequestGroup, thing.GetKey()); + + var indexByGroup + = indexMapByGroup.TryGetValue(groupMapKey, out var knownIndexByGroup) + && knownIndexByGroup < listByGroup.Count + && listByGroup[knownIndexByGroup] == thing + ? knownIndexByGroup + : listByGroup.LastIndexOf(thing); + + if (indexByGroup >= 0) + listByGroup.RemoveAtFastUnordered(indexByGroup); + + indexMapByGroup.Remove(groupMapKey); + if (indexByGroup < listByGroup.Count && indexByGroup >= 0) + indexMapByGroup[new(thingRequestGroup, listByGroup[indexByGroup].GetKey())] = indexByGroup; + + lister.stateHashByGroup[(uint)thingRequestGroup]++; + } + + public sealed class ContainsPatch : FishPrepatch + { + public override string? Description { get; } + = "Optimization utilizing a cache for faster Contains checks"; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(ListerThings), nameof(ListerThings.Contains)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static bool ReplacementBody(ListerThings __instance, Thing t) + => __instance.IndexMapByDef().ContainsKey(t.GetKey()) + || (__instance.listsByDef.TryGetValue(t.def)?.Contains(t) ?? false); + } + + public sealed class ClearPatch : FishPrepatch + { + public override string? Description { get; } + = "Required to keep the ListerThings cache synced"; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(ListerThings), nameof(ListerThings.Clear)); + + public static void Postfix(ListerThings __instance) + { + __instance.IndexMapByDef().Clear(); + __instance.IndexMapByGroup().Clear(); + } + } +} + +public sealed class Things : ClassWithFishPatches +{ + public sealed class ThingsMatching_Patch : FirstPriorityFishPatch + { + public override List LinkedPatches { get; } = [typeof(ThingFilterPatches.BestThingRequest_Patch)]; + public override string Description { get; } = "Part of the ThingFilter.BestThingRequest optimization. Required by that particular patch and gets " + "toggled alongside it"; - public override bool Enabled - { - set - { - if (base.Enabled == value) - return; - - Get().Enabled = base.Enabled = value; - } - } - public override Expression TargetMethod { get; } = static () => new ListerThings(default).ThingsMatching(default); @@ -61,7 +230,7 @@ public class Things : ClassWithFishPatches private static Dictionary, List>? _thingsOfDefsDictionary; #if disabled - public class ThingRequest_IsUndefined_Patch : FishPatch + public sealed class ThingRequest_IsUndefined_Patch : FishPatch { public override MethodBase TargetMethodInfo { get; } = AccessTools.PropertyGetter(typeof(ThingRequest), nameof(ThingRequest.IsUndefined)); @@ -79,7 +248,7 @@ public class Things : ClassWithFishPatches => __instance.group == ThingRequestGroup.Undefined && !((FishCache)__instance.singleDef).IsSingleDef; } - public class ThingRequest_CanBeFoundInRegion_Patch : FirstPriorityFishPatch + public sealed class ThingRequest_CanBeFoundInRegion_Patch : FirstPriorityFishPatch { public override MethodBase TargetMethodInfo { get; } = AccessTools.PropertyGetter(typeof(ThingRequest), nameof(ThingRequest.CanBeFoundInRegion)); @@ -99,7 +268,7 @@ public class Things : ClassWithFishPatches && (__instance.group == ThingRequestGroup.Nothing || __instance.group.StoreInRegion())); } - public class Add_Patch : FishPatch + public sealed class Add_Patch : FishPatch { public override Expression TargetMethod { get; } = static () => new ListerThings(default).Add(null); @@ -112,7 +281,7 @@ public class Things : ClassWithFishPatches } } - public class Remove_Patch : FishPatch + public sealed class Remove_Patch : FishPatch { public override Expression TargetMethod { get; } = static () => new ListerThings(default).Remove(null); @@ -125,7 +294,7 @@ public class Things : ClassWithFishPatches } } - public class Clear_Patch : FishPatch + public sealed class Clear_Patch : FishPatch { public override Expression TargetMethod { get; } = static () => new ListerThings(default).Clear(); @@ -138,7 +307,7 @@ public class Things : ClassWithFishPatches } } - public class ThingsMatching_Patch : FirstPriorityFishPatch + public sealed class ThingsMatching_Patch : FirstPriorityFishPatch { public override string Description { get; } = "Part of the work scanning optimization"; diff --git a/Source/PerformanceFish/Log.cs b/Source/PerformanceFish/Log.cs index fd9a4d0..7af0333 100644 --- a/Source/PerformanceFish/Log.cs +++ b/Source/PerformanceFish/Log.cs @@ -3,11 +3,11 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. -using System.Collections.Concurrent; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Runtime.InteropServices; using JetBrains.Annotations; -using PerformanceFish.Pools; +using FisheryLib.Pools; using PerformanceFish.Prepatching; namespace PerformanceFish; @@ -93,6 +93,7 @@ public static class Log public static UnhandledMessageQueue? UnhandledMessages { get; } = SetupUnhandledMessageQueue(); + [SuppressMessage("Reliability", "CA2000")] private static UnhandledMessageQueue? SetupUnhandledMessageQueue() { if (Ready) @@ -105,8 +106,7 @@ public static class Log return stashedMessages; } - stash.UnhandledMessages = stashedMessages = new(); - stash.MessageQueueGCHandle = GCHandle.Alloc(stashedMessages, GCHandleType.Pinned); + stash.MessageQueueGCHandle = GCHandle.Alloc(new UnhandledMessageQueue(), GCHandleType.Pinned); return stash.UnhandledMessages; } @@ -114,7 +114,7 @@ public static class Log } [StructLayout(LayoutKind.Sequential)] -public struct LogMessageData : IDisposable +public record struct LogMessageData : IDisposable { public IntPtr Text, StackTrace; @@ -188,18 +188,19 @@ public unsafe class UnhandledMessageQueue : IDisposable else { _arrayLength <<= 1; - _messages = (LogMessageData*)Marshal.ReAllocHGlobal((IntPtr)_messages, (IntPtr)_arrayLength); + _messages = (LogMessageData*)Marshal.ReAllocHGlobal((IntPtr)_messages, + (IntPtr)(_arrayLength * sizeof(LogMessageData))); } } // ReSharper disable once InconsistentlySynchronizedField - private void ReleaseUnmanagedResources() => Marshal.FreeHGlobal((IntPtr)_messages); + protected virtual void Dispose(bool disposing) => Marshal.FreeHGlobal((IntPtr)_messages); public void Dispose() { - ReleaseUnmanagedResources(); + Dispose(true); GC.SuppressFinalize(this); } - ~UnhandledMessageQueue() => ReleaseUnmanagedResources(); + ~UnhandledMessageQueue() => Dispose(false); } \ No newline at end of file diff --git a/Source/PerformanceFish/LogPatches.cs b/Source/PerformanceFish/LogPatches.cs index ad708f3..d2ac7f7 100644 --- a/Source/PerformanceFish/LogPatches.cs +++ b/Source/PerformanceFish/LogPatches.cs @@ -12,26 +12,28 @@ using FieldAttributes = Mono.Cecil.FieldAttributes; namespace PerformanceFish; -public class LogPatches : ClassWithFishPrepatches +public sealed class LogPatches : ClassWithFishPrepatches { public const string PERFORMANCE_FISH_WELCOME_MESSAGE = "Performance Fish!!!"; public const string PERFORMANCE_FISH_WELCOME_STACKTRACE = "UwU"; // This breaks my FishStash somehow // TODO: FIX - // public class LogVersionNumberPatch : FishPrepatch + // public sealed class LogVersionNumberPatch : FishPrepatch // { // public override MethodBase MethodBase { get; } = methodof(Root.CheckGlobalInit); // // public static void Prefix() => Log.Message("Performance Fish???"); // } - public class ClassPatch : FishClassPrepatch + public sealed class ClassPatch : FishClassPrepatch { public override string? Description { get; } = "Important logging patch"; public override bool Enabled => true; + public override bool ShowSettings => false; + public override Type Type => typeof(Verse.Log); public override void FreePatch(TypeDefinition typeDefinition) @@ -49,7 +51,7 @@ public class LogPatches : ClassWithFishPrepatches staticConstructorBody.GetILProcessor().InsertRange(staticConstructorBody.Instructions.Count - 2, (OpCodes.Ldc_I8, FishStash.StaticHandle), (OpCodes.Newobj, - module.ImportReference(typeof(FishStashHandle).GetConstructor(new[] { typeof(long) }))), + module.ImportReference(typeof(FishStashHandle).GetConstructor([typeof(long)]))), (OpCodes.Stsfld, fishStashHandleField), (OpCodes.Call, module.ImportReference(InsertEarlyMessages))); } diff --git a/Source/PerformanceFish/MapPrepatches.cs b/Source/PerformanceFish/MapPrepatches.cs new file mode 100644 index 0000000..608e936 --- /dev/null +++ b/Source/PerformanceFish/MapPrepatches.cs @@ -0,0 +1,123 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using PerformanceFish.Prepatching; + +namespace PerformanceFish; + +public sealed class MapPrepatches : ClassWithFishPrepatches +{ + public sealed class FinalizeLoadingPatch : FishPrepatch + { + public override string? Description { get; } + = "An attempt at logging and fixing possible causes for the common FMOD error spam. None of " + + "Performance Fish's other patches interact with this in any way."; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(Map), nameof(Map.FinalizeLoading)); + + public static void Postfix(Map __instance) + { + var listerThings = __instance.listerThings; + + var musicalInstruments = listerThings.ThingsInGroup(ThingRequestGroup.MusicalInstrument); + for (var i = musicalInstruments.Count; i-- > 0;) + { + var thing = musicalInstruments[i]; + if (thing is Building_MusicalInstrument) + continue; + + Log.Error($"Map '{__instance}' contains thing that is not of type 'Building_MusicalInstrument' " + + $"in ThingsInGroup for ThingRequestGroup.MusicalInstrument: '{ + thing}' at cell '{thing.Position}'. Removing now to prevent further issues."); + + if (!RefundOrRemoveIfUnassignable(__instance, thing)) + listerThings.RemoveFromGroup(thing, ThingRequestGroup.MusicalInstrument); + } + + var musicSources = listerThings.ThingsInGroup(ThingRequestGroup.MusicSource); + for (var i = musicSources.Count; i-- > 0;) + { + var thing = musicSources[i]; + if (thing.TryGetComp() != null) + continue; + + Log.Error($"Map '{__instance}' contains thing without comp of type 'CompPlaysMusic' in " + + $"ThingsInGroup for ThingRequestGroup.MusicSource: '{ + thing}' at cell '{thing.Position}'. Removing now to prevent further issues."); + + if (!RefundOrRemoveIfUnassignable(__instance, thing)) + listerThings.RemoveFromGroup(thing, ThingRequestGroup.MusicSource); + } + + var allThings = listerThings.AllThings; + for (var i = allThings.Count; i-- > 0;) + { + var thing = allThings[i]; + var thingDef = thing.def; + + if (thingDef is null) + { + Log.Error($"Map '{__instance}' contains thing '{thing}' with null def at cell '{ + thing.Position}'. This will likely cause issues. Removing now."); + + listerThings.Remove(thing); + // continue; + } + // else if (thing.GetType().IsAssignableTo(thingDef.thingClass)) + // { + // Log.Error($"Map '{__instance}' contains thing '{thing}' of incorrect type '{ + // thing.GetType()}' at cell '{thing.Position}'. This should be '{ + // thingDef.thingClass}' instead and will likely cause issues. Destroying and refunding now."); + // } + // else + // { + // continue; + // } + // + // if (!TryRefundOrRemove(__instance, thing)) + // listerThings.Remove(thing); + } + } + + private static bool RefundOrRemoveIfUnassignable(Map map, Thing thing) + { + if (thing.def != null && thing.GetType().IsAssignableTo(thing.def.thingClass)) + return false; + + return TryRefundOrRemove(map, thing); + } + + private static bool TryRefundOrRemove(Map map, Thing thing) + { + var previousAllowDestroy = Thing.allowDestroyNonDestroyable; + Thing.allowDestroyNonDestroyable = true; + + try + { + GenSpawn.Refund(thing, map, CellRect.Empty); + } + catch (Exception refundException) + { + Log.Error($"Failed to refund thing '{thing}'. Destroying.\n{refundException}"); + try + { + thing.Destroy(); + } + catch (Exception destroyException) + { + Log.Error($"Failed to destroy thing '{thing}'.\n{destroyException}"); + return false; + } + } + finally + { + Thing.allowDestroyNonDestroyable = previousAllowDestroy; + } + + return true; + } + } +} \ No newline at end of file diff --git a/Source/PerformanceFish/MassUtilityCaching.cs b/Source/PerformanceFish/MassUtilityCaching.cs index fd11929..db204df 100644 --- a/Source/PerformanceFish/MassUtilityCaching.cs +++ b/Source/PerformanceFish/MassUtilityCaching.cs @@ -9,9 +9,9 @@ using InventoryMassCache namespace PerformanceFish; -public class MassUtilityCaching : ClassWithFishPatches +public sealed class MassUtilityCaching : ClassWithFishPatches { - public class GearMass_Patch : FirstPriorityFishPatch + public sealed class GearMass_Patch : FirstPriorityFishPatch { public override string Description { get; } = "Caches pawn gear mass. Hauling jobs check this quite a lot"; public override Delegate TargetMethodGroup { get; } = MassUtility.GearMass; @@ -41,7 +41,7 @@ public class MassUtilityCaching : ClassWithFishPatches => GearMassCache.GetExistingReference(p).Update(__result, p); } - public class InventoryMass_Patch : FirstPriorityFishPatch + public sealed class InventoryMass_Patch : FirstPriorityFishPatch { public override string Description { get; } = "Caches pawn inventory mass. Hauling jobs check this quite a lot"; public override Delegate TargetMethodGroup { get; } = MassUtility.InventoryMass; diff --git a/Source/PerformanceFish/MeditationUtilityCaching.cs b/Source/PerformanceFish/MeditationUtilityCaching.cs index fd738fd..1fa4a09 100644 --- a/Source/PerformanceFish/MeditationUtilityCaching.cs +++ b/Source/PerformanceFish/MeditationUtilityCaching.cs @@ -10,9 +10,9 @@ using PsyfocusGainCache namespace PerformanceFish; // Suggested by https://github.com/notfood -public class MeditationUtilityCaching : ClassWithFishPatches +public sealed class MeditationUtilityCaching : ClassWithFishPatches { - public class PsyfocusGainPerTick : FirstPriorityFishPatch + public sealed class PsyfocusGainPerTick : FirstPriorityFishPatch { public override string? Description { get; } = "Caches psyfocus gain per tick while the target remains " + "constant. Impactful in psycasting focused playthroughs"; diff --git a/Source/PerformanceFish/MiscOptimizations.cs b/Source/PerformanceFish/MiscOptimizations.cs index 75a4d2d..a817122 100644 --- a/Source/PerformanceFish/MiscOptimizations.cs +++ b/Source/PerformanceFish/MiscOptimizations.cs @@ -12,9 +12,9 @@ using static System.Reflection.Emit.OpCodes; namespace PerformanceFish; -public class MiscPrepatchedOptimizations : ClassWithFishPrepatches +public sealed class MiscPrepatchedOptimizations : ClassWithFishPrepatches { - public class GenList_ListFullCopy : FishPrepatch + public sealed class GenList_ListFullCopy : FishPrepatch { public override string Description { get; } = "Optimization for a basic and frequently used list copying method. Replaces a for loop with an " @@ -32,7 +32,7 @@ public class MiscPrepatchedOptimizations : ClassWithFishPrepatches public static List ListFullCopy(List source) => source.Copy(); } - public class GenCollection_FirstOrDefault : FishPrepatch + public sealed class GenCollection_FirstOrDefault : FishPrepatch { public override string? Description { get; } = "Minor optimization for a RimWorld method used for list lookups, by looping in a more efficient manner " @@ -46,11 +46,28 @@ public class MiscPrepatchedOptimizations : ClassWithFishPrepatches [MethodImpl(MethodImplOptions.AggressiveInlining)] public static T? FirstOrDefault(List list, Predicate predicate) => list.FirstOrDefaultFast(predicate); } + + public sealed class GenGrid_InBoundsPatch : FishPrepatch + { + public override string? Description { get; } = "Tiny optimization by fixing an incorrect cast"; + + public override MethodBase TargetMethodBase => methodof((Func)GenGrid.InBounds); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool ReplacementBody(IntVec3 c, Map map) + { + var size = map.Size; + return (uint)c.x < (uint)size.x && (uint)c.z < (uint)size.z; + } + } } -public class MiscOptimizations : ClassWithFishPatches +public sealed class MiscOptimizations : ClassWithFishPatches { - public class WindManager_WindManagerTick : FishPatch + public sealed class WindManager_WindManagerTick : FishPatch { public override string Description { get; } = "Throttles plant sway to update at most once per frame instead of every tick. Also fixes the plant sway " @@ -69,11 +86,10 @@ public class MiscOptimizations : ClassWithFishPatches && codes[i - 3] == find_CurrentMap && codes[i - 1] == this_map && codes[i].operand is Label, // goto return; - static code - => new[] - { - code, FishTranspiler.Call(ShouldSway), FishTranspiler.IfFalse_Short((Label)code.operand) - }); + static code => + [ + code, FishTranspiler.Call(ShouldSway), FishTranspiler.IfFalse_Short((Label)code.operand) + ]); } public static bool ShouldSway() @@ -95,7 +111,7 @@ public class MiscOptimizations : ClassWithFishPatches private static bool _lastPrefValue; } - public class CompRottable : FishPatch + public sealed class CompRottable : FishPatch { public override string? Description { get; } = "Throttles rotting on misconfigured defs to only recalculate every 256 ticks, instead of constantly."; @@ -114,7 +130,7 @@ public class MiscOptimizations : ClassWithFishPatches } } - public class RitualObligationTrigger_Date : FirstPriorityFishPatch + public sealed class RitualObligationTrigger_Date : FirstPriorityFishPatch { public override string? Description { get; } = "Literally just reorders instructions in this method. They were nonsensical, discarding 90% of the " @@ -141,7 +157,7 @@ public class MiscOptimizations : ClassWithFishPatches } } - public class ReportProbablyMissingAttributesFix : FishPatch + public sealed class ReportProbablyMissingAttributesFix : FishPatch { public override string? Description { get; } = """Fixes the "probably needs a StaticConstructorOnStartup attribute" log warning to display full """ @@ -159,7 +175,7 @@ public class MiscOptimizations : ClassWithFishPatches methodof(Reflection.FullDescription)); } - public class DrawBatch_Flush : FishPatch + public sealed class DrawBatch_Flush : FishPatch { public override string Description { get; } = "Optimization of a fleck rendering method. Low - medium performance impact"; @@ -168,7 +184,7 @@ public class MiscOptimizations : ClassWithFishPatches public static CodeInstructions? Transpiler(CodeInstructions codeInstructions, ILGenerator generator) { - var codes = codeInstructions.ToList(); + var codes = codeInstructions.AsOrToList(); var instance_tmpPropertyBlocks = FishTranspiler.Field(typeof(DrawBatch), nameof(DrawBatch.tmpPropertyBlocks)); diff --git a/Source/PerformanceFish/ModCompatibility/ActiveMods.cs b/Source/PerformanceFish/ModCompatibility/ActiveMods.cs index f49b6d5..f67e6c0 100644 --- a/Source/PerformanceFish/ModCompatibility/ActiveMods.cs +++ b/Source/PerformanceFish/ModCompatibility/ActiveMods.cs @@ -12,14 +12,38 @@ public static class ActiveMods // GradientHair = Contains(PackageIDs.GRADIENT_HAIR), GraphicsSetter = Contains(PackageIDs.GRAPHICS_SETTINGS), Harmony = Contains(PackageIDs.HARMONY), + HumanResources = Contains(PackageIDs.HUMAN_RESOURCES), Multiplayer = Contains(PackageIDs.MULTIPLAYER), PerformanceOptimizer = Contains(PackageIDs.PERFORMANCE_OPTIMIZER), Prepatcher = Contains(PackageIDs.PREPATCHER), + UseBestMaterials = Contains(PackageIDs.USE_BEST_MATERIALS), VanillaExpandedFramework = Contains(PackageIDs.VANILLA_EXPANDED_FRAMEWORK); // ModsConfig.IsActive does not ignore _steam postfixes, causing it to fail when local copies were made public static bool Contains(string packageID) => TryGetModMetaData(packageID) != null; - + + public static bool ContainsAnyOf(T packageIDs) where T : IEnumerable + { + foreach (var id in packageIDs) + { + if (Contains(id)) + return true; + } + + return false; + } + + public static bool ContainsAllOf(T packageIDs) where T : IEnumerable + { + foreach (var id in packageIDs) + { + if (!Contains(id)) + return false; + } + + return true; + } + public static ModMetaData? TryGetModMetaData(string packageID) => ModLister.GetActiveModWithIdentifier(packageID, true); @@ -55,7 +79,7 @@ public static class ActiveMods ThrowForMissingModDependency(nameof(Fishery)); if (!Harmony) - ThrowForMissingModDependency(nameof(Harmony)); + WarnForMissingModDependency(nameof(Harmony)); VerifyLoadOrder(nameof(Fishery), PackageIDs.FISHERY, PackageIDs.PERFORMANCE_FISH, PackageIDs.BETTER_LOG); VerifyLoadOrder(nameof(Harmony), PackageIDs.HARMONY, PackageIDs.PERFORMANCE_FISH); @@ -70,14 +94,14 @@ public static class ActiveMods if (activeModsInLoadOrder.FindIndex(mod => mod.PackageId == dependencyID) > activeModsInLoadOrder.FindIndex(mod => dependingModIDs.Contains(mod.PackageId))) { - ThrowForIncorrectLoadOrder(dependencyName); + ErrorForIncorrectLoadOrder(dependencyName); } } private static void CheckFisheryVersion() { if (FisheryLib.FisheryLib.VERSION > FisheryLib.FisheryLib.CurrentlyLoadedVersion) - ThrowForOutdatedModDependency(nameof(Fishery)); + ErrorForOutdatedModDependency(nameof(Fishery)); } private static void CheckHarmonyVersion() @@ -86,23 +110,27 @@ public static class ActiveMods private static void CheckDependencyVersion(string dependencyName, Type dependencyType, string dependencyAssemblyName) { - if (typeof(PerformanceFishMod).Assembly.GetReferencedAssemblies().First(assembly - => assembly.FullName.StartsWith($"{dependencyAssemblyName}, Version", StringComparison.Ordinal)).Version - > dependencyType.Assembly.GetName().Version) + if (typeof(PerformanceFishMod).Assembly.GetReferencedAssemblyVersion(dependencyAssemblyName) + > dependencyType.Assembly.GetLoadedVersion()) { - ThrowForOutdatedModDependency(dependencyName); + ErrorForOutdatedModDependency(dependencyName); } } - private static void ThrowForIncorrectLoadOrder(string dependencyName) - => ThrowHelper.ThrowOperationCanceledException($"Incorrect load order detected. { - dependencyName} must be loaded before any mod depending on it."); + private static void ErrorForIncorrectLoadOrder(string dependencyName) + => Log.Error($"Incorrect load order detected. {dependencyName} must be loaded before any mod depending on it."); - private static void ThrowForOutdatedModDependency(string modName) - => ThrowHelper.ThrowOperationCanceledException($"Outdated {modName} mod detected. { + private static void ErrorForOutdatedModDependency(string modName) + => Log.Error($"Outdated {modName} mod detected. { modName} must be updated for Performance Fish to work correctly"); private static void ThrowForMissingModDependency(string modName) - => ThrowHelper.ThrowOperationCanceledException( - $"{modName} mod is missing. Performance Fish requires this mod in order to function."); + { + Log.Error($"{modName} mod is missing. Performance Fish requires this mod in order to function."); + ThrowHelper.ThrowOperationCanceledException(); + } + + private static void WarnForMissingModDependency(string modName) + => Log.Warning( + $"{modName} mod is missing. Performance Fish may not work correctly without this dependency."); } \ No newline at end of file diff --git a/Source/PerformanceFish/ModCompatibility/PackageIDs.cs b/Source/PerformanceFish/ModCompatibility/PackageIDs.cs index ba653a8..df087af 100644 --- a/Source/PerformanceFish/ModCompatibility/PackageIDs.cs +++ b/Source/PerformanceFish/ModCompatibility/PackageIDs.cs @@ -13,9 +13,11 @@ public static class PackageIDs // GRADIENT_HAIR = "automatic.gradienthair", GRAPHICS_SETTINGS = "Telefonmast.GraphicsSettings", HARMONY = "brrainz.harmony", + HUMAN_RESOURCES = "JPT.HumanResources", MULTIPLAYER = "rwmt.Multiplayer", PERFORMANCE_FISH = "bs.performance", PERFORMANCE_OPTIMIZER = "Taranchuk.PerformanceOptimizer", PREPATCHER = "zetrith.prepatcher", + USE_BEST_MATERIALS = "kathanon.UseBestMaterials", VANILLA_EXPANDED_FRAMEWORK = "OskarPotocki.VanillaFactionsExpanded.Core"; } \ No newline at end of file diff --git a/Source/PerformanceFish/ModCompatibility/PerformanceOptimizer.cs b/Source/PerformanceFish/ModCompatibility/PerformanceOptimizer.cs index 02e1a90..49cfed3 100644 --- a/Source/PerformanceFish/ModCompatibility/PerformanceOptimizer.cs +++ b/Source/PerformanceFish/ModCompatibility/PerformanceOptimizer.cs @@ -20,10 +20,10 @@ public static class PerformanceOptimizer public static string[] BlockedPatchNames { get; } = - { + [ "PerformanceOptimizer.Optimization_FasterGetCompReplacement", "PerformanceOptimizer.Optimization_IdeoUtility_GetStyleDominance" - }; + ]; static PerformanceOptimizer() { diff --git a/Source/PerformanceFish/ModCompatibility/Types.cs b/Source/PerformanceFish/ModCompatibility/Types.cs new file mode 100644 index 0000000..de48ff7 --- /dev/null +++ b/Source/PerformanceFish/ModCompatibility/Types.cs @@ -0,0 +1,32 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +namespace PerformanceFish.ModCompatibility; + +public static class Types +{ + public static class RealRuins + { + public static Type? POIWorldObject = Reflection.Type("RealRuins", "RealRuins.RealRuinsPOIWorldObject"); + } + + public static class VFEAncients + { + public static Type? RecipeExtensionMend = Reflection.Type("VFEAncients", "VFEAncients.RecipeExtension_Mend"); + } + + public static class PerformanceAnalyzer + { + public static Type? + ModBase = Reflection.Type("PerformanceAnalyzer", "Analyzer.Modbase"), + ProfilingEntry = Reflection.Type("PerformanceAnalyzer", "Analyzer.Profiling.Entry"), + Window_Analyzer = Reflection.Type("PerformanceAnalyzer", "Analyzer.Window_Analyzer"); + } + + public static class LWM + { + public static Type? CompProperties = Reflection.Type("LWM.DeepStorage.Properties"); + } +} \ No newline at end of file diff --git a/Source/PerformanceFish/ModCompatibility/VanillaExpandedFixes.cs b/Source/PerformanceFish/ModCompatibility/VanillaExpandedFixes.cs index 1b5f225..bec7210 100644 --- a/Source/PerformanceFish/ModCompatibility/VanillaExpandedFixes.cs +++ b/Source/PerformanceFish/ModCompatibility/VanillaExpandedFixes.cs @@ -3,18 +3,20 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. +#if fixed // with commit from Jul 3, 2023 + namespace PerformanceFish.ModCompatibility; -public class VanillaExpandedFixes : ClassWithFishPatches +public sealed class VanillaExpandedFixes : ClassWithFishPatches { - public class ExpandableGraphicData : FishPatch + public sealed class ExpandableGraphicData : FishPatch { public override string? Description { get; } = "Fixes the LoadAllFiles method in Vanilla Expanded Framework's ExpandableGraphicData to not scan through " + "all texture folders of all mods for every graphic and instead just use cached files the game already " + "loaded. Improves load times and prevents dds related errors."; - public override bool Enabled => ActiveMods.VanillaExpandedFramework; + public override bool Enabled => ActiveMods.VanillaExpandedFramework && base.Enabled; public override MethodBase TargetMethodInfo { get; } = AccessTools.Method("VFECore.ExpandableGraphicData:LoadAllFiles"); @@ -27,20 +29,20 @@ public class VanillaExpandedFixes : ClassWithFishPatches var paths = new List(); var mods = LoadedModManager.RunningModsListForReading; var count = mods.Count; + + var prefix = !folderPath.NullOrEmpty() && folderPath![^1] == '/' + ? folderPath + : folderPath + '/'; for (var i = 0; i < count; i++) { - var contentListTrie = mods[i].GetContentHolder().contentListTrie; - - var prefix = !folderPath.NullOrEmpty() && folderPath![^1] == '/' - ? folderPath - : folderPath + '/'; - - foreach (var path in contentListTrie.GetByPrefix(prefix)) + foreach (var path in mods[i].GetContentHolder().contentListTrie.GetByPrefix(prefix)) paths.Add(path); } return paths; } } -} \ No newline at end of file +} + +#endif \ No newline at end of file diff --git a/Source/PerformanceFish/ModListerPatches.cs b/Source/PerformanceFish/ModListerPatches.cs new file mode 100644 index 0000000..1ec73f7 --- /dev/null +++ b/Source/PerformanceFish/ModListerPatches.cs @@ -0,0 +1,63 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using Mono.Cecil; +using Mono.Cecil.Cil; +using PerformanceFish.Prepatching; + +namespace PerformanceFish; + +public sealed class ModListerPatches : ClassWithFishPrepatches +{ + public sealed class AnyFromListActivePatch : FishPrepatch + { + public override string? Description { get; } + = "Fixes a LoadFolders bug causing it to normally not recognize steam versions of mods if another local " + + "copy exists."; + + public override MethodBase TargetMethodBase { get; } = methodof(ModLister.AnyFromListActive); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => GetActiveModWithIdentifierFix(ilProcessor, module); + } + + public sealed class ModIncompatibilityIsSatisfiedPatch : FishPrepatch + { + public override string? Description { get; } + = "Fixes a mod manager bug causing it to normally not recognize steam versions of mods for incompatibility " + + "checks if another local copy exists."; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredPropertyGetter(typeof(ModIncompatibility), nameof(ModIncompatibility.IsSatisfied)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => GetActiveModWithIdentifierFix(ilProcessor, module); + } + + private static void GetActiveModWithIdentifierFix(ILProcessor ilProcessor, ModuleDefinition module) + { + var instructions = ilProcessor.instructions; + var success = false; + + for (var i = 0; i + 1 < instructions.Count; i++) + { + if (instructions[i].OpCode == OpCodes.Ldc_I4_0 + && instructions[i + 1].Operand is MethodReference + { + Name: nameof(ModLister.GetActiveModWithIdentifier) + }) + { + instructions[i].OpCode = OpCodes.Ldc_I4_1; + success = true; + } + } + + if (!success) + { + Log.Error($"Performance Fish failed to apply its patch on '{ + ilProcessor.GetMethod().FullName}'. This should be harmless as it's meant to be just a bugfix."); + } + } +} \ No newline at end of file diff --git a/Source/PerformanceFish/ModsConfigPatches.cs b/Source/PerformanceFish/ModsConfigPatches.cs new file mode 100644 index 0000000..b6c3ad8 --- /dev/null +++ b/Source/PerformanceFish/ModsConfigPatches.cs @@ -0,0 +1,62 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using Mono.Cecil; +using Mono.Cecil.Cil; +using PerformanceFish.Prepatching; + +namespace PerformanceFish; + +public sealed class ModsConfigPatches : ClassWithFishPrepatches +{ + public sealed class AreAllActivePatch : FishPrepatch + { + public override string? Description { get; } + = "Fixes a MayRequire bug causing it to normally not recognize steam versions of mods if another local " + + "copy exists."; + + public override MethodBase TargetMethodBase { get; } = methodof(ModsConfig.AreAllActive); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => IsActiveFix(ilProcessor, module); + } + + public sealed class IsAnyActiveOrEmptyPatch : FishPrepatch + { + public override string? Description { get; } + = "Fixes a MayRequireAnyOf bug causing it to normally not recognize steam versions of mods if another " + + "local copy exists, as well as its inability to strip whitespace."; + + public override MethodBase TargetMethodBase { get; } = methodof(ModsConfig.IsAnyActiveOrEmpty); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => IsActiveFix(ilProcessor, module); + + public static void Prefix(out bool trimNames) => trimNames = true; + } + + private static void IsActiveFix(ILProcessor ilProcessor, ModuleDefinition module) + { + var instructions = ilProcessor.instructions; + var success = false; + + for (var i = 0; i + 1 < instructions.Count; i++) + { + if (instructions[i].Operand is MethodReference { Name: nameof(ModsConfig.IsActive) }) + { + instructions[i].Operand = module.ImportReference(IsActiveReplacement); + success = true; + } + } + + if (!success) + { + Log.Error($"Performance Fish failed to apply its patch on '{ + ilProcessor.GetMethod().FullName}'. This should be harmless as it's meant to be just a bugfix."); + } + } + + public static bool IsActiveReplacement(string id) => ModLister.GetActiveModWithIdentifier(id, true) != null; +} \ No newline at end of file diff --git a/Source/PerformanceFish/OnAssembliesLoaded.cs b/Source/PerformanceFish/OnAssembliesLoaded.cs index 6772263..ad0c1c0 100644 --- a/Source/PerformanceFish/OnAssembliesLoaded.cs +++ b/Source/PerformanceFish/OnAssembliesLoaded.cs @@ -32,6 +32,8 @@ public static class OnAssembliesLoaded TryInitialize(AnalyzerFixes.Patch, true); _ = FishSettings.Instance; + + PerformanceFishMod.AllPrepatchClasses.BeforeHarmonyPatching(); Parallel.ForEach(PerformanceFishMod.AllPatchClasses, static patchClass => { @@ -46,6 +48,10 @@ public static class OnAssembliesLoaded patchClass.GetType().Name}:\n{ex}"); } }); + + PerformanceFishMod.AllPrepatchClasses.OnPatchingCompleted(); + + Cache.Utility.Initialize(); } private static void TryPatchGraphicsSetter() diff --git a/Source/PerformanceFish/ParallelNoAlloc.cs b/Source/PerformanceFish/ParallelNoAlloc.cs new file mode 100644 index 0000000..96dc308 --- /dev/null +++ b/Source/PerformanceFish/ParallelNoAlloc.cs @@ -0,0 +1,308 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using System.Diagnostics.CodeAnalysis; +using FisheryLib.Pools; +using JetBrains.Annotations; +using Mono.Cecil; + +namespace PerformanceFish; + +public static class ParallelNoAlloc +{ + private static FishTable> _groupWorkers = new(); + + public static void Invoke(Action action) => FishPool.Get().Invoke(action); + + public static void Invoke(Action[] actions) + { + for (var i = 0; i < actions.Length; i++) + Invoke(actions[i]); + } + + public static void Invoke(Span actions) + { + for (var i = 0; i < actions.Length; i++) + Invoke(actions[i]); + } + + public static object RegisterBackgroundWaitingWorkers(Action[] actions) + { + Guard.IsGreaterThanOrEqualTo(actions.Length, 0); + + var monitorObject = new MonitorObject.Group(new Worker[actions.Length]); + var workerGroup = new FishSet(); + + for (var i = 0; i < actions.Length; i++) + workerGroup.Add(monitorObject.Subscribers[i] = new Worker.Continuous(monitorObject, actions[i])); + + lock (_groupWorkers) + _groupWorkers.Add(monitorObject, workerGroup); + + return monitorObject; + } + + public static void RegisterBackgroundWaitingWorkers(object monitorObject, Action[] actions) + { + Guard.IsGreaterThanOrEqualTo(actions.Length, 0); + + if (monitorObject is not MonitorObject.Group typedMonitorObject) + { + ThrowHelper.ThrowArgumentException(); + return; + } + + lock (_groupWorkers) + { + var workerGroup = _groupWorkers.GetOrAdd(typedMonitorObject); + + for (var i = 0; i < actions.Length; i++) + { + var worker = new Worker.Continuous(typedMonitorObject, actions[i]); + typedMonitorObject.Subscribe(worker); + workerGroup.Add(worker); + } + } + } + + public static void RegisterBackgroundWaitingWorker(object monitorObject, Action action) + { + Guard.IsNotNull(action); + + if (monitorObject is not MonitorObject.Group typedMonitorObject) + { + ThrowHelper.ThrowArgumentException(); + return; + } + + var worker = new Worker.Continuous(typedMonitorObject, action); + + lock (_groupWorkers) + { + typedMonitorObject.Subscribe(worker); + _groupWorkers.GetOrAdd(typedMonitorObject).Add(worker); + } + } + + public static object RegisterBackgroundWaitingWorker(Action action) + { + Guard.IsNotNull(action); + + var monitorObject = new MonitorObject.Group(Array.Empty()); + var worker = new Worker.Continuous(monitorObject, action); + monitorObject.Subscribe(worker); + + lock (_groupWorkers) + _groupWorkers.GetOrAdd(monitorObject).Add(worker); + + return monitorObject; + } + + public static void DeregisterBackgroundWaitingWorker(object monitorObject, Action action) + { + Guard.IsNotNull(action); + + if (monitorObject is not MonitorObject.Group typedMonitorObject) + { + ThrowHelper.ThrowArgumentException(); + return; + } + + lock (_groupWorkers) + { + var workerSet = _groupWorkers[typedMonitorObject]!; + + foreach (var worker in workerSet) + { + if (worker.Action != action) + continue; + + workerSet.Remove(worker); + typedMonitorObject.Unsubscribe(worker); + return; + } + } + + ThrowHelper.ThrowInvalidOperationException($"No worker found to deregister from for object { + monitorObject} and action {action.Method.FullDescription()}"); + } + + public static void PulseRegisteredBackgroundWorkers(object monitorObject) + { + if (monitorObject is not MonitorObject.Group typedMonitorObject) + { + ThrowHelper.ThrowArgumentException(); + return; + } + + typedMonitorObject.Pulse(); + } + + private abstract class Worker : IFishPoolable + { + public Thread Thread { get; private set; } + + public MonitorObject MonitorObject { get; private set; } + + public bool Pulsed + { + get => _pulsed; + set => _pulsed = value; + } + + public Action? Action { get; private set; } + private bool _cancelled; + private volatile bool _pulsed; + + protected Worker() => Initialize(new MonitorObject.Single(this)); + + protected Worker(MonitorObject monitorObject) => Initialize(monitorObject); + + [MemberNotNull(nameof(Thread)), MemberNotNull(nameof(MonitorObject))] + private void Initialize(MonitorObject monitorObject) + { + Guard.IsNotNull(monitorObject); + MonitorObject = monitorObject; + Thread = new(Callback, 131072); + Thread.Start(); + } + + protected Worker(MonitorObject monitorObject, Action action) : this(monitorObject) + => Action = action; + + public void Cancel() => _cancelled = true; + + private void Callback() + { + while (true) + { + lock (MonitorObject) + { + while (!Pulsed) + Monitor.Wait(MonitorObject); + } + + InvokeAction(); + Pulsed = false; + + Thread.MemoryBarrier(); + if (_cancelled) + return; + + Return(); + } + } + + void IFishPoolable.Reset() + { + + } + + protected abstract void InvokeAction(); + + protected abstract void Return(); + + [UsedImplicitly] + public sealed class Single : Worker + { + protected override void InvokeAction() + { + Action?.Invoke(); + Action = null; + } + + protected override void Return() => FishPool.Return(this); + + public void Invoke(Action action) + { + Guard.IsNotAssignableToType(MonitorObject); + + if (Pulsed) + Spin(); + + Action = action; + + MonitorObject.Pulse(); + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private void Spin() + { + var spinWait = new SpinWait(); + + while (Pulsed) + { + Thread.MemoryBarrier(); + spinWait.SpinOnce(); + } + } + } + + public sealed class Continuous : Worker + { + public Continuous(MonitorObject monitorObject, Action action) : base(monitorObject, action) + => Guard.IsNotNull(action); + + protected override void InvokeAction() => Action!.Invoke(); + + protected override void Return() + { + } + } + } + + private abstract class MonitorObject + { + public abstract void Pulse(); + + public sealed class Single(Worker worker) : MonitorObject + { + public Worker Worker { get; } = worker; + + public override void Pulse() + { + lock (this) + { + Worker.Pulsed = true; + Thread.MemoryBarrier(); + Monitor.Pulse(this); + } + } + } + + public sealed class Group(Worker[] subscribers) : MonitorObject + { + public Worker[] Subscribers => subscribers; + + public override void Pulse() + { + lock (this) + { + for (var i = subscribers.Length; i-- > 0;) + subscribers[i].Pulsed = true; + + Thread.MemoryBarrier(); + Monitor.PulseAll(this); + } + } + + public void Subscribe(Worker worker) => subscribers = subscribers.Add(worker); + + public void Unsubscribe(Worker worker) + { + Guard.IsGreaterThan(Subscribers.Length, 0); + + var index = Array.IndexOf(Subscribers, worker); + Guard.IsGreaterThanOrEqualTo(index, 0); + + var subscribersLength = subscribers.Length; + if (index != subscribersLength - 1) + Array.Copy(subscribers, index + 1, subscribers, index, subscribersLength - index - 1); + + Array.Resize(ref subscribers, subscribersLength - 1); + } + } + } +} \ No newline at end of file diff --git a/Source/PerformanceFish/Patching/ClassWithFishPatches.cs b/Source/PerformanceFish/Patching/ClassWithFishPatches.cs index 83f4908..f212ef4 100644 --- a/Source/PerformanceFish/Patching/ClassWithFishPatches.cs +++ b/Source/PerformanceFish/Patching/ClassWithFishPatches.cs @@ -15,5 +15,19 @@ public abstract class ClassWithFishPatches : SingletonFactory false; + public virtual bool ShowSettings + { + get + { + foreach (var patch in Patches) + { + if (patch.ShowSettings) + return true; + } + + return false; + } + } + protected ClassWithFishPatches() => Patches = new(GetType()); } \ No newline at end of file diff --git a/Source/PerformanceFish/Patching/FishPatch.cs b/Source/PerformanceFish/Patching/FishPatch.cs index 540f6da..765d121 100644 --- a/Source/PerformanceFish/Patching/FishPatch.cs +++ b/Source/PerformanceFish/Patching/FishPatch.cs @@ -8,6 +8,8 @@ using System.Diagnostics; using System.Linq; using nuget::JetBrains.Annotations; using PerformanceFish.Cache; +using PerformanceFish.ModCompatibility; +using PerformanceFish.Prepatching; namespace PerformanceFish.Patching; @@ -15,11 +17,36 @@ namespace PerformanceFish.Patching; [UsedImplicitly(ImplicitUseTargetFlags.WithInheritors | ImplicitUseTargetFlags.WithMembers)] public abstract class FishPatch : SingletonFactory, IExposable, IHasDescription { + private bool _enabled; + + private string? _descriptionWithNotes; + + private FishPrepatchBase[]? _resolvedLinkedPrepatches; + + private FishPatch[]? _resolvedLinkedHarmonyPatches; + + public virtual List IncompatibleModIDs { get; } = []; + + public virtual List LinkedPatches { get; } = []; + + private FishPrepatchBase[] ResolvedLinkedPrepatches + => _resolvedLinkedPrepatches ??= LinkedPatches + .Where(static type => type.IsAssignableTo(typeof(FishPrepatchBase))) + .Select(static type => FishPrepatchBase.Get(type)) + .ToArray(); + + private FishPatch[] ResolvedLinkedHarmonyPatches + => _resolvedLinkedHarmonyPatches ??= LinkedPatches + .Where(static type => type.IsAssignableTo(typeof(FishPatch))).Select(static type => Get(type)) + .ToArray(); + + public bool DisabledForModCompatibility => ActiveMods.ContainsAnyOf(IncompatibleModIDs); + public virtual bool ShouldBenchmark => false; public virtual bool Enabled { - get => _enabled; + get => _enabled && !DisabledForModCompatibility; set { if (value == _enabled) @@ -37,30 +64,45 @@ public abstract class FishPatch : SingletonFactory, IExposable, IHasD TryUnpatch(); ShouldBePatched = shouldBePatched; } + + for (var i = 0; i < ResolvedLinkedPrepatches.Length; i++) + ResolvedLinkedPrepatches[i].Enabled = value; + + for (var i = 0; i < ResolvedLinkedHarmonyPatches.Length; i++) + ResolvedLinkedHarmonyPatches[i].Enabled = value; } } - private bool _enabled; - public virtual bool DefaultState { [Pure] get => true; } + public virtual bool ShowSettings => true; + public virtual int PrefixMethodPriority => TryGetPriority(PrefixMethodInfo); public virtual int PostfixMethodPriority => TryGetPriority(PostfixMethodInfo); public virtual int TranspilerMethodPriority => TryGetPriority(TranspilerMethodInfo); public virtual int FinalizerMethodPriority => TryGetPriority(FinalizerMethodInfo); public MethodInfo? HarmonyMethodInfo => HarmonyMethodInfos.FirstOrDefault(); - public List HarmonyMethodInfos { get; } = new(); + public List HarmonyMethodInfos { get; } = []; public MethodInfo? BenchmarkHarmonyMethodInfo => BenchmarkHarmonyMethodInfos.FirstOrDefault(); - public List BenchmarkHarmonyMethodInfos { get; } = new(); + public List BenchmarkHarmonyMethodInfos { get; } = []; private bool Patched { get; set; } private bool ShouldBePatched { get; set; } public virtual string? Name => null; + public virtual string? Description => null; + public string? DescriptionWithNotes + => _descriptionWithNotes ??= !DisabledForModCompatibility + ? Description + : Description + + $"{(Description?.EndsWith(".") ?? true ? "" : ".")} Disabled for compatibility with { + IncompatibleModIDs.Select(static id => ActiveMods.TryGetModMetaData(id)?.Name) + .Where(static id => id != null).ToCommaList(true)}"; + public virtual Delegate? TargetMethodGroup => null; public virtual IEnumerable? TargetMethodGroups => null; public virtual Expression? TargetMethod => null; @@ -76,8 +118,8 @@ public abstract class FishPatch : SingletonFactory, IExposable, IHasD ??= (TargetMethods?.Select(SymbolExtensions.GetMethodInfo) ?? TargetMethodGroups?.Select(static m => m.Method))?.Cast().ToArray() ?? (TargetMethodInfo != null! - ? new[] { TargetMethodInfo } - : Array.Empty()); + ? [TargetMethodInfo] + : Array.Empty()); private MethodBase[]? _targetMethodInfos; @@ -102,7 +144,9 @@ public abstract class FishPatch : SingletonFactory, IExposable, IHasD public virtual MethodInfo? FinalizerMethodInfo => TryGetMethod("FINALIZER", static m => m.HasAttribute()); - internal Type ParentType => GetType().DeclaringType; + internal Type ParentType + => GetType().DeclaringType + ?? ThrowHelper.ThrowArgumentNullException($"{this} is missing parent class. This is not supported"); internal IHasFishPatch? ParentClass => PerformanceFishMod.AllPatchClasses?.FirstOrDefault(patchClass => patchClass.GetType() == ParentType); @@ -249,10 +293,14 @@ public abstract class FishPatch : SingletonFactory, IExposable, IHasD private static int TryGetPriority(MethodInfo? info) => info?.TryGetAttribute()?.info.priority ?? Priority.Normal; + + protected internal virtual void OnPatchingCompleted() + { + } public virtual void ExposeData() => Scribe_Values.Look(ref _enabled, "enabled", DefaultState); - public override string ToString() => GetType().FullName; + public override string ToString() => GetType().FullName ?? GetType().Name; } internal static class Benchmarking @@ -317,7 +365,7 @@ internal static class Benchmarking } } - public class Results + public sealed class Results { public int Count; public Stopwatch? Stopwatch; diff --git a/Source/PerformanceFish/Patching/FishPatchExtensions.cs b/Source/PerformanceFish/Patching/FishPatchExtensions.cs deleted file mode 100644 index b8c00ef..0000000 --- a/Source/PerformanceFish/Patching/FishPatchExtensions.cs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) 2023 bradson -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at https://mozilla.org/MPL/2.0/. - -namespace PerformanceFish.Patching; - -public static class FishPatchExtensions -{ - public static void PatchAll(this IEnumerable patches) - { - foreach (var patch in patches) - patch.TryPatch(); - } - - public static void UnpatchAll(this IEnumerable patches) - { - foreach (var patch in patches) - patch.TryUnpatch(); - } -} \ No newline at end of file diff --git a/Source/PerformanceFish/Patching/FishPatchHolder.cs b/Source/PerformanceFish/Patching/FishPatchHolder.cs index 9ea9029..77c9e2b 100644 --- a/Source/PerformanceFish/Patching/FishPatchHolder.cs +++ b/Source/PerformanceFish/Patching/FishPatchHolder.cs @@ -13,12 +13,33 @@ namespace PerformanceFish.Patching; [UsedImplicitly(ImplicitUseTargetFlags.WithInheritors)] public class FishPatchHolder : IExposable, IEnumerable { + private volatile int _completedPatchingOnce; + public ConcurrentDictionary All { get; } = new(); public T Get() where T : FishPatch => (T)All[typeof(T)]; public void Add(FishPatch patch) => All[patch.GetType()] = patch; - public void PatchAll() => All.Values.PatchAll(); - public void UnpatchAll() => All.Values.UnpatchAll(); + + public void PatchAll() + { + using var patches = new PooledArray(All.Values); + + for (var i = 0; i < patches.Length; i++) + patches[i].TryPatch(); + + if (Interlocked.Exchange(ref _completedPatchingOnce, 1) == 0) + { + for (var i = 0; i < patches.Length; i++) + patches[i].OnPatchingCompleted(); + } + } + + public void UnpatchAll() + { + foreach (var patch in All.Values) + patch.TryUnpatch(); + } + public FishPatch this[Type type] => All[type]; public FishPatchHolder(Type type) @@ -62,8 +83,8 @@ public class FishPatchHolder : IExposable, IEnumerable patchClass.Patches[type].Enabled = false; patchClass.Patches.All.TryRemove(type, out _); - Log.Warning($"Performance Fish removed a duplicate patch from {patchClass.GetType().FullName - }. This is likely caused by no longer valid mod configs"); + Log.Warning($"Performance Fish removed a duplicate patch from { + patchClass.GetType().FullName}. This is likely caused by no longer valid mod configs"); } } diff --git a/Source/PerformanceFish/Patching/IHasFishPatch.cs b/Source/PerformanceFish/Patching/IHasFishPatch.cs index 92f617b..e5e2f21 100644 --- a/Source/PerformanceFish/Patching/IHasFishPatch.cs +++ b/Source/PerformanceFish/Patching/IHasFishPatch.cs @@ -13,4 +13,5 @@ public interface IHasFishPatch { public FishPatchHolder Patches { get; } public bool RequiresLoadedGameForPatching { get; } + public bool ShowSettings { get; } } \ No newline at end of file diff --git a/Source/PerformanceFish/PerformanceFish.csproj b/Source/PerformanceFish/PerformanceFish.csproj index cdd2203..52be3fb 100644 --- a/Source/PerformanceFish/PerformanceFish.csproj +++ b/Source/PerformanceFish/PerformanceFish.csproj @@ -16,9 +16,12 @@ 5 enable True - v1.4;v1.3 - 0.3.800.85 - 1701;1702;IL2121;CS8500;CS9082 + v1.4 + 0.3.999.7 + + 1701;1702;IL2121;CS8500;CS9082;CA1000;CA1002;CA1003;CA1707;CA1010;CA1715;CA1716;CA1724;CA1031;CA1033; + CA1034;CA1043;CA1051;CA1305;CA1310;CA1710;CA1711;CA1810;CA1812;CA1819;CA1851;CA2002;CA5394;CA1725;CA1062 + @@ -29,10 +32,11 @@ ..\..\..\Fishery\1.4\Assemblies\1Fishery.dll + False - + - + - + diff --git a/Source/PerformanceFish/PerformanceFish.sln b/Source/PerformanceFish/PerformanceFish.sln index d3a2dbe..9ca49fa 100644 --- a/Source/PerformanceFish/PerformanceFish.sln +++ b/Source/PerformanceFish/PerformanceFish.sln @@ -8,6 +8,8 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{6948F7E6-7ED7-4716-87EF-CFF1F465F561}" ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig + ..\..\1.4\Defs\GasDefs.xml = ..\..\1.4\Defs\GasDefs.xml + ..\..\1.4\Defs\MainButtonDefs.xml = ..\..\1.4\Defs\MainButtonDefs.xml EndProjectSection EndProject Global diff --git a/Source/PerformanceFish/PerformanceFishMod.cs b/Source/PerformanceFish/PerformanceFishMod.cs index f61b181..894a663 100644 --- a/Source/PerformanceFish/PerformanceFishMod.cs +++ b/Source/PerformanceFish/PerformanceFishMod.cs @@ -41,27 +41,55 @@ using PerformanceFish.Prepatching; namespace PerformanceFish; [PublicAPI] -public class PerformanceFishMod : Mod +public sealed class PerformanceFishMod : Mod { - public const string NAME = "Performance Fish"; - public const string PACKAGE_ID = PackageIDs.PERFORMANCE_FISH; + public const string + NAME = "Performance Fish", + PACKAGE_ID = PackageIDs.PERFORMANCE_FISH; + + [Obsolete("I am not incrementing this version number")] public const decimal VERSION = 0.4M; + public static Version LoadedVersion => typeof(PerformanceFishMod).Assembly.GetLoadedVersion(); + public static FishSettings? Settings { get; internal set; } public static PerformanceFishMod? Mod { get; private set; } public static Harmony Harmony { get; private set; } = new(PACKAGE_ID); public static IHasFishPatch[]? AllPatchClasses { get; internal set; } public static ClassWithFishPrepatches[]? AllPrepatchClasses { get; internal set; } + private static FishPatch[]? _allFishPatches; + + private static FishPrepatchBase[]? _allFishPrepatches; + + public static IEnumerable AllHarmonyPatches + => _allFishPatches ??= AllPatchClasses?.SelectMany(static patchClass => patchClass.Patches.All.Values).ToArray() + ?? Array.Empty(); + + public static IEnumerable AllPrepatches + => _allFishPrepatches ??= AllPrepatchClasses?.SelectMany(static patchClass => patchClass.Patches.All.Values) + .ToArray() + ?? Array.Empty(); + public PerformanceFishMod(ModContentPack content) : base(content) { - ActiveMods.CheckRequirements(); + try + { + ActiveMods.CheckRequirements(); + } + catch (Exception e) + { + Log.Error(e.ToString()); + ApplyModInactiveLetterPatch(); + return; + } + InitializeMod(); } private void InitializeMod() { - DebugLog.Message($"Initializing {NAME} v{VERSION}"); + DebugLog.Message($"Initializing {NAME} v{typeof(PerformanceFishMod).Assembly.GetLoadedVersion()}"); // ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract if (Mod != null) @@ -79,14 +107,31 @@ public class PerformanceFishMod : Mod Log.Error("Prepatcher mod is missing. Performance Fish will not be working correctly in this state."); } - modSettings = Settings; - modSettings!.Mod = this; + if (ActiveMods.TryGetModContentPack(PackageIDs.PREPATCHER) is not { } prepatcherContent + || prepatcherContent.assemblies?.loadedAssemblies is not [_,..]) + { + Verse.Log.TryOpenLogWindow(); + Log.Error("Prepatcher assemblies are missing. This usually indicates an incomplete download or a " + + "copy of github sources instead of the actual mod."); + } if (!OnAssembliesLoaded.Loaded) { Verse.Log.TryOpenLogWindow(); Log.Error("Performance Fish failed to initialize entirely. There are either critical dependencies " + "missing or mods with hard incompatibilities present."); + ApplyModInactiveLetterPatch(); + } + + modSettings = Settings; + if (modSettings is null) + { + Verse.Log.TryOpenLogWindow(); + Log.Error("Performance Fish failed to initialize its mod settings."); + } + else + { + modSettings.Mod = this; } #if DEBUG @@ -94,6 +139,15 @@ public class PerformanceFishMod : Mod #endif } + private static void ApplyModInactiveLetterPatch() + => Harmony.Patch(AccessTools.DeclaredMethod(typeof(Game), nameof(Game.FinalizeInit)), + postfix: new(methodof(ThrowModInactiveLetter), Priority.Last)); + + public static void ThrowModInactiveLetter() + => Find.LetterStack.AddLetterSilently(LetterMaker.MakeLetter("Performance Fish inactive", + "Missing dependencies or hard incompatibilities caused Performance Fish to entirely fail to " + + "initialize. It will not be doing anything in this state.", LetterDefOf.Bossgroup)); + public static void LogPatchCount() { var allFishPatches = AllPatchClasses!.SelectMany(static patchClass => patchClass.Patches.All.Values).ToList(); @@ -135,7 +189,14 @@ public class PerformanceFishMod : Mod var types = Assembly.GetExecutingAssembly().GetTypes(); var list = new List(types.Length); - Parallel.ForEach(types, type => + if (typeof(T).IsAssignableTo(typeof(FishPatch))) + Parallel.ForEach(types, InitializePatchClass); + else + Array.ForEach(types, InitializePatchClass); + + return list.ToArray(); + + void InitializePatchClass(Type type) { if (!type.IsAssignableTo(typeof(T)) || type.IsInterface @@ -147,7 +208,7 @@ public class PerformanceFishMod : Mod try { var patchClass = SingletonFactory.Get(type); - + lock (((ICollection)list).SyncRoot) list.Add(patchClass); } @@ -155,9 +216,7 @@ public class PerformanceFishMod : Mod { Log.Error($"{NAME} encountered an exception while trying to initialize {type.Name}:\n{ex}"); } - }); - - return list.ToArray(); + } } public static T? Get() diff --git a/Source/PerformanceFish/Planet/MothballOptimization.cs b/Source/PerformanceFish/Planet/MothballOptimization.cs index 90939a2..f04fb23 100644 --- a/Source/PerformanceFish/Planet/MothballOptimization.cs +++ b/Source/PerformanceFish/Planet/MothballOptimization.cs @@ -11,14 +11,14 @@ using RimWorld.Planet; namespace PerformanceFish.Planet; -public class MothballOptimization : ClassWithFishPrepatches +public sealed class MothballOptimization : ClassWithFishPrepatches { public const string BASIC_DESCRIPTION = "Mothballing means to \"take something out of operation but maintain it so that it can be used in the " + "future.\" RimWorld has this system for world pawns along with a number of conditions which can block it " + "from taking effect."; - public class WorldPawnsDefPreventingMothball : FishPrepatch + public sealed class WorldPawnsDefPreventingMothball : FishPrepatch { public override string? Description { get; } = BASIC_DESCRIPTION + " This patch essentially serves as a whitelist to allow mothballing a lot more " diff --git a/Source/PerformanceFish/Planet/WorldObjectsOptimization.cs b/Source/PerformanceFish/Planet/WorldObjectsOptimization.cs index a0614e2..906f3d8 100644 --- a/Source/PerformanceFish/Planet/WorldObjectsOptimization.cs +++ b/Source/PerformanceFish/Planet/WorldObjectsOptimization.cs @@ -11,9 +11,9 @@ using RimWorld.Planet; namespace PerformanceFish.Planet; -public class WorldObjectsOptimization : ClassWithFishPrepatches +public sealed class WorldObjectsOptimization : ClassWithFishPrepatches { - public class WorldObjectsHolderTickPatch : FishPrepatch + public sealed class WorldObjectsHolderTickPatch : FishPrepatch { public override string? Description { get; } = "The world objects holder is responsible for ticking every world object. This includes settlements, " @@ -87,24 +87,46 @@ public class WorldObjectsOptimization : ClassWithFishPrepatches CachedWorldObjectsVersion = -2, CachedMapsVersion = -2; - private static Type[] - _whitelistedTickingCompTypes - = - { - typeof(WorldObjectComp), - typeof(FormCaravanComp), - typeof(TimedDetectionRaids), - typeof(EnterCooldownComp) - }, - _whitelistedWorldObjectTypes = { typeof(WorldObject), typeof(MapParent), typeof(Settlement) }; + private static Type?[] + _whitelistedTickingCompTypes = + [ + typeof(WorldObjectComp), + typeof(FormCaravanComp), + typeof(TimedDetectionRaids), + typeof(EnterCooldownComp) + ], + _whitelistedWorldObjectTypes = + [ + typeof(WorldObject), + typeof(MapParent), + typeof(Settlement), + ModCompatibility.Types.RealRuins.POIWorldObject + ]; + + public static void AddCompToWhiteList(Type compType) + { + _whitelistedTickingCompTypes = _whitelistedTickingCompTypes.Add(compType); + SkippableComps = InitializeSkippableComps(); + } + + public static void AddWorldObjectToWhiteList(Type worldObjectType) + { + _whitelistedWorldObjectTypes = _whitelistedWorldObjectTypes.Add(worldObjectType); + SkippableWorldObjects = InitializeSkippableWorldObjects(); + } public static HashSet - SkippableComps = MakeSubclassHashSet(typeof(WorldObjectComp), nameof(WorldObjectComp.CompTick), - _whitelistedTickingCompTypes), - SkippableWorldObjects = MakeSubclassHashSet(typeof(WorldObject), nameof(WorldObject.Tick), - _whitelistedWorldObjectTypes); + SkippableComps = InitializeSkippableComps(), + SkippableWorldObjects = InitializeSkippableWorldObjects(); - private static HashSet MakeSubclassHashSet(Type type, string name, Type[] allowedDeclaringTypes) + private static HashSet InitializeSkippableComps() + => MakeSubclassHashSet(typeof(WorldObjectComp), nameof(WorldObjectComp.CompTick), + _whitelistedTickingCompTypes); + + private static HashSet InitializeSkippableWorldObjects() + => MakeSubclassHashSet(typeof(WorldObject), nameof(WorldObject.Tick), _whitelistedWorldObjectTypes); + + private static HashSet MakeSubclassHashSet(Type type, string name, Type?[] allowedDeclaringTypes) => type.SubclassesWithNoMethodOverrideAndSelf(allowedDeclaringTypes, name).ToHashSet(); public static bool CacheDirty(WorldObjectsHolder instance) @@ -115,4 +137,112 @@ public class WorldObjectsOptimization : ClassWithFishPrepatches static WorldObjectsHolderTickPatch() => Cache.Utility.Cleared += SetDirty; } + + public sealed class ExpandingIconCaching : FishPrepatch + { + public override string? Description { get; } + = "Caches icons that get displayed for world objects like settlements on the planet view and adds various " + + "safety checks to better catch and log errors in case of missing icons"; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredPropertyGetter(typeof(WorldObject), nameof(WorldObject.ExpandingIcon)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static Texture2D ReplacementBody(WorldObject __instance) + => __instance.ExpandingIconCache() ?? InitializeExpandingIcon(__instance); + + [MethodImpl(MethodImplOptions.NoInlining)] + public static Texture2D InitializeExpandingIcon(WorldObject? worldObject) + { + if (worldObject is null) + return BaseContent.BadTex; + + var def = worldObject.def; + ref var cache = ref worldObject.ExpandingIconCache(); + + try + { + cache = def?.ExpandingIconTexture; + + if (cache != null) + return cache; + + var material = worldObject.Material; + if (material != null) + cache = material.mainTexture as Texture2D; + + if (cache == null) + { + cache = BaseContent.BadTex; + Log.Error($"No expanding icon found for '{worldObject.ToStringSafe()}' of def '{ + def?.ToStringSafe()}' from mod '{def?.modContentPack?.Name}'. Assigning default."); + } + + return cache; + } + catch (Exception ex) + { + Log.Error($"Exception while initializing icon for '{worldObject.ToStringSafe()}' of def '{ + def?.ToStringSafe()}' from mod '{def?.modContentPack?.Name}':\n{ex}"); + + return cache = BaseContent.BadTex; + } + } + } + + public sealed class ExpandingIconColorCaching : FishPrepatch + { + public override string? Description { get; } + = "Caches colors of icons that get displayed for world objects like settlements on the planet view and " + + "adds various safety checks to better catch and log errors in case of missing data"; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredPropertyGetter(typeof(WorldObject), nameof(WorldObject.ExpandingIconColor)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(ReplacementBody); + + public static Color ReplacementBody(WorldObject __instance) + => __instance.ExpandingIconColorCache() ?? InitializeExpandingIconColor(__instance); + + [MethodImpl(MethodImplOptions.NoInlining)] + public static Color InitializeExpandingIconColor(WorldObject? worldObject) + { + if (worldObject is null) + return Color.white; + + var def = worldObject.def; + ref var cache = ref worldObject.ExpandingIconColorCache(); + + try + { + cache = def?.expandingIconColor; + + if (cache != null) + return cache.GetValueOrDefault(); + + var material = worldObject.Material; + if (material != null) + cache = material.color; + + if (cache == null) + { + cache = Color.white; + Log.Error($"No expanding icon color found for '{worldObject.ToStringSafe()}' of def '{ + def?.ToStringSafe()}' from mod '{def?.modContentPack?.Name}'. Assigning default."); + } + + return cache.GetValueOrDefault(); + } + catch (Exception ex) + { + Log.Error($"Exception while initializing icon color for '{worldObject.ToStringSafe()}' of def '{ + def?.ToStringSafe()}' from mod '{def?.modContentPack?.Name}':\n{ex}"); + + return (cache = Color.white).GetValueOrDefault(); + } + } + } } \ No newline at end of file diff --git a/Source/PerformanceFish/Planet/WorldPawnGCOptimization.cs b/Source/PerformanceFish/Planet/WorldPawnGCOptimization.cs index 4eb3caa..3f97a75 100644 --- a/Source/PerformanceFish/Planet/WorldPawnGCOptimization.cs +++ b/Source/PerformanceFish/Planet/WorldPawnGCOptimization.cs @@ -5,14 +5,15 @@ using Mono.Cecil; using Mono.Cecil.Cil; +using PerformanceFish.ModCompatibility; using PerformanceFish.Prepatching; using RimWorld.Planet; namespace PerformanceFish.Planet; -public class WorldPawnGCOptimization : ClassWithFishPrepatches +public sealed class WorldPawnGCOptimization : ClassWithFishPrepatches { - public class AddRelationshipsPatch : FishPrepatch + public sealed class AddRelationshipsPatch : FishPrepatch { public override string? Description { get; } = "The world pawn GC is responsible for deleting no longer relevant pawns. AddAllRelationships here tries " @@ -29,8 +30,10 @@ public class WorldPawnGCOptimization : ClassWithFishPrepatches => AcceptedCriticalPawnReasons.Contains(keptPawns[pawn]); } - public class WorldPawnGCTickPatch : FishPrepatch + public sealed class WorldPawnGCTickPatch : FishPrepatch { + public override List IncompatibleModIDs { get; } = [PackageIDs.MULTIPLAYER]; + public override string? Description { get; } = "Normally the world pawn GC processes 1 pawn per tick, and speeds up if it fails to complete its " + "processing before the game had to add or remove world pawns through other means. This patch changes the " @@ -42,7 +45,7 @@ public class WorldPawnGCOptimization : ClassWithFishPrepatches public static bool Prefix() => TickHelper.MatchesModulo(4); } - public class CancelGCPassPatch : FishPrepatch + public sealed class CancelGCPassPatch : FishPrepatch { public override string? Description { get; } = "When the game determines that it has to speed up its GC process because of world pawn additions or " @@ -67,7 +70,7 @@ public class WorldPawnGCOptimization : ClassWithFishPrepatches } } - public class GetCriticalPawnReasonPatch : FishPrepatch + public sealed class GetCriticalPawnReasonPatch : FishPrepatch { public override string? Description { get; } = "Critical pawns are pawns the game's world pawn GC does not delete. Relationships other than parents of " @@ -102,5 +105,5 @@ public class WorldPawnGCOptimization : ClassWithFishPrepatches } public static HashSet AcceptedCriticalPawnReasons - = new(new[] { "Colonist", "Generating", "Kidnapped", "CaravanMember", "TransportPod", "Spawned" }); + = [..new[] { "Colonist", "Generating", "Kidnapped", "CaravanMember", "TransportPod", "Spawned" }]; } \ No newline at end of file diff --git a/Source/PerformanceFish/Planet/WorldPawnsOptimization.cs b/Source/PerformanceFish/Planet/WorldPawnsOptimization.cs index 6dca958..89e4602 100644 --- a/Source/PerformanceFish/Planet/WorldPawnsOptimization.cs +++ b/Source/PerformanceFish/Planet/WorldPawnsOptimization.cs @@ -10,9 +10,9 @@ using RimWorld.Planet; namespace PerformanceFish.Planet; -public class WorldPawnsOptimization : ClassWithFishPrepatches +public sealed class WorldPawnsOptimization : ClassWithFishPrepatches { - public class AllPawnsAlivePatch : FishPrepatch + public sealed class AllPawnsAlivePatch : FishPrepatch { public override string? Description { get; } = "Minor optimization to reduce the amount of copying happening in the WorldPawns.AllPawnsAlive method"; @@ -52,7 +52,7 @@ public class WorldPawnsOptimization : ClassWithFishPrepatches || instance.pawnsMothballed._version != cache.PawnsMothballedVersion; } - public class AllPawnsAliveOrDeadPatch : FishPrepatch + public sealed class AllPawnsAliveOrDeadPatch : FishPrepatch { public override string? Description { get; } = "Minor optimization to reduce the amount of copying happening in the WorldPawns.AllPawnsAliveOrDead " diff --git a/Source/PerformanceFish/Pools/FishPool.cs b/Source/PerformanceFish/Pools/FishPool.cs deleted file mode 100644 index 455858e..0000000 --- a/Source/PerformanceFish/Pools/FishPool.cs +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) 2023 bradson -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at https://mozilla.org/MPL/2.0/. - -namespace PerformanceFish.Pools; - -public static class FishPool where T : IFishPoolable -{ - private static T?[] _freeItems = new T[4]; - private static int _freeItemCount; - - public static T Get() - { - if (_freeItemCount == 0) - return Reflection.New(); - - var freeItem = _freeItems[--_freeItemCount]; - _freeItems[_freeItemCount] = default; - return freeItem!; - } - - public static void Return(T item) - { - item.Reset(); - - if (++_freeItemCount >= _freeItems.Length) - ExpandFreeItems(); - - _freeItems[_freeItemCount - 1] = item; - } - - [MethodImpl(MethodImplOptions.NoInlining)] - private static void ExpandFreeItems() => Array.Resize(ref _freeItems, _freeItems.Length << 1); -} - -public interface IFishPoolable -{ - public void Reset(); -} \ No newline at end of file diff --git a/Source/PerformanceFish/Pools/PooledIList.cs b/Source/PerformanceFish/Pools/PooledIList.cs deleted file mode 100644 index 6514823..0000000 --- a/Source/PerformanceFish/Pools/PooledIList.cs +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 2023 bradson -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at https://mozilla.org/MPL/2.0/. - -namespace PerformanceFish.Pools; - -public struct PooledIList : IDisposable where T : IList, new() -{ - public T List; - - private static T?[] _freeItems = new T[4]; - private static int _freeItemCount; - - public PooledIList() => List = Get(); - - public void Dispose() - { - if (List == null) - return; - - Return(List); - List = default!; - } - - public static T Get() - { - if (_freeItemCount == 0) - return Reflection.New(); - - var freeItem = _freeItems[--_freeItemCount]; - _freeItems[_freeItemCount] = default; - return freeItem!; - } - - public static void Return(T item) - { - item.Clear(); - - if (++_freeItemCount >= _freeItems.Length) - ExpandFreeItems(); - - _freeItems[_freeItemCount - 1] = item; - } - - [MethodImpl(MethodImplOptions.NoInlining)] - private static void ExpandFreeItems() => Array.Resize(ref _freeItems, _freeItems.Length << 1); -} \ No newline at end of file diff --git a/Source/PerformanceFish/Pools/PooledStringBuilder.cs b/Source/PerformanceFish/Pools/PooledStringBuilder.cs deleted file mode 100644 index 3a4a68e..0000000 --- a/Source/PerformanceFish/Pools/PooledStringBuilder.cs +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (c) 2023 bradson -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at https://mozilla.org/MPL/2.0/. - -using System.Security; -using System.Text; -using JetBrains.Annotations; - -namespace PerformanceFish.Pools; - -public struct PooledStringBuilder : IDisposable -{ - private FishPoolable _fishPoolable; - - public StringBuilder Builder => _fishPoolable.Builder; - - public StringBuilder Append(string? value) => Builder.Append(value); - public StringBuilder Append(char value) => Builder.Append(value); - public StringBuilder Append(char[] value) => Builder.Append(value); - public StringBuilder Append(PooledStringBuilderHandler value) => value.AppendToStringBuilder(Builder); - - public StringBuilder AppendLine(string? value) => Builder.AppendLine(value); - - public StringBuilder Insert(int index, string? value) => Builder.Insert(index, value); - public StringBuilder Insert(int index, char value) => Builder.Insert(index, value); - - public StringBuilder Remove(int startIndex, int length) => Builder.Remove(startIndex, length); - - public void Clear() => Builder.Clear(); - - public override string ToString() => Builder.ToString(); - - [SecuritySafeCritical] - public PooledStringBuilder() => _fishPoolable = FishPool.Get(); - - public PooledStringBuilder(int minimumSize) : this() - { - if (_fishPoolable.Builder.Capacity < minimumSize) - _fishPoolable.Builder.Capacity = minimumSize; - } - - [SecuritySafeCritical] - public void Dispose() - { - if (_fishPoolable.Builder == null!) - return; - - FishPool.Return(_fishPoolable); - _fishPoolable.Builder = null!; - } - - private struct FishPoolable : IFishPoolable - { - public StringBuilder Builder = new(); - - public void Reset() => Builder.Clear(); - - [UsedImplicitly] - public FishPoolable() {} - } -} \ No newline at end of file diff --git a/Source/PerformanceFish/Pools/PooledStringBuilderHandler.cs b/Source/PerformanceFish/Pools/PooledStringBuilderHandler.cs deleted file mode 100644 index 4fe3946..0000000 --- a/Source/PerformanceFish/Pools/PooledStringBuilderHandler.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) 2023 bradson -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at https://mozilla.org/MPL/2.0/. - -using System.Text; -using JetBrains.Annotations; - -namespace PerformanceFish.Pools; - -[UsedImplicitly(ImplicitUseTargetFlags.WithMembers)] -[InterpolatedStringHandler] -public struct PooledStringBuilderHandler : IDisposable -{ - private PooledIList> _chars; - - public PooledStringBuilderHandler(int literalLength, int formattedCount) - { - _chars = new(); - _chars.List.EnsureCapacity(literalLength + (formattedCount * 8)); - } - - public void AppendLiteral(string s) => _chars.List.Add(s); - - public void AppendFormatted(T t) - { - if (t != null) - _chars.List.Add(t.ToString()); - } - - public StringBuilder AppendToStringBuilder(StringBuilder destination) - { - destination.Append(_chars.List); - Dispose(); - return destination; - } - - public void Dispose() => _chars.Dispose(); -} \ No newline at end of file diff --git a/Source/PerformanceFish/Pools/PooledStringHandler.cs b/Source/PerformanceFish/Pools/PooledStringHandler.cs deleted file mode 100644 index a3c93a9..0000000 --- a/Source/PerformanceFish/Pools/PooledStringHandler.cs +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2023 bradson -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at https://mozilla.org/MPL/2.0/. - -using JetBrains.Annotations; - -namespace PerformanceFish.Pools; - -[UsedImplicitly(ImplicitUseTargetFlags.WithMembers)] -[InterpolatedStringHandler] -public struct PooledStringHandler : IDisposable -{ - private PooledStringBuilder _builder; - - public PooledStringHandler(int literalLength, int formattedCount) - => _builder = new(literalLength + (formattedCount * 8)); - - public void AppendLiteral(string s) => _builder.Append(s); - - public void AppendFormatted(T t) - { - if (typeof(T) == typeof(PooledStringBuilderHandler)) - _builder.Append(Unsafe.As(ref t)); - else - _builder.Append(t?.ToString()); - } - - public string GetFormattedText() - { - var result = _builder.ToString(); - Dispose(); - return result; - } - - public void Dispose() => _builder.Dispose(); -} \ No newline at end of file diff --git a/Source/PerformanceFish/PrepatcherFields.cs b/Source/PerformanceFish/PrepatcherFields.cs index 762d440..49bf80a 100644 --- a/Source/PerformanceFish/PrepatcherFields.cs +++ b/Source/PerformanceFish/PrepatcherFields.cs @@ -3,6 +3,9 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. +using System.Linq; +using PerformanceFish.Events; +using PerformanceFish.Hauling; using PerformanceFish.Planet; using Prepatcher; using RimWorld.Planet; @@ -11,27 +14,179 @@ namespace PerformanceFish; public static class PrepatcherFields { + [PrepatcherField] + [ValueInitializer(nameof(CreateMapEvents))] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static extern MapEvents.Instanced Events(this Map map); + + [PrepatcherField] + [ValueInitializer(nameof(CreateThingEvents))] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static extern ThingEvents.Instanced Events(this Thing thing); + [PrepatcherField] [ValueInitializer(nameof(CreateGeneList))] + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static extern List GenesToTick(this Pawn_GeneTracker geneTracker); [PrepatcherField] [ValueInitializer(nameof(CreateWorldPawnsCache))] + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static extern ref WorldPawnsOptimization.Cache Cache(this WorldPawns worldPawns); [PrepatcherField] [ValueInitializer(nameof(CreateBedHashSet))] + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static extern HashSet UniqueContainedBeds(this Room room); + [PrepatcherField] + [ValueInitializer(nameof(CreateIndexMap))] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static extern FishTable IndexMap(this ThingOwner thingOwner) where T : Thing; + + [PrepatcherField] + [ValueInitializer(nameof(CreateIndexMap))] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static extern FishTable IndexMapByDef(this ListerThings listerThings); + + [PrepatcherField] + [ValueInitializer(nameof(CreateIndexMapByGroup))] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static extern FishTable IndexMapByGroup(this ListerThings listerThings); + + [PrepatcherField] + [ValueInitializer(nameof(CreateItemCountGrid))] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static extern Cache.CellGrid ItemCountGrid(this Map map); + + [PrepatcherField] + [ValueInitializer(nameof(CreateBitCellGrid))] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static extern Cache.BitCellGrid StorageBlockerGrid(this Map map); + + [PrepatcherField] + [ValueInitializer(nameof(CreateStorageSettingsCache))] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static extern ref StorageSettingsPatches.StorageSettingsCache Cache(this StorageSettings storageSettings); + + [PrepatcherField] + [ValueInitializer(nameof(CreateParallelGasGridArray))] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static extern GasGridOptimization.ParallelGasGrid[] ParallelGasGrids(this GasGrid gasGrid); + + [PrepatcherField] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static extern ref Texture2D? ExpandingIconCache(this WorldObject worldObject); + + [PrepatcherField] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static extern ref Color? ExpandingIconColorCache(this WorldObject worldObject); + + [PrepatcherField] + [ValueInitializer(nameof(GetDefaultDistrictArray))] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static extern ref StorageDistrict[] Districts(this SlotGroup slotGroup); + + [PrepatcherField] + [ValueInitializer(nameof(CreateStorageDistrictGrid))] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static extern Cache.CellGrid StorageDistrictGrid(this Map map); + + [PrepatcherField] + [ValueInitializer(nameof(CreateListerBuildingsCache))] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static extern ref Listers.Buildings.Cache Cache(this ListerBuildings listerBuildings); + + [PrepatcherField] + [ValueInitializer(nameof(CreateListerHaulablesCache))] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static extern ref Listers.Haulables.Cache Cache(this ListerHaulables listerHaulables); + + [PrepatcherField] + [ValueInitializer(nameof(CreateHaulDestinationManagerCache))] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static extern ref HaulDestinationManagerCache Cache(this HaulDestinationManager manager); + + [PrepatcherField] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static extern ref object MonitorObject(this GasGrid gasGrid); + + // [PrepatcherField] + // [ValueInitializer(nameof(CreateHediffCompList))] + // [MethodImpl(MethodImplOptions.AggressiveInlining)] + // public static extern List HediffCompsWithVisible(this HediffWithComps hediff); + // + // [PrepatcherField] + // [ValueInitializer(nameof(CreateHediffCompList))] + // [MethodImpl(MethodImplOptions.AggressiveInlining)] + // public static extern List HediffCompsWithShouldRemove(this HediffWithComps hediff); + // + // [PrepatcherField] + // [ValueInitializer(nameof(CreateHediffCompList))] + // [MethodImpl(MethodImplOptions.AggressiveInlining)] + // public static extern List HediffCompsWithPostTick(this HediffWithComps hediff); + #if false [PrepatcherField] [ValueInitializer(nameof(CreateHediffList))] + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static extern List HediffsToTick(this Pawn_HealthTracker healthTracker); public static List CreateHediffList() => new(); #endif - public static List CreateGeneList() => new(); + public static List CreateGeneList() => []; public static WorldPawnsOptimization.Cache CreateWorldPawnsCache() => new(); - public static HashSet CreateBedHashSet() => new(); + public static HashSet CreateBedHashSet() => []; + public static FishTable CreateIndexMap() => new(); + public static FishTable CreateIndexMapByGroup() => new(); + public static Cache.CellGrid CreateItemCountGrid(Map map) => new(map); + public static Cache.BitCellGrid CreateBitCellGrid(Map map) => new(map); + public static MapEvents.Instanced CreateMapEvents() => new(); + public static ThingEvents.Instanced CreateThingEvents() => new(); + public static StorageSettingsPatches.StorageSettingsCache CreateStorageSettingsCache() => new(); + public static StorageDistrict[] GetDefaultDistrictArray() => StorageDistrict.GetDefaultArray(); + public static Cache.CellGrid CreateStorageDistrictGrid(Map map) => new(map); + public static Listers.Buildings.Cache CreateListerBuildingsCache() => new(); + public static Listers.Haulables.Cache CreateListerHaulablesCache() => new(); + public static HaulDestinationManagerCache CreateHaulDestinationManagerCache() => new(); + + public static GasGridOptimization.ParallelGasGrid[] CreateParallelGasGridArray(GasGrid gasGrid) + { + DefDatabase.SetIndices(); + + var map = gasGrid.map; + var gasDefs = DefDatabase.AllDefsListForReading; + + if (gasDefs.Count < 3) + { + Log.Error($"GasDefs are missing! Expected are at least 3, DefDatabase contains { + gasDefs.Count} instead. ParallelGasGrid won't work correctly in this state."); + } + else + { + if (gasDefs[0] != GasDefOf.BlindSmoke || gasDefs[1] != GasDefOf.ToxGas || gasDefs[2] != GasDefOf.RotStink) + { + Log.Warning("GasDefs out of order. Sorting now to fix."); + var allGasDefs = gasDefs.ToList(); + + allGasDefs.Remove(gasDefs[0] = GasDefOf.BlindSmoke); + allGasDefs.Remove(gasDefs[1] = GasDefOf.ToxGas); + allGasDefs.Remove(gasDefs[2] = GasDefOf.RotStink); + + for (var i = 0; i < allGasDefs.Count; i++) + gasDefs[i + 3] = allGasDefs[i]; + + DefDatabase.SetIndices(); + } + } + + var grids = new GasGridOptimization.ParallelGasGrid[gasDefs.Count]; + for (var i = 0; i < grids.Length; i++) + grids[i] = new(map, gasDefs[i]); + + return grids; + } + + // public static List CreateHediffCompList() => new(); } \ No newline at end of file diff --git a/Source/PerformanceFish/Prepatching/ClassWithFishPrepatches.cs b/Source/PerformanceFish/Prepatching/ClassWithFishPrepatches.cs index 36f44e2..4b9e277 100644 --- a/Source/PerformanceFish/Prepatching/ClassWithFishPrepatches.cs +++ b/Source/PerformanceFish/Prepatching/ClassWithFishPrepatches.cs @@ -13,7 +13,22 @@ namespace PerformanceFish.Prepatching; public abstract class ClassWithFishPrepatches : SingletonFactory { public virtual FishPrepatchHolder Patches { get; } - public virtual bool RequiresLoadedGameForPatching => false; + + public virtual bool ShowSettings + { + get + { + foreach (var patch in Patches) + { + if (patch.ShowSettings) + return true; + } + + return false; + } + } + + public virtual bool Enabled => true; protected ClassWithFishPrepatches() => Patches = new(GetType()); } \ No newline at end of file diff --git a/Source/PerformanceFish/Prepatching/FishClassPrepatch.cs b/Source/PerformanceFish/Prepatching/FishClassPrepatch.cs index 31c26e4..d02e0be 100644 --- a/Source/PerformanceFish/Prepatching/FishClassPrepatch.cs +++ b/Source/PerformanceFish/Prepatching/FishClassPrepatch.cs @@ -11,7 +11,25 @@ public abstract class FishClassPrepatch : FishPrepatchBase { public abstract Type Type { get; } - public virtual void FreePatch(TypeDefinition typeDefinition) + public abstract void FreePatch(TypeDefinition typeDefinition); + + protected internal override void ApplyPatch(ModuleDefinition module) { + // ReSharper disable once NullCoalescingConditionIsAlwaysNotNullAccordingToAPIContract + var patchType = Type + ?? ThrowHelper.ThrowInvalidOperationException( + $"Patch {GetType().FullName} has no target type."); + + if (patchType.IsGenericType) + patchType = patchType.GetGenericTypeDefinition(); + + DebugLog.Message($"Applying prepatch {GetType().FullName} on type { + patchType.FullName}"); + + var targetType = module.GetType(patchType.Namespace, patchType.Name) ?? ThrowForFailureToFindType(patchType); + + // PrepatchManager.AddSecurityAttributes(targetType.SecurityDeclarations, module); + + FreePatch(targetType); } } \ No newline at end of file diff --git a/Source/PerformanceFish/Prepatching/FishPrepatch.cs b/Source/PerformanceFish/Prepatching/FishPrepatch.cs index 1421a07..2e2d957 100644 --- a/Source/PerformanceFish/Prepatching/FishPrepatch.cs +++ b/Source/PerformanceFish/Prepatching/FishPrepatch.cs @@ -5,6 +5,9 @@ using Mono.Cecil; using Mono.Cecil.Cil; +using Mono.Cecil.Rocks; +using Mono.Collections.Generic; +using MonoMod.Utils; namespace PerformanceFish.Prepatching; @@ -24,4 +27,331 @@ public abstract class FishPrepatch : FishPrepatchBase private MethodInfo? TryGetMethod(string nameCaseInsensitive, Predicate? predicate = null) => GetType().TryGetMethod(nameCaseInsensitive, predicate); + + protected internal override void ApplyPatch(ModuleDefinition module) + { + // ReSharper disable once NullCoalescingConditionIsAlwaysNotNullAccordingToAPIContract + var patchMethod = TargetMethodBase + ?? ThrowHelper.ThrowInvalidOperationException( + $"Patch {GetType().FullName} has no target method."); + + if (patchMethod.IsGenericMethod && patchMethod is MethodInfo info) + patchMethod = info.GetGenericMethodDefinition(); + + var patchType = patchMethod.ReflectedType + ?? ThrowHelper.ThrowInvalidOperationException( + $"Method {patchMethod.FullDescription()} has no declaring type."); + + if (patchMethod.ReflectedType != patchMethod.DeclaringType) + { + ThrowHelper.ThrowInvalidOperationException($"Tried to apply patch on method { + patchMethod.Name} for type {patchMethod.ReflectedType}, but it is only declared in { + patchMethod.DeclaringType}."); + } + + if (patchType.IsGenericType) + { + patchType = patchType.GetGenericTypeDefinition(); + patchMethod = patchMethod is MethodInfo + ? AccessTools.DeclaredMethod(patchType, patchMethod.Name, patchMethod.GetParameters().GetTypes()) + : AccessTools.Constructor(patchType, patchMethod.GetParameters().GetTypes(), patchMethod.IsStatic); + } + + DebugLog.Message($"Applying prepatch {GetType().FullName} on method { + patchMethod.FullDescription()}"); + + var targetType = module.GetTypeDefinition(patchType) ?? ThrowForFailureToFindType(patchType); + var targetMethod = targetType.GetMethod(patchMethod.Name, patchMethod.GetParameters().GetTypes()) + ?? ThrowForFailureToFindMethod(targetType, patchMethod); + + // PrepatchManager.AddSecurityAttributes(targetMethod.SecurityDeclarations, module, targetMethod.FullName); + + var targetMethodBody = targetMethod.Body; + var ilProcessor = targetMethodBody.GetILProcessor(); + + try + { + Transpiler(ilProcessor, module); + } + catch (Exception e) + { + Log.Error($"Exception while applying transpiler for {GetType().FullName}\n{e}\n{ + Environment.StackTrace /*StackTraceUtility.ExtractStackTrace()*/}"); + } + + var patchVariables = new PatchVariables(); + + if (PrefixMethodInfo is { } prefixMethod) + { + try + { + ApplyPrefix(prefixMethod, ilProcessor, module, ref patchVariables); + } + catch (Exception e) + { + Log.Error($"Exception while applying prefix for {GetType().FullName}\n{e}\n{ + Environment.StackTrace /*StackTraceUtility.ExtractStackTrace()*/}"); + } + } + + if (PostfixMethodInfo is { } postfixMethod) + { + try + { + ApplyPostfix(postfixMethod, ilProcessor, module, ref patchVariables); + } + catch (Exception e) + { + Log.Error($"Exception while applying postfix for {GetType().FullName}\n{e}\n{ + Environment.StackTrace /*StackTraceUtility.ExtractStackTrace()*/}"); + } + } + + targetMethodBody.SimplifyMacros(); + targetMethodBody.OptimizeMacros(); + } + + private static void ApplyPrefix(MethodInfo prefixMethodInfo, ILProcessor ilProcessor, ModuleDefinition module, + ref PatchVariables patchVariables) + { + if (prefixMethodInfo.ReturnType != typeof(bool) && prefixMethodInfo.ReturnType != typeof(void)) + { + ThrowHelper.ThrowArgumentException($"Prefix has invalid return type: { + prefixMethodInfo.ReturnType.FullName}. Must be void or bool"); + } + + var instructions = ilProcessor.instructions; + var targetMethod = ilProcessor.GetMethod(); + + var genericParameters = GetGenericParameters(targetMethod); + var prefixParameters = prefixMethodInfo.GetParameters(); + + var resultParameter = prefixParameters.TryGetNamed("__result"); + VerifyResultParameter(module, resultParameter, targetMethod, true); + + var stateParameter = prefixParameters.TryGetNamed("__state"); + VerifyStateParameter(stateParameter); + + // var skipOriginalFlag = ilProcessor.DeclareLocal(typeof(bool)); + var resultVariable = GetResultVariable(ilProcessor, ref patchVariables, resultParameter, targetMethod); + var stateVariable = GetStateVariable(ilProcessor, ref patchVariables, stateParameter); + var startOfOriginal = instructions[0]; + + var index = 0; + foreach (var parameter in prefixParameters) + { + ilProcessor.InsertAt(index++, GetInstructionForParameter(module, parameter, resultParameter, resultVariable, + stateParameter, stateVariable, targetMethod)); + } + + if (genericParameters != null) + { + ilProcessor.InsertAt(index++, OpCodes.Call, + module.ImportMethodWithGenericArguments(prefixMethodInfo, genericParameters)); + } + else + { + ilProcessor.InsertAt(index++, OpCodes.Call, prefixMethodInfo); + } + + if (prefixMethodInfo.ReturnType == typeof(bool)) + { + ilProcessor.InsertAt(index++, (OpCodes.Brtrue, startOfOriginal)); + + if (resultVariable != null) + { + ilProcessor.InsertAt(index++, (OpCodes.Ldloc, resultVariable)); + } + else if (targetMethod.ReturnType.FullName != module.TypeSystem.Void.FullName) + { + Log.Error($"Prefix { + prefixMethodInfo.FullDescription()} with return type of bool must assign to a __result parameter"); + } + + ilProcessor.InsertAt(index, OpCodes.Ret); + } + } + + private static void ApplyPostfix(MethodInfo postfixMethodInfo, ILProcessor ilProcessor, ModuleDefinition module, + ref PatchVariables patchVariables) + { + var targetMethod = ilProcessor.GetMethod(); + + if (postfixMethodInfo.ReturnType != typeof(void) + && !postfixMethodInfo.ReturnType.Is(targetMethod.ReturnType)) + { + ThrowHelper.ThrowArgumentException($"Postfix has invalid return type: { + postfixMethodInfo.ReturnType.FullName}. Must be void or {targetMethod.ReturnType}"); + } + + var instructions = ilProcessor.instructions; + var genericParameters = GetGenericParameters(targetMethod); + var postfixParameters = postfixMethodInfo.GetParameters(); + + var resultParameter = postfixParameters.TryGetNamed("__result"); + VerifyResultParameter(module, resultParameter, targetMethod, false); + + var stateParameter = postfixParameters.TryGetNamed("__state"); + // Verify? It would make sense to match against prefix state + + // var skipOriginalFlag = ilProcessor.DeclareLocal(typeof(bool)); + var resultVariable = GetResultVariable(ilProcessor, ref patchVariables, resultParameter, targetMethod); + var stateVariable = GetStateVariable(ilProcessor, ref patchVariables, stateParameter); + + var postfixInstructions = new Collection(); + + if (resultVariable != null) + postfixInstructions.Add((OpCodes.Stloc, resultVariable)); + + foreach (var parameter in postfixParameters) + { + postfixInstructions.Add(GetInstructionForParameter(module, parameter, resultParameter, resultVariable, + stateParameter, stateVariable, targetMethod)); + } + + if (genericParameters != null) + { + postfixInstructions.Add((OpCodes.Call, + module.ImportMethodWithGenericArguments(postfixMethodInfo, genericParameters))); + } + else + { + postfixInstructions.Add((OpCodes.Call, postfixMethodInfo)); + } + + if (postfixMethodInfo.ReturnType == typeof(void) && resultVariable != null) + postfixInstructions.Add((OpCodes.Ldloc, resultVariable)); + + Span retInstructions = stackalloc int[instructions.Count]; + var retInstructionCount = 0; + + for (var i = 0; i < instructions.Count; i++) + { + if (instructions[i].OpCode == OpCodes.Ret) + retInstructions[retInstructionCount++] = i; + } + + var lastRetInstructionIndex = retInstructions[retInstructionCount - 1]; + ilProcessor.InsertRange(lastRetInstructionIndex, postfixInstructions); + + for (var i = 0; i < instructions.Count; i++) + { + var instruction = instructions[i]; + if (instruction.Operand is Instruction branchTarget && branchTarget.OpCode == OpCodes.Ret) + instruction.Operand = instructions[lastRetInstructionIndex]; + } + + for (var i = 0; i < retInstructionCount - 1; i++) + { + var instruction = instructions[retInstructions[i]]; + instruction.OpCode = OpCodes.Br; + instruction.Operand = instructions[lastRetInstructionIndex]; + } + } + + private static VariableDefinition? GetStateVariable(ILProcessor ilProcessor, ref PatchVariables patchVariables, + ParameterInfo? stateParameter) + => stateParameter != null + ? patchVariables.State ??= ilProcessor.DeclareLocal(GetUnderlyingType(stateParameter.ParameterType)) + : null; + + private static VariableDefinition? GetResultVariable(ILProcessor ilProcessor, ref PatchVariables patchVariables, + ParameterInfo? resultParameter, MethodDefinition targetMethod) + => resultParameter != null + ? patchVariables.Result ??= ilProcessor.DeclareLocal(targetMethod.ReturnType) + : null; + + private static void VerifyStateParameter(ParameterInfo? stateParameter) + { + if (stateParameter is { ParameterType.IsByRef: false }) + ThrowHelper.ThrowArgumentException("__state parameter must be declared with ref or out keyword."); + } + + private static ITuple GetInstructionForParameter(ModuleDefinition module, ParameterInfo parameter, + ParameterInfo? resultParameter, VariableDefinition? resultVariable, ParameterInfo? stateParameter, + VariableDefinition? stateVariable, MethodDefinition targetMethod) + => parameter == resultParameter + ? (parameter.ParameterType.IsByRef ? OpCodes.Ldloca : OpCodes.Ldloc, resultVariable) + : parameter == stateParameter + ? (parameter.ParameterType.IsByRef ? OpCodes.Ldloca : OpCodes.Ldloc, stateVariable) + : GetMatchingTargetParameter(targetMethod, parameter, module); + + private static void VerifyResultParameter(ModuleDefinition module, ParameterInfo? resultParameter, + MethodDefinition targetMethod, bool requiresByRef) + { + if (resultParameter is null) + return; + + if (targetMethod.ReturnType.IsGeneric() ? !GetUnderlyingType(resultParameter.ParameterType).IsGeneric() + : !GetUnderlyingType(resultParameter.ParameterType).Is(targetMethod.ReturnType)) + { + // var firstType = targetMethod.ReturnType; + // var secondType = GetUnderlyingType(resultParameter.ParameterType); + // Log.Message($"Type FullName: {firstType.FullName + // }: ContainsGenericParameter: {firstType.ContainsGenericParameter + // }, HasGenericParameters :{firstType.HasGenericParameters + // }, IsGenericInstance: {firstType.IsGenericInstance + // }, Type FullName: {secondType.FullName + // } ContainsGenericParameters: {secondType.ContainsGenericParameters + // }, IsGenericType {secondType.IsGenericType + // }, IsConstructedGenericType: {secondType.IsConstructedGenericType}"); + + ThrowHelper.ThrowArgumentException($"__result parameter has invalid type: { + resultParameter.ParameterType.FullName}. Must match the target's return type: { + targetMethod.ReturnType.FullName}"); + } + if (requiresByRef && !resultParameter.ParameterType.IsByRef) + { + ThrowHelper.ThrowArgumentException( + "__result parameter must be declared with ref or out keyword."); + } + } + + private static Collection? GetGenericParameters(MethodDefinition targetMethod) + => targetMethod.HasGenericParameters ? targetMethod.GenericParameters + : targetMethod.DeclaringType.HasGenericParameters ? targetMethod.DeclaringType.GenericParameters + : null; + + private static Type GetUnderlyingType(Type type) => type.IsByRef ? type.GetElementType()! : type; + + private static ITuple GetMatchingTargetParameter(MethodDefinition targetMethod, + ParameterInfo parameter, ModuleDefinition module) + { + var targetParameters = targetMethod.Parameters; + var targetParameter = parameter.Name == "__instance" + ? targetMethod.Body.ThisParameter + : targetParameters.TryGetNamed(parameter.Name); + if (targetParameter is null) + { + return ThrowHelper.ThrowArgumentException($"No parameter named { + parameter.Name} found in target method"); + } + + var targetParameterType = targetParameter.ParameterType; + var patchParameterType = parameter.ParameterType; + + return GetUnderlyingType(targetParameter).Name != GetUnderlyingType(patchParameterType).Name + ? ThrowHelper.ThrowArgumentException($"Parameter has invalid type: { + patchParameterType.FullName}. Must match the target method parameter's type: { + targetParameterType.FullName}") + : (patchParameterType.IsByRef && !targetParameter.ParameterType.IsByReference + ? OpCodes.Ldarga + : OpCodes.Ldarg, targetParameter); + } + + private static TypeReference GetUnderlyingType(ParameterInfo prefixParameter, ModuleDefinition module) + => module.ImportReference(GetUnderlyingType(prefixParameter.ParameterType)); + + private static TypeReference GetUnderlyingType(ParameterDefinition prefixParameter) + => prefixParameter.ParameterType.IsByReference ? prefixParameter.ParameterType.GetElementType()! + : prefixParameter.ParameterType; + + private static MethodDefinition ThrowForFailureToFindMethod(TypeDefinition? type, MethodBase patchMethod) + => ThrowHelper.ThrowInvalidOperationException( + $"Failed to find method with type {type} and name {patchMethod.Name}"); + + private record struct PatchVariables + { + public VariableDefinition? Result, State; + } } \ No newline at end of file diff --git a/Source/PerformanceFish/Prepatching/FishPrepatchBase.cs b/Source/PerformanceFish/Prepatching/FishPrepatchBase.cs index 4d989fc..17cf458 100644 --- a/Source/PerformanceFish/Prepatching/FishPrepatchBase.cs +++ b/Source/PerformanceFish/Prepatching/FishPrepatchBase.cs @@ -4,23 +4,73 @@ // file, You can obtain one at https://mozilla.org/MPL/2.0/. extern alias nuget; +using System.Linq; +using Mono.Cecil; using nuget::JetBrains.Annotations; +using PerformanceFish.ModCompatibility; namespace PerformanceFish.Prepatching; [UsedImplicitly(ImplicitUseTargetFlags.WithInheritors | ImplicitUseTargetFlags.WithMembers)] public abstract class FishPrepatchBase : SingletonFactory, IExposable, IHasDescription { - private bool _enabled; + private bool + _enabled, + _isActive; + + private string? _descriptionWithNotes; + + private FishPrepatchBase[]? _resolvedLinkedPrepatches; + private FishPatch[]? _resolvedLinkedHarmonyPatches; + + internal int IDNumber { get; } + + public virtual int Priority => HarmonyLib.Priority.Normal; + public virtual List IncompatibleModIDs { get; } = []; + + public virtual List LinkedPatches { get; } = []; + + private FishPrepatchBase[] ResolvedLinkedPrepatches + => _resolvedLinkedPrepatches ??= LinkedPatches + .Where(static type => type.IsAssignableTo(typeof(FishPrepatchBase))).Select(static type => Get(type)) + .ToArray(); + + private FishPatch[] ResolvedLinkedHarmonyPatches + => _resolvedLinkedHarmonyPatches ??= LinkedPatches + .Where(static type => type.IsAssignableTo(typeof(FishPatch))).Select(static type => FishPatch.Get(type)) + .ToArray(); + + public bool DisabledForModCompatibility => ActiveMods.ContainsAnyOf(IncompatibleModIDs); + public virtual string? Description => null; + public string? DescriptionWithNotes + => _descriptionWithNotes ??= !DisabledForModCompatibility + ? Description + : Description + + $"{(Description?.EndsWith(".") ?? true ? "" : ".")} Disabled for compatibility with { + IncompatibleModIDs.Select(static id => ActiveMods.TryGetModMetaData(id)?.Name) + .Where(static id => id != null).ToCommaList(true)}"; + public virtual string? Name => null; public virtual bool Enabled { - get => _enabled; - set => _enabled = value; + get => _enabled && !DisabledForModCompatibility; + set + { + if (_enabled == value) + return; + + _enabled = value; + + for (var i = 0; i < ResolvedLinkedPrepatches.Length; i++) + ResolvedLinkedPrepatches[i].Enabled = value; + + for (var i = 0; i < ResolvedLinkedHarmonyPatches.Length; i++) + ResolvedLinkedHarmonyPatches[i].Enabled = value; + } } public virtual bool DefaultState @@ -28,8 +78,38 @@ public abstract class FishPrepatchBase : SingletonFactory, IEx [Pure] get => true; } + public virtual bool ShowSettings => true; + + public bool IsActive => _isActive; + // ReSharper disable once VirtualMemberCallInConstructor - protected FishPrepatchBase() => _enabled = DefaultState; + protected FishPrepatchBase() + { + _enabled = DefaultState; + IDNumber = Interlocked.Increment(ref _idCounter); + + if (OnAssembliesLoaded.Loaded) + _isActive = FishStash.Get.IsPatchActive(this); + } + + protected internal abstract void ApplyPatch(ModuleDefinition module); + + protected internal virtual void OnPatchingCompleted() + { + } + + protected internal virtual void BeforeHarmonyPatching() + { + } public virtual void ExposeData() => Scribe_Values.Look(ref _enabled, "enabled", DefaultState); + + internal static Comparer PriorityComparer + = Comparer.Create(static (x, y) => y.Priority.CompareTo(x.Priority)); + + protected static TypeDefinition ThrowForFailureToFindType(Type patchType) + => ThrowHelper.ThrowInvalidOperationException( + $"Failed to find type with namespace {patchType.Namespace} and name {patchType.Name}"); + + private static volatile int _idCounter; } \ No newline at end of file diff --git a/Source/PerformanceFish/Prepatching/FishPrepatchExtensions.cs b/Source/PerformanceFish/Prepatching/FishPrepatchExtensions.cs new file mode 100644 index 0000000..50a2373 --- /dev/null +++ b/Source/PerformanceFish/Prepatching/FishPrepatchExtensions.cs @@ -0,0 +1,73 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using Mono.Cecil; + +namespace PerformanceFish.Prepatching; + +public static class FishPrepatchExtensions +{ + internal static void ApplyPatches(this ClassWithFishPrepatches[] allPrepatchClasses, ModuleDefinition module) + { + var prepatches = ToSortedList(allPrepatchClasses, true); + + foreach (var prepatch in prepatches) + { + if (!prepatch.Enabled) + continue; + + try + { + prepatch.ApplyPatch(module); + } + catch (Exception ex) + { + Log.Error($"Exception while applying prepatch '{prepatch}' for '{PerformanceFishMod.NAME}':\n{ex}"); + } + } + } + + internal static void BeforeHarmonyPatching(this ClassWithFishPrepatches[] allPrepatchClasses) + => allPrepatchClasses.FinalizePrepatchAction(static patch => patch.BeforeHarmonyPatching()); + + internal static void OnPatchingCompleted(this ClassWithFishPrepatches[] allPrepatchClasses) + => allPrepatchClasses.FinalizePrepatchAction(static patch => patch.OnPatchingCompleted()); + + private static void FinalizePrepatchAction(this ClassWithFishPrepatches[] allPrepatchClasses, + Action action) + { + var prepatches = ToSortedList(allPrepatchClasses, false); + + foreach (var prepatch in prepatches) + { + if (!prepatch.IsActive) + continue; + + try + { + action(prepatch); + } + catch (Exception ex) + { + Log.Error($"Exception while finalizing prepatch '{prepatch}' for '{PerformanceFishMod.NAME}':\n{ex}"); + } + } + } + + private static List ToSortedList(this ClassWithFishPrepatches[] allPrepatchClasses, + bool checkEnabledState) + { + var prepatches = new List(); + + foreach (var prepatchClass in allPrepatchClasses) + { + if (!checkEnabledState || prepatchClass.Enabled) + prepatches.AddRange(prepatchClass.Patches.All.Values); + } + + prepatches.Sort(FishPrepatchBase.PriorityComparer); + return prepatches; + } +} \ No newline at end of file diff --git a/Source/PerformanceFish/Prepatching/FishPrepatchHolder.cs b/Source/PerformanceFish/Prepatching/FishPrepatchHolder.cs index 64bcc8e..b436f83 100644 --- a/Source/PerformanceFish/Prepatching/FishPrepatchHolder.cs +++ b/Source/PerformanceFish/Prepatching/FishPrepatchHolder.cs @@ -5,12 +5,6 @@ extern alias nuget; using System.Collections.Concurrent; -using System.Diagnostics; -using Mono.Cecil; -using Mono.Cecil.Cil; -using Mono.Cecil.Rocks; -using Mono.Collections.Generic; -using MonoMod.Utils; using nuget::JetBrains.Annotations; namespace PerformanceFish.Prepatching; @@ -23,366 +17,6 @@ public class FishPrepatchHolder : IExposable, IEnumerable public T Get() where T : FishPrepatchBase => (T)All[typeof(T)]; public void Add(FishPrepatchBase patch) => All[patch.GetType()] = patch; - public void PatchAll(ModuleDefinition module) - { - var patches = All.Values; - foreach (var patch in patches) - { - if (!patch.Enabled) - continue; - - try - { - switch (patch) - { - case FishPrepatch methodPatch: - ApplyMethodPatch(module, methodPatch); - break; - case FishClassPrepatch classPatch: - ApplyClassPatch(module, classPatch); - break; - } - } - catch (Exception ex) - { - Log.Error($"Exception while applying prepatches for {PerformanceFishMod.NAME}:\n{ex}"); - } - } - } - - private static void ApplyMethodPatch(ModuleDefinition module, FishPrepatch patch) - { - // ReSharper disable once NullCoalescingConditionIsAlwaysNotNullAccordingToAPIContract - var patchMethod = patch.TargetMethodBase - ?? ThrowHelper.ThrowInvalidOperationException( - $"Patch {patch.GetType().FullName} has no target method."); - - if (patchMethod.IsGenericMethod && patchMethod is MethodInfo info) - patchMethod = info.GetGenericMethodDefinition(); - - var patchType = patchMethod.ReflectedType - ?? ThrowHelper.ThrowInvalidOperationException( - $"Method {patchMethod.FullDescription()} has no declaring type."); - - if (patchMethod.ReflectedType != patchMethod.DeclaringType) - { - ThrowHelper.ThrowInvalidOperationException($"Tried to apply patch on method { - patchMethod.Name} for type {patchMethod.ReflectedType}, but it is only declared in { - patchMethod.DeclaringType}."); - } - - if (patchType.IsGenericType) - { - patchType = patchType.GetGenericTypeDefinition(); - patchMethod = patchMethod is MethodInfo - ? AccessTools.DeclaredMethod(patchType, patchMethod.Name, patchMethod.GetParameters().GetTypes()) - : AccessTools.Constructor(patchType, patchMethod.GetParameters().GetTypes(), patchMethod.IsStatic); - } - - DebugLog.Message($"Applying prepatch {patch.GetType().FullName} on method { - patchMethod.FullDescription()}"); - - var targetType = module.GetTypeDefinition(patchType) ?? ThrowForFailureToFindType(patchType); - var targetMethod = targetType.GetMethod(patchMethod.Name, patchMethod.GetParameters().GetTypes()) - ?? ThrowForFailureToFindMethod(targetType, patchMethod); - - // PrepatchManager.AddSecurityAttributes(targetMethod.SecurityDeclarations, module, targetMethod.FullName); - - var ilProcessor = targetMethod.Body.GetILProcessor(); - - try - { - patch.Transpiler(ilProcessor, module); - } - catch (Exception e) - { - Log.Error($"Exception while applying transpiler for {patch.GetType().FullName}\n{e}\n{ - new StackTrace() /*StackTraceUtility.ExtractStackTrace()*/}"); - } - - var patchVariables = new PatchVariables(); - - if (patch.PrefixMethodInfo is { } prefixMethod) - { - try - { - ApplyPrefix(prefixMethod, ilProcessor, module, ref patchVariables); - } - catch (Exception e) - { - Log.Error($"Exception while applying prefix for {patch.GetType().FullName}\n{e}\n{ - new StackTrace() /*StackTraceUtility.ExtractStackTrace()*/}"); - } - } - - if (patch.PostfixMethodInfo is { } postfixMethod) - { - try - { - ApplyPostfix(postfixMethod, ilProcessor, module, ref patchVariables); - } - catch (Exception e) - { - Log.Error($"Exception while applying postfix for {patch.GetType().FullName}\n{e}\n{ - new StackTrace() /*StackTraceUtility.ExtractStackTrace()*/}"); - } - } - - targetMethod.Body.OptimizeMacros(); - } - - private static void ApplyPrefix(MethodInfo prefixMethodInfo, ILProcessor ilProcessor, ModuleDefinition module, - ref PatchVariables patchVariables) - { - if (prefixMethodInfo.ReturnType != typeof(bool) && prefixMethodInfo.ReturnType != typeof(void)) - { - ThrowHelper.ThrowArgumentException($"Prefix has invalid return type: { - prefixMethodInfo.ReturnType.FullName}. Must be void or bool"); - } - - var instructions = ilProcessor.instructions; - var targetMethod = ilProcessor.GetMethod(); - - var genericParameters = GetGenericParameters(targetMethod); - var prefixParameters = prefixMethodInfo.GetParameters(); - - var resultParameter = prefixParameters.TryGetNamed("__result"); - VerifyResultParameter(module, resultParameter, targetMethod, true); - - var stateParameter = prefixParameters.TryGetNamed("__state"); - VerifyStateParameter(stateParameter); - - // var skipOriginalFlag = ilProcessor.DeclareLocal(typeof(bool)); - var resultVariable = GetResultVariable(ilProcessor, ref patchVariables, resultParameter, targetMethod); - var stateVariable = GetStateVariable(ilProcessor, ref patchVariables, stateParameter); - var startOfOriginal = instructions[0]; - - var index = 0; - foreach (var parameter in prefixParameters) - { - ilProcessor.InsertAt(index++, GetInstructionForParameter(module, parameter, resultParameter, resultVariable, - stateParameter, stateVariable, targetMethod)); - } - - if (genericParameters != null) - { - ilProcessor.InsertAt(index++, OpCodes.Call, - module.ImportMethodWithGenericArguments(prefixMethodInfo, genericParameters)); - } - else - { - ilProcessor.InsertAt(index++, OpCodes.Call, prefixMethodInfo); - } - - if (prefixMethodInfo.ReturnType == typeof(bool)) - { - ilProcessor.InsertAt(index++, (OpCodes.Brtrue_S, startOfOriginal)); - - if (resultVariable != null) - { - ilProcessor.InsertAt(index++, (OpCodes.Ldloc_S, resultVariable)); - } - else if (targetMethod.ReturnType.FullName != module.TypeSystem.Void.FullName) - { - Log.Error($"Prefix {prefixMethodInfo.FullDescription() - } with return type of bool must assign to a __result parameter"); - } - - ilProcessor.InsertAt(index, OpCodes.Ret); - } - } - - private static VariableDefinition? GetStateVariable(ILProcessor ilProcessor, ref PatchVariables patchVariables, - ParameterInfo? stateParameter) - => stateParameter != null - ? patchVariables.State ??= ilProcessor.DeclareLocal(GetUnderlyingType(stateParameter.ParameterType)) - : null; - - private static VariableDefinition? GetResultVariable(ILProcessor ilProcessor, ref PatchVariables patchVariables, - ParameterInfo? resultParameter, MethodDefinition targetMethod) - => resultParameter != null - ? patchVariables.Result ??= ilProcessor.DeclareLocal(targetMethod.ReturnType) - : null; - - private static void VerifyStateParameter(ParameterInfo? stateParameter) - { - if (stateParameter is { ParameterType.IsByRef: false }) - ThrowHelper.ThrowArgumentException("__state parameter must be declared with ref or out keyword."); - } - - private static Collection? GetGenericParameters(MethodDefinition targetMethod) - => targetMethod.HasGenericParameters ? targetMethod.GenericParameters - : targetMethod.DeclaringType.HasGenericParameters ? targetMethod.DeclaringType.GenericParameters - : null; - - private static Type GetUnderlyingType(Type type) => type.IsByRef ? type.GetElementType()! : type; - - private static void ApplyPostfix(MethodInfo postfixMethodInfo, ILProcessor ilProcessor, ModuleDefinition module, - ref PatchVariables patchVariables) - { - var targetMethod = ilProcessor.GetMethod(); - - if (postfixMethodInfo.ReturnType != typeof(void) - && !postfixMethodInfo.ReturnType.Is(targetMethod.ReturnType)) - { - ThrowHelper.ThrowArgumentException($"Postfix has invalid return type: { - postfixMethodInfo.ReturnType.FullName}. Must be void or {targetMethod.ReturnType}"); - } - - var instructions = ilProcessor.instructions; - var genericParameters = GetGenericParameters(targetMethod); - var postfixParameters = postfixMethodInfo.GetParameters(); - - var resultParameter = postfixParameters.TryGetNamed("__result"); - VerifyResultParameter(module, resultParameter, targetMethod, false); - - var stateParameter = postfixParameters.TryGetNamed("__state"); - // Verify? It would make sense to match against prefix state - - // var skipOriginalFlag = ilProcessor.DeclareLocal(typeof(bool)); - var resultVariable = GetResultVariable(ilProcessor, ref patchVariables, resultParameter, targetMethod); - var stateVariable = GetStateVariable(ilProcessor, ref patchVariables, stateParameter); - - var postfixInstructions = new Collection(); - - if (resultVariable != null) - postfixInstructions.Add((OpCodes.Stloc_S, resultVariable)); - - foreach (var parameter in postfixParameters) - { - postfixInstructions.Add(GetInstructionForParameter(module, parameter, resultParameter, resultVariable, - stateParameter, stateVariable, targetMethod)); - } - - if (genericParameters != null) - { - postfixInstructions.Add((OpCodes.Call, - module.ImportMethodWithGenericArguments(postfixMethodInfo, genericParameters))); - } - else - { - postfixInstructions.Add((OpCodes.Call, postfixMethodInfo)); - } - - if (postfixMethodInfo.ReturnType == typeof(void) && resultVariable != null) - postfixInstructions.Add((OpCodes.Ldloc_S, resultVariable)); - - // TODO: use label instead of inserting multiple times - for (var i = 0; i < instructions.Count; i++) - { - if (instructions[i].OpCode != OpCodes.Ret) - continue; - - ilProcessor.InsertRange(i, postfixInstructions); - - i += postfixInstructions.Count; - } - } - - private static ITuple GetInstructionForParameter(ModuleDefinition module, ParameterInfo parameter, - ParameterInfo? resultParameter, VariableDefinition? resultVariable, ParameterInfo? stateParameter, - VariableDefinition? stateVariable, MethodDefinition targetMethod) - => parameter == resultParameter - ? (parameter.ParameterType.IsByRef ? OpCodes.Ldloca_S : OpCodes.Ldloc_S, resultVariable) - : parameter == stateParameter - ? (parameter.ParameterType.IsByRef ? OpCodes.Ldloca_S : OpCodes.Ldloc_S, stateVariable) - : GetMatchingTargetParameter(targetMethod, parameter, module); - - private static void VerifyResultParameter(ModuleDefinition module, ParameterInfo? resultParameter, - MethodDefinition targetMethod, bool requiresByRef) - { - if (resultParameter is null) - return; - - if (targetMethod.ReturnType.IsGeneric() ? !GetUnderlyingType(resultParameter.ParameterType).IsGeneric() - : !GetUnderlyingType(resultParameter.ParameterType).Is(targetMethod.ReturnType)) - { - // var firstType = targetMethod.ReturnType; - // var secondType = GetUnderlyingType(resultParameter.ParameterType); - // Log.Message($"Type FullName: {firstType.FullName - // }: ContainsGenericParameter: {firstType.ContainsGenericParameter - // }, HasGenericParameters :{firstType.HasGenericParameters - // }, IsGenericInstance: {firstType.IsGenericInstance - // }, Type FullName: {secondType.FullName - // } ContainsGenericParameters: {secondType.ContainsGenericParameters - // }, IsGenericType {secondType.IsGenericType - // }, IsConstructedGenericType: {secondType.IsConstructedGenericType}"); - - ThrowHelper.ThrowArgumentException($"__result parameter has invalid type: { - resultParameter.ParameterType.FullName}. Must match the target's return type: { - targetMethod.ReturnType.FullName}"); - } - if (requiresByRef && !resultParameter.ParameterType.IsByRef) - { - ThrowHelper.ThrowArgumentException( - "__result parameter must be declared with ref or out keyword."); - } - } - - private record struct PatchVariables - { - public VariableDefinition? Result, State; - } - - private static ITuple GetMatchingTargetParameter(MethodDefinition targetMethod, - ParameterInfo parameter, ModuleDefinition module) - { - var targetParameters = targetMethod.Parameters; - var targetParameter = parameter.Name == "__instance" - ? targetMethod.Body.ThisParameter - : targetParameters.TryGetNamed(parameter.Name); - if (targetParameter is null) - { - return ThrowHelper.ThrowArgumentException($"No parameter named { - parameter.Name} found in target method"); - } - - var targetParameterType = targetParameter.ParameterType; - var patchParameterType = parameter.ParameterType; - - return GetUnderlyingType(targetParameter).Name != GetUnderlyingType(patchParameterType).Name - ? ThrowHelper.ThrowArgumentException($"Parameter has invalid type: { - patchParameterType.FullName}. Must match the target method parameter's type: { - targetParameterType.FullName}") - : (patchParameterType.IsByRef && !targetParameter.ParameterType.IsByReference - ? OpCodes.Ldarga_S - : OpCodes.Ldarg_S, targetParameter); - } - - private static TypeReference GetUnderlyingType(ParameterInfo prefixParameter, ModuleDefinition module) - => module.ImportReference(GetUnderlyingType(prefixParameter.ParameterType)); - - private static TypeReference GetUnderlyingType(ParameterDefinition prefixParameter) - => prefixParameter.ParameterType.IsByReference ? prefixParameter.ParameterType.GetElementType()! - : prefixParameter.ParameterType; - - private static TypeDefinition ThrowForFailureToFindType(Type patchType) - => ThrowHelper.ThrowInvalidOperationException( - $"Failed to find type with namespace {patchType.Namespace} and name {patchType.Name}"); - - private static MethodDefinition ThrowForFailureToFindMethod(TypeDefinition? type, MethodBase patchMethod) - => ThrowHelper.ThrowInvalidOperationException( - $"Failed to find method with type {type} and name {patchMethod.Name}"); - - private static void ApplyClassPatch(ModuleDefinition module, FishClassPrepatch patch) - { - // ReSharper disable once NullCoalescingConditionIsAlwaysNotNullAccordingToAPIContract - var patchType = patch.Type - ?? ThrowHelper.ThrowInvalidOperationException( - $"Patch {patch.GetType().FullName} has no target type."); - - if (patchType.IsGenericType) - patchType = patchType.GetGenericTypeDefinition(); - - DebugLog.Message($"Applying prepatch {patch.GetType().FullName} on type { - patchType.FullName}"); - - var targetType = module.GetType(patchType.Namespace, patchType.Name) ?? ThrowForFailureToFindType(patchType); - - // PrepatchManager.AddSecurityAttributes(targetType.SecurityDeclarations, module); - - patch.FreePatch(targetType); - } public FishPrepatchBase this[Type type] => All[type]; diff --git a/Source/PerformanceFish/Prepatching/FishStash.cs b/Source/PerformanceFish/Prepatching/FishStash.cs index b7146f9..c734a43 100644 --- a/Source/PerformanceFish/Prepatching/FishStash.cs +++ b/Source/PerformanceFish/Prepatching/FishStash.cs @@ -3,19 +3,28 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. +using System.Linq; using System.Runtime.InteropServices; namespace PerformanceFish.Prepatching; [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] -public struct FishStash +public unsafe struct FishStash : IEquatable { - private const string ANCHOR_STRING_VALUE = "F1shSt4sh69"; + private const string ANCHOR_STRING_VALUE = "F1shSt4sh6912345"; + private const int ANCHOR_STRING_LENGTH = 16; - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 11)] - private string? _anchorString; - public UnhandledMessageQueue? UnhandledMessages; - public GCHandle MessageQueueGCHandle; + private fixed char _anchorString[ANCHOR_STRING_LENGTH]; + + internal GCHandle MessageQueueGCHandle; + + private int _activePrepatchCount; + private IntPtr _activePrepatches; + + public UnhandledMessageQueue? UnhandledMessages + => MessageQueueGCHandle != default && MessageQueueGCHandle.IsAllocated + ? Unsafe.As(MessageQueueGCHandle.Target) + : null; public static ref FishStash Get => ref StaticHandle != default @@ -29,8 +38,12 @@ public struct FishStash ?? ThrowHelper.ThrowInvalidOperationException("Failed to fetch internal FishStashHandle."); ref var stash = ref InternalFishStashHandle.Stash; - if (stash._anchorString != ANCHOR_STRING_VALUE) - ThrowHelper.ThrowInvalidDataException($"FishStash started with invalid anchor: {stash._anchorString}"); + fixed (char* anchor = stash._anchorString) + { + var anchorString = new string(anchor, 0, ANCHOR_STRING_LENGTH); + if (anchorString != ANCHOR_STRING_VALUE) + ThrowHelper.ThrowInvalidDataException($"FishStash started with invalid anchor: {anchorString}"); + } return ref stash; } @@ -41,18 +54,53 @@ public struct FishStash internal static nint StaticHandle { get; private set; } - internal static unsafe ref FishStash FromHandle(IntPtr handle) => ref Unsafe.AsRef(handle.ToPointer()); + internal static ref FishStash FromHandle(IntPtr handle) => ref Unsafe.AsRef(handle.ToPointer()); - private static unsafe void Create() + private static void Create() { + Guard.IsEqualTo(ANCHOR_STRING_VALUE.Length, ANCHOR_STRING_LENGTH); + if (StaticHandle != default) ThrowHelper.ThrowInvalidOperationException("Tried creating duplicate FishStash."); + + var handle = (FishStash*)Marshal.AllocHGlobal(sizeof(FishStash)); + Unsafe.InitBlockUnaligned(handle, 0, (uint)sizeof(FishStash)); - var handle = Marshal.AllocHGlobal(sizeof(FishStash)); - Unsafe.InitBlockUnaligned(handle.ToPointer(), 0, (uint)sizeof(FishStash)); - ((FishStash*)handle)->_anchorString = ANCHOR_STRING_VALUE; - - StaticHandle = handle; + for (var i = 0; i < ANCHOR_STRING_VALUE.Length; i++) + handle->_anchorString[i] = ANCHOR_STRING_VALUE[i]; + + StaticHandle = (nint)handle; + } + + internal void InitializeActivePrepatchIDs() + { + var activePrepatches = PerformanceFishMod.AllPrepatchClasses!.SelectMany(static patchClass + => patchClass.Patches.Where(static patch + => patch.Enabled).Select(static patch => patch.IDNumber)).ToArray(); + + var activePrepatchCount = activePrepatches.Length; + _activePrepatchCount = activePrepatchCount; + _activePrepatches = Marshal.AllocHGlobal(sizeof(int) * activePrepatchCount); + Marshal.Copy(activePrepatches, 0, _activePrepatches, activePrepatchCount); + } + + internal void Release() => Marshal.FreeHGlobal(_activePrepatches); + + internal bool IsPatchActive(FishPrepatchBase patch) + { + if (_activePrepatchCount <= 0) + return false; + + var patchID = patch.IDNumber; + + var activePrepatches = (int*)_activePrepatches; + for (var i = _activePrepatchCount; i-- > 0;) + { + if (activePrepatches[i] == patchID) + return true; + } + + return false; } static FishStash() @@ -60,4 +108,26 @@ public struct FishStash if (!Log.Ready && InternalFishStashHandle is null) Create(); } + + public override bool Equals(object? obj) => obj is FishStash stash && Equals(stash); + + public override int GetHashCode() + => HashCode.Combine(MessageQueueGCHandle.GetHashCode(), _activePrepatchCount, _activePrepatches.GetHashCode()); + + public static bool operator ==(FishStash left, FishStash right) => left.Equals(right); + + public static bool operator !=(FishStash left, FishStash right) => !(left == right); + + public bool Equals(FishStash other) + { + fixed (char* anchor = _anchorString) + { + if (anchor != other._anchorString) + return false; + } + + return MessageQueueGCHandle == other.MessageQueueGCHandle + && _activePrepatchCount == other._activePrepatchCount + && _activePrepatches == other._activePrepatches; + } } \ No newline at end of file diff --git a/Source/PerformanceFish/Prepatching/FishStashHandle.cs b/Source/PerformanceFish/Prepatching/FishStashHandle.cs index 1ee32a4..b3297b3 100644 --- a/Source/PerformanceFish/Prepatching/FishStashHandle.cs +++ b/Source/PerformanceFish/Prepatching/FishStashHandle.cs @@ -7,9 +7,9 @@ using System.Runtime.InteropServices; namespace PerformanceFish.Prepatching; -public class FishStashHandle : IDisposable +public sealed class FishStashHandle : IDisposable { - private static readonly List _allHandles = new(); + private static readonly List _allHandles = []; public ref FishStash Stash => ref FishStash.FromHandle(Handle); @@ -25,17 +25,18 @@ public class FishStashHandle : IDisposable Handle = (nint)handle; } - private void ReleaseUnmanagedResources() + private void Dispose(bool _) { + Stash.Release(); Marshal.FreeHGlobal(Handle); _allHandles.Remove(Handle); } public void Dispose() { - ReleaseUnmanagedResources(); + Dispose(true); GC.SuppressFinalize(this); } - ~FishStashHandle() => ReleaseUnmanagedResources(); + ~FishStashHandle() => Dispose(false); } \ No newline at end of file diff --git a/Source/PerformanceFish/Prepatching/PrepatchManager.cs b/Source/PerformanceFish/Prepatching/PrepatchManager.cs index 3adc290..d2fc6ce 100644 --- a/Source/PerformanceFish/Prepatching/PrepatchManager.cs +++ b/Source/PerformanceFish/Prepatching/PrepatchManager.cs @@ -4,11 +4,9 @@ // file, You can obtain one at https://mozilla.org/MPL/2.0/. extern alias nuget; -using System.Collections.Concurrent; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Security; -using System.Threading.Tasks; using Mono.Cecil; using Mono.Cecil.Cil; using Mono.Collections.Generic; @@ -66,6 +64,8 @@ public static class PrepatchManager // SetReflectionOnly(fishAssembly, previousFishValue, out _); // } + Application.logMessageReceivedThreaded -= Verse.Log.Notify_MessageReceivedThreadedInternal; + AddAttributes(module); ModifyAllTypes(module); @@ -76,9 +76,9 @@ public static class PrepatchManager _ = FishSettings.Instance; - foreach (var prepatchClass in allPrepatchClasses) - prepatchClass.Patches.PatchAll(module); + allPrepatchClasses.ApplyPatches(module); + FishStash.Get.InitializeActivePrepatchIDs(); PatchingFinished = true; stopwatch.Stop(); Verse.Log.Message($"Performance Fish finished applying prepatches in { @@ -312,7 +312,7 @@ public static class PrepatchManager debuggableAttribute.Constructor = module.ImportReference(typeof(DebuggableAttribute) - .GetConstructor(new[] { typeof(bool), typeof(bool) })); + .GetConstructor([typeof(bool), typeof(bool)])); debuggableAttribute.ConstructorArguments.Clear(); debuggableAttribute.ConstructorArguments.Add(new(module.TypeSystem.Boolean, false)); diff --git a/Source/PerformanceFish/Rendering/GenDrawPatches.cs b/Source/PerformanceFish/Rendering/GenDrawPatches.cs index a4699e9..23148bb 100644 --- a/Source/PerformanceFish/Rendering/GenDrawPatches.cs +++ b/Source/PerformanceFish/Rendering/GenDrawPatches.cs @@ -4,9 +4,9 @@ // file, You can obtain one at https://mozilla.org/MPL/2.0/. /*namespace PerformanceFish.Rendering; -public class GenDrawPatches : ClassWithFishPatches +public sealed class GenDrawPatches : ClassWithFishPatches { - public class DrawMeshNowOrLater_Patch : FishPatch + public sealed class DrawMeshNowOrLater_Patch : FishPatch { public override Delegate TargetMethodGroup { get; } = (Action)GenDraw.DrawMeshNowOrLater; @@ -26,7 +26,7 @@ public class GenDrawPatches : ClassWithFishPatches } } - public class DrawMeshNowOrLaterWithMatrix_Patch : FishPatch + public sealed class DrawMeshNowOrLaterWithMatrix_Patch : FishPatch { public override Delegate TargetMethodGroup { get; } = (Action)GenDraw.DrawMeshNowOrLater; diff --git a/Source/PerformanceFish/Rendering/GraphicPatches.cs b/Source/PerformanceFish/Rendering/GraphicPatches.cs index 31e7d6e..8479149 100644 --- a/Source/PerformanceFish/Rendering/GraphicPatches.cs +++ b/Source/PerformanceFish/Rendering/GraphicPatches.cs @@ -4,9 +4,9 @@ // file, You can obtain one at https://mozilla.org/MPL/2.0/. /*namespace PerformanceFish.Rendering; -public class GraphicPatches : ClassWithFishPatches +public sealed class GraphicPatches : ClassWithFishPatches { - public class DrawMeshInt_Patch : FishPatch + public sealed class DrawMeshInt_Patch : FishPatch { public override MethodBase TargetMethodInfo { get; } = AccessTools.DeclaredMethod(typeof(Graphic), nameof(Graphic.DrawMeshInt)); @@ -17,7 +17,7 @@ public class GraphicPatches : ClassWithFishPatches } } - public class Shadow_DrawWorker_Patch : FishPatch + public sealed class Shadow_DrawWorker_Patch : FishPatch { public override MethodBase TargetMethodInfo { get; } = AccessTools.DeclaredMethod(typeof(Graphic_Shadow), nameof(Graphic_Shadow.DrawWorker)); diff --git a/Source/PerformanceFish/Rendering/PawnCacheRendererPatches.cs b/Source/PerformanceFish/Rendering/PawnCacheRendererPatches.cs index 010e664..565276b 100644 --- a/Source/PerformanceFish/Rendering/PawnCacheRendererPatches.cs +++ b/Source/PerformanceFish/Rendering/PawnCacheRendererPatches.cs @@ -5,13 +5,13 @@ /*namespace PerformanceFish.Rendering; -public class PawnCacheRendererPatches : ClassWithFishPatches +public sealed class PawnCacheRendererPatches : ClassWithFishPatches // The PawnCacheRenderer's Camera.Render() call has a considerable performance impact despite only being used for // rendering of single pawns. These are failed attempts at lowering its impact. { private static bool _optimizeCameraEnabled; - public class OnPostRender_Patch : FishPatch + public sealed class OnPostRender_Patch : FishPatch { public override MethodBase TargetMethodInfo => AccessTools.DeclaredMethod(typeof(PawnCacheRenderer), nameof(PawnCacheRenderer.OnPostRender)); @@ -33,7 +33,7 @@ public class PawnCacheRendererPatches : ClassWithFishPatches private static int? _defaultCullinkMask; } - public class RenderPawn_Patch : FishPatch + public sealed class RenderPawn_Patch : FishPatch { public override MethodBase TargetMethodInfo => AccessTools.DeclaredMethod(typeof(PawnCacheRenderer), nameof(PawnCacheRenderer.RenderPawn)); diff --git a/Source/PerformanceFish/RoomOptimizations.cs b/Source/PerformanceFish/RoomOptimizations.cs index a5613d1..876cce2 100644 --- a/Source/PerformanceFish/RoomOptimizations.cs +++ b/Source/PerformanceFish/RoomOptimizations.cs @@ -12,14 +12,15 @@ using RoomRoleCache using ContainedAndAdjacentThingsCache = PerformanceFish.Cache.ByIndex; +using OpCodes = System.Reflection.Emit.OpCodes; namespace PerformanceFish; -public class RoomOptimizations : ClassWithFishPatches, IHasDescription +public sealed class RoomOptimizations : ClassWithFishPatches, IHasDescription { public string Description { get; } = "Room stats related optimizations"; - public class Role_Patch : FirstPriorityFishPatch + public sealed class Role_Patch : FirstPriorityFishPatch { public override string Description { get; } = "Throttles room stats and role updating to happen at most once every 512 or so ticks per room, " @@ -38,13 +39,13 @@ public class RoomOptimizations : ClassWithFishPatches, IHasDescription => i - 1 > 0 && codes[i - 1] == this_statsAndRoleDirty && codes[i].opcode == OpCodes.Brfalse_S - && codes[i].operand is Label, static code => new[] - { + && codes[i].operand is Label, static code => + [ code, FishTranspiler.This, FishTranspiler.Call(ShouldUpdate), FishTranspiler.IfFalse_Short((Label)code.operand) - }); + ]); } catch (Exception ex) { @@ -83,7 +84,7 @@ public class RoomOptimizations : ClassWithFishPatches, IHasDescription } } - public class Owners_Patch : FirstPriorityFishPatch + public sealed class Owners_Patch : FirstPriorityFishPatch { public override string Description { get; } = "Caches room owner data and throttles them to only update at most once every ~512 or so ticks. " @@ -142,7 +143,7 @@ public class RoomOptimizations : ClassWithFishPatches, IHasDescription { if (result is null) { - (Owners ??= new(0)).Clear(); + (Owners ??= []).Clear(); } else { @@ -153,7 +154,7 @@ public class RoomOptimizations : ClassWithFishPatches, IHasDescription } else { - Owners = new(result); + Owners = [..result]; } } @@ -168,7 +169,7 @@ public class RoomOptimizations : ClassWithFishPatches, IHasDescription } } - public class Regions_Patch : FirstPriorityFishPatch + public sealed class Regions_Patch : FirstPriorityFishPatch { public override string Description { get; } = "Minor optimization"; public override MethodBase TargetMethodInfo { get; } @@ -191,7 +192,7 @@ public class RoomOptimizations : ClassWithFishPatches, IHasDescription } } - public class ContainedBeds_Patch : FirstPriorityFishPatch + public sealed class ContainedBeds_Patch : FirstPriorityFishPatch { public override string Description { get; } = "So RimWorld has a list of beds and a list of all things. For some reason Ludeon chose to have " @@ -225,7 +226,7 @@ public class RoomOptimizations : ClassWithFishPatches, IHasDescription } } - public class ContainedAndAdjacentThings_Patch : FirstPriorityFishPatch + public sealed class ContainedAndAdjacentThings_Patch : FirstPriorityFishPatch { public override string Description { get; } = "Caching of room content info. Variable impact"; @@ -279,7 +280,7 @@ public class RoomOptimizations : ClassWithFishPatches, IHasDescription var uniqueContainedThings = instance.uniqueContainedThings; var uniqueContainedThingsSet = instance.uniqueContainedThingsSet; uniqueContainedThingsSet.Clear(); - (cache.ListVersions ??= new()).Clear(); + (cache.ListVersions ??= []).Clear(); for (var i = 0; i < regions.Count; i++) { @@ -301,7 +302,7 @@ public class RoomOptimizations : ClassWithFishPatches, IHasDescription if (cache.Things is { } list) list.ReplaceContentsWith(uniqueContainedThings); else - cache.Things = new(uniqueContainedThings); + cache.Things = [..uniqueContainedThings]; cache.SetDirty(false, instance); @@ -333,7 +334,7 @@ public class RoomOptimizations : ClassWithFishPatches, IHasDescription var count = allThings.Count; for (var j = 0; j < count; j++) { - if (regionGrid[CellIndicesUtility.CellToIndex(allThings[j].Position, mapSizeX)] == region) + if (regionGrid[allThings[j].Position.CellToIndex(mapSizeX)] == region) uniqueContainedThings.Add(allThings[j]); else adjacentThings.Add(allThings[j]); @@ -376,7 +377,7 @@ public class RoomOptimizations : ClassWithFishPatches, IHasDescription } } - public class RoomAt_Patch : FirstPriorityFishPatch + public sealed class RoomAt_Patch : FirstPriorityFishPatch { public override string? Description { get; } = "Minor optimization through inlining ond cleaning up of duplicate calls in the method. About 1/4 " @@ -390,8 +391,8 @@ public class RoomOptimizations : ClassWithFishPatches, IHasDescription [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Room? RoomAt(IntVec3 c, Map map, RegionType allowedRegionTypes = RegionType.Set_All) { - var mapSize = map.info.Size; - if ((uint)c.x >= (uint)mapSize.x || (uint)c.z >= (uint)mapSize.z) + var cellIndices = map.cellIndices; + if (((uint)c.x >= (uint)cellIndices.mapSizeX) | ((uint)c.z >= (uint)cellIndices.mapSizeZ)) return null; var regionAndRoomUpdater = map.regionAndRoomUpdater; @@ -401,11 +402,11 @@ public class RoomOptimizations : ClassWithFishPatches, IHasDescription } else if (regionAndRoomUpdater.AnythingToRebuild) { - Log.Warning($"Trying to get valid region at { - c.ToString()} but RegionAndRoomUpdater is disabled. The result may be incorrect."); + Verse.Log.Warning($"Trying to get valid region at { + c.ToString()} but RegionAndRoomUpdater is disabled. The result may be incorrect."); } - var region = map.regionGrid.regionGrid[(c.z * mapSize.x) + c.x]; + var region = map.regionGrid.regionGrid[(c.z * cellIndices.mapSizeX) + c.x]; return region is null || !region.valid || (region.type & allowedRegionTypes) == 0 ? null : region.District?.Room; diff --git a/Source/PerformanceFish/StoreUtilityPatches.cs b/Source/PerformanceFish/StoreUtilityPatches.cs deleted file mode 100644 index 7a6d8ab..0000000 --- a/Source/PerformanceFish/StoreUtilityPatches.cs +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright (c) 2023 bradson -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at https://mozilla.org/MPL/2.0/. - -namespace PerformanceFish; - -public class StoreUtilityPatches : ClassWithFishPatches -{ - public class IsInValidBestStorage_Patch : FishPatch - { - public override string Description { get; } - = "Patches IsInValidBestStorage to immediately remove things from haulables when they're found to be in " - + "the best storage. Default often has them checked several more times before removal happens"; - - public override Delegate TargetMethodGroup { get; } = StoreUtility.IsInValidBestStorage; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void Postfix(Thing t, bool __result) - { - if (__result) - { - t.Map.listerHaulables.TryRemove(t); - } - /*else if (!t.IsInValidStorage()) - { - if (!StoreUtility.TryFindBestBetterStorageFor(t, null, t.Map, StoragePriority.Unstored, - Faction.OfPlayerSilentFail, out IntVec3 _, out IHaulDestination _, needAccurateResult: false)) - { - - } - }*/ - } - } - -#if threadingEnabled - public class IsGoodStoreCell_Patch : FishPatch - { - protected IsGoodStoreCell_Patch() => FishSettings.ThreadingPatches.Add(this); - public override bool DefaultState => false; - - public override string Description { get; } - = "Lock for threading. Only needed with threading enabled and off by default"; - - public override Delegate TargetMethodGroup { get; } = StoreUtility.IsGoodStoreCell; - - public static void Prefix() - { - if (FishSettings.ThreadingEnabled) - Monitor.Enter(Lock); - } - - public static Exception Finalizer(Exception __exception) - { - if (FishSettings.ThreadingEnabled) - Monitor.Exit(Lock); - return __exception; - } - - private static object Lock { get; } = new(); - } - - public class GetStatValue_Patch : FishPatch - { - protected GetStatValue_Patch() => FishSettings.ThreadingPatches.Add(this); - public override bool DefaultState => false; - - public override string Description { get; } - = "Lock for threading. Only needed with threading enabled and off by default"; - - public override Delegate TargetMethodGroup { get; } = StatExtension.GetStatValue; - - public static void Prefix() - { - if (FishSettings.ThreadingEnabled) - Monitor.Enter(Lock); - } - - public static Exception Finalizer(Exception __exception) - { - if (FishSettings.ThreadingEnabled) - Monitor.Exit(Lock); - return __exception; - } - - private static object Lock { get; } = new(); - } -#endif -} \ No newline at end of file diff --git a/Source/PerformanceFish/System/EqualityComparerOptimization.cs b/Source/PerformanceFish/System/EqualityComparerOptimization.cs index 5f0391b..3d509b3 100644 --- a/Source/PerformanceFish/System/EqualityComparerOptimization.cs +++ b/Source/PerformanceFish/System/EqualityComparerOptimization.cs @@ -4,14 +4,15 @@ // file, You can obtain one at https://mozilla.org/MPL/2.0/. using System.Collections.Concurrent; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Threading.Tasks; namespace PerformanceFish.System; -public class EqualityComparerOptimization : ClassWithFishPatches +public sealed class EqualityComparerOptimization : ClassWithFishPatches { - public class Optimization : FishPatch + public sealed class Optimization : FishPatch { public override string? Description { get; } = "Specialized EqualityComparers for slightly faster collection lookups on ValueTypes. Can reduce memory " @@ -74,7 +75,7 @@ public class EqualityComparerOptimization : ClassWithFishPatches } [Serializable] -public class EquatableValueTypeEqualityComparer : EqualityComparer where T : struct, IEquatable +public sealed class EquatableValueTypeEqualityComparer : EqualityComparer where T : struct, IEquatable { [MethodImpl(MethodImplOptions.AggressiveInlining)] public override bool Equals(T x, T y) => x.Equals(y); @@ -85,71 +86,73 @@ public class EquatableValueTypeEqualityComparer : EqualityComparer where T /// /// Equals method for the comparer itself. /// - public override bool Equals(object obj) => obj is EquatableValueTypeEqualityComparer; + public override bool Equals(object? obj) => obj is EquatableValueTypeEqualityComparer; public override int GetHashCode() => GetType().Name.GetHashCode(); } [Serializable] -public class EquatableNullableEqualityComparer : EqualityComparer where T : struct, IEquatable +public sealed class EquatableNullableEqualityComparer : EqualityComparer where T : struct, IEquatable { [MethodImpl(MethodImplOptions.AggressiveInlining)] public override bool Equals(T? x, T? y) => x.HasValue - ? y.HasValue && x.Value.Equals(y.Value) + ? y.HasValue && x.GetValueOrDefault().Equals(y.GetValueOrDefault()) : !y.HasValue; [MethodImpl(MethodImplOptions.AggressiveInlining)] - public override int GetHashCode(T? obj) => !obj.HasValue ? 0 : HashCode.Get(obj); + public override int GetHashCode(T? obj) => !obj.HasValue ? 0 : HashCode.Get(obj.GetValueOrDefault()); /// /// Equals method for the comparer itself. /// - public override bool Equals(object obj) => obj is EquatableNullableEqualityComparer; + public override bool Equals(object? obj) => obj is EquatableNullableEqualityComparer; public override int GetHashCode() => GetType().Name.GetHashCode(); } [Serializable] -public class NullableEqualityComparer : EqualityComparer where T : struct +public sealed class NullableEqualityComparer : EqualityComparer where T : struct { [MethodImpl(MethodImplOptions.AggressiveInlining)] public override bool Equals(T? x, T? y) => x.HasValue - ? y.HasValue && x.Value.Equals(y.Value) + ? y.HasValue && x.GetValueOrDefault().Equals(y.GetValueOrDefault()) : !y.HasValue; [MethodImpl(MethodImplOptions.AggressiveInlining)] - public override int GetHashCode(T? obj) => !obj.HasValue ? 0 : HashCode.Get(obj); + public override int GetHashCode(T? obj) => !obj.HasValue ? 0 : HashCode.Get(obj.GetValueOrDefault()); /// /// Equals method for the comparer itself. /// - public override bool Equals(object obj) => obj is NullableEqualityComparer; + public override bool Equals(object? obj) => obj is NullableEqualityComparer; public override int GetHashCode() => GetType().Name.GetHashCode(); } [Serializable] -public class StringEqualityComparer : EqualityComparer +public sealed class StringEqualityComparer : EqualityComparer { [MethodImpl(MethodImplOptions.AggressiveInlining)] - public override bool Equals(string x, string y) + [SuppressMessage("Globalization", "CA1307")] + [SuppressMessage("Globalization", "CA1309")] + public override bool Equals(string? x, string? y) => string.Equals(x, y); // already does a null check, so this skips the extra check that'd otherwise happen [MethodImpl(MethodImplOptions.AggressiveInlining)] - public override int GetHashCode(string obj) => obj.GetHashCode(); + public override int GetHashCode(string? obj) => obj?.GetHashCode() ?? 0; /// /// Equals method for the comparer itself. /// - public override bool Equals(object obj) => obj is StringEqualityComparer; + public override bool Equals(object? obj) => obj is StringEqualityComparer; public override int GetHashCode() => GetType().Name.GetHashCode(); } [Serializable] -public class IntEqualityComparer : EqualityComparer +public sealed class IntEqualityComparer : EqualityComparer { [MethodImpl(MethodImplOptions.AggressiveInlining)] public override bool Equals(int x, int y) => x == y; @@ -160,13 +163,13 @@ public class IntEqualityComparer : EqualityComparer /// /// Equals method for the comparer itself. /// - public override bool Equals(object obj) => obj is IntEqualityComparer; + public override bool Equals(object? obj) => obj is IntEqualityComparer; public override int GetHashCode() => GetType().Name.GetHashCode(); } [Serializable] -public class UshortEqualityComparer : EqualityComparer +public sealed class UshortEqualityComparer : EqualityComparer { [MethodImpl(MethodImplOptions.AggressiveInlining)] public override bool Equals(ushort x, ushort y) => x == y; @@ -177,13 +180,13 @@ public class UshortEqualityComparer : EqualityComparer /// /// Equals method for the comparer itself. /// - public override bool Equals(object obj) => obj is UshortEqualityComparer; + public override bool Equals(object? obj) => obj is UshortEqualityComparer; public override int GetHashCode() => GetType().Name.GetHashCode(); } [Serializable] -public class ReferenceEqualityComparer : EqualityComparer +public sealed class ReferenceEqualityComparer : EqualityComparer { public new static readonly ReferenceEqualityComparer Default = new(); @@ -196,13 +199,13 @@ public class ReferenceEqualityComparer : EqualityComparer /// /// Equals method for the comparer itself. /// - public override bool Equals(object obj) => obj is ReferenceEqualityComparer; + public override bool Equals(object? obj) => obj is ReferenceEqualityComparer; public override int GetHashCode() => GetType().Name.GetHashCode(); } [Serializable] -public class ValueTypeEqualityComparer : EqualityComparer where T : struct +public sealed class ValueTypeEqualityComparer : EqualityComparer where T : struct { public new static readonly ValueTypeEqualityComparer Default = new(); @@ -215,7 +218,7 @@ public class ValueTypeEqualityComparer : EqualityComparer where T : struct /// /// Equals method for the comparer itself. /// - public override bool Equals(object obj) => obj is ReferenceEqualityComparer; + public override bool Equals(object? obj) => obj is ReferenceEqualityComparer; public override int GetHashCode() => GetType().Name.GetHashCode(); } \ No newline at end of file diff --git a/Source/PerformanceFish/System/ReflectionCaching.cs b/Source/PerformanceFish/System/ReflectionCaching.cs index 614f60a..c99a38e 100644 --- a/Source/PerformanceFish/System/ReflectionCaching.cs +++ b/Source/PerformanceFish/System/ReflectionCaching.cs @@ -3,13 +3,13 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. -using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Reflection.Emit; using System.Runtime.InteropServices; using System.Security; using System.Threading.Tasks; using PerformanceFish.Cache; +using PerformanceFish.ModCompatibility; using ConstructorInfoCache = PerformanceFish.Cache.ByReference, @@ -49,14 +49,14 @@ using TypeFullNameCache using ActivatorCache = PerformanceFish.Cache.ByReferenceUnclearable; -using ActivatorWithArgumentsCache - = PerformanceFish.Cache.ByReference, - PerformanceFish.System.ReflectionCaching.ActivatorPatches.ActivatorCacheValue>; +// using ActivatorWithArgumentsCache +// = PerformanceFish.Cache.ByReference, +// PerformanceFish.System.ReflectionCaching.ActivatorPatches.ActivatorCacheValue>; namespace PerformanceFish.System; -public class ReflectionCaching : ClassWithFishPatches +public sealed class ReflectionCaching : ClassWithFishPatches { static ReflectionCaching() // necessary to prevent recursion between patches and function pointer creation { @@ -85,15 +85,15 @@ public class ReflectionCaching : ClassWithFishPatches public BindingFlags Flags; } - public class TypePatches + public sealed class TypePatches { - public class GetField_Patch : FishPatch + public sealed class GetField_Patch : FishPatch { public override string Description { get; } = "Caches GetField lookups"; public override MethodBase TargetMethodInfo { get; } = AccessTools.Method(typeof(RuntimeType), nameof(RuntimeType.GetField), - new[] { typeof(string), typeof(BindingFlags) })!; + [typeof(string), typeof(BindingFlags)])!; [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool Prefix(Type __instance, string name, BindingFlags bindingAttr, out FieldInfo? __result, @@ -132,11 +132,12 @@ public class ReflectionCaching : ClassWithFishPatches = __result; } - public class GetMethodWithFlags_Patch : FishPatch + public sealed class GetMethodWithFlags_Patch : FishPatch { public override string Description { get; } = "Caches GetMethod lookups"; public override Expression TargetMethod { get; } + // ReSharper disable once ReturnValueOfPureMethodIsNotUsed = static () => default(Type)!.GetMethod(null!, default(BindingFlags)); [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -168,11 +169,12 @@ public class ReflectionCaching : ClassWithFishPatches = __result; } - public class GetMethodWithTypes_Patch : FishPatch + public sealed class GetMethodWithTypes_Patch : FishPatch { public override string Description { get; } = "Caches GetMethod lookups"; public override Expression TargetMethod { get; } + // ReSharper disable once ReturnValueOfPureMethodIsNotUsed = static () => default(Type)!.GetMethod(null!, null!); [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -201,7 +203,7 @@ public class ReflectionCaching : ClassWithFishPatches = __result; } - public class GetMethodWithFlagsAndTypes_Patch : FishPatch + public sealed class GetMethodWithFlagsAndTypes_Patch : FishPatch { public override string Description { get; } = "Caches GetMethod lookups"; @@ -244,7 +246,7 @@ public class ReflectionCaching : ClassWithFishPatches new(types)).Info = __result; } - public class GetConstructor_Patch : FishPatch + public sealed class GetConstructor_Patch : FishPatch { public override string Description { get; } = "Caches GetConstructor lookups"; @@ -285,11 +287,12 @@ public class ReflectionCaching : ClassWithFishPatches = __result; } - public class GetProperty_Patch : FishPatch + public sealed class GetProperty_Patch : FishPatch { public override string Description { get; } = "Caches GetProperty lookups"; public override Expression TargetMethod { get; } + // ReSharper disable once ReturnValueOfPureMethodIsNotUsed = static () => default(Type)!.GetProperty(null!, default(BindingFlags)); [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -322,7 +325,7 @@ public class ReflectionCaching : ClassWithFishPatches = __result; } - public class GetFullName : FishPatch + public sealed class GetFullName : FishPatch { public override string? Description { get; } = "Normally averages at over 1000ns per call. Caching makes this about 30 times faster, including " @@ -354,7 +357,6 @@ public class ReflectionCaching : ClassWithFishPatches ref var centralCache = ref TypeFullNameCache.GetDirectly.GetOrAddReference(instance.TypeHandle); cache.Name = centralCache.Name; - // cache.Cached = centralCache.Cached; } return cache.Cached; @@ -374,14 +376,12 @@ public class ReflectionCaching : ClassWithFishPatches { ref var cache = ref TypeFullNameCache.GetExistingReference(__instance.TypeHandle); cache.Name = __result; - // cache.Cached = 1; lock (_lock) { ref var centralCache = ref TypeFullNameCache.GetDirectly.GetReference(__instance.TypeHandle); centralCache.Name = __result; - // centralCache.Cached = 1; } } @@ -390,6 +390,7 @@ public class ReflectionCaching : ClassWithFishPatches // probably never actually needed [MethodImpl(MethodImplOptions.AggressiveInlining)] + [SuppressMessage("Globalization", "CA1308")] private static string ToLowerIfNeededForBindingFlags(string name, BindingFlags bindingAttr) => (bindingAttr & BindingFlags.IgnoreCase) != 0 ? name.ToLowerInvariant() : name; @@ -436,9 +437,9 @@ public class ReflectionCaching : ClassWithFishPatches } } - public class MonoCustomAttrs + public sealed class MonoCustomAttrs { - public class GetCustomAttributes : FishPatch + public sealed class GetCustomAttributes : FishPatch { public override string? Description { get; } = "Caches attributes for reflection lookups. Decent load time improvement."; @@ -544,18 +545,24 @@ public class ReflectionCaching : ClassWithFishPatches => _hashCode; } - public class ActivatorPatches + public sealed class ActivatorPatches { - public class CreateInstance_Type : FishPatch + public sealed class CreateInstance_Type : FishPatch { + public override List IncompatibleModIDs { get; } = [PackageIDs.MULTIPLAYER]; + public override string? Description { get; } = "Optimizes the parameterless Activator.CreateInstance method by invoking through specialized cached " + "delegates"; public override Delegate? TargetMethodGroup { get; } = (Func)Activator.CreateInstance; - public static bool Prefix(Type type, ref object __result) + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool Prefix(Type? type, ref object __result) { + if (type is null) + return true; + ref var cache = ref ActivatorCache.GetOrAddReference(type.TypeHandle); if (cache.Dirty @@ -570,7 +577,7 @@ public class ReflectionCaching : ClassWithFishPatches } } - // public class CreateInstance_Type_Args : FishPatch + // public sealed class CreateInstance_Type_Args : FishPatch // { // public override Delegate? TargetMethodGroup { get; } // = (Func)Activator.CreateInstance; @@ -669,9 +676,9 @@ public class ReflectionCaching : ClassWithFishPatches // } // } - public class FieldInfoPatches + public sealed class FieldInfoPatches { - public class GetValue_Patch : FishPatch + public sealed class GetValue_Patch : FishPatch { public override string Description { get; } = "Optimizes the GetValue method by invoking it through specialized cached delegates"; @@ -705,7 +712,7 @@ public class ReflectionCaching : ClassWithFishPatches } } - public class SetValue_Patch : FishPatch + public sealed class SetValue_Patch : FishPatch { public override string Description { get; } = "Optimizes the SetValue method by invoking it through specialized cached delegates"; @@ -718,29 +725,45 @@ public class ReflectionCaching : ClassWithFishPatches { ref var cache = ref FieldSetters.GetOrAddReference(__instance.FieldHandle); - if (cache.Dirty - && !FieldSetters.UpdateAsyncCache(ref cache, - __instance.FieldHandle, __instance)) - { + if (cache.Dirty && !TryUpdate(__instance, ref cache)) return true; - } cache.Result!(obj, value); return false; } + + [MethodImpl(MethodImplOptions.NoInlining)] + private static bool TryUpdate(FieldInfo __instance, ref FieldInfoSetterCache cache) + => cache.Task != _fieldSetterFailureTask && __instance.IsConst() + ? ErrorForInvalidCallAttempt(__instance, ref cache) + : FieldSetters.UpdateAsyncCache(ref cache, + __instance.FieldHandle, __instance); + + [MethodImpl(MethodImplOptions.NoInlining)] + private static bool ErrorForInvalidCallAttempt(FieldInfo info, ref FieldInfoSetterCache cache) + { + cache.Task = _fieldSetterFailureTask; + Log.Error($"FieldInfo.SetValue has been called on '{ + info.FullDescription()}'. This is a const that gets copied at compile time. An attempt at " + + $"setting a value will always fail."); + + return false; + } } + private static Task _fieldSetterFailureTask = new(static () => null!); + public static FieldGetter? MakeGetterDelegate(FieldInfo info) { try { - var dm = new DynamicMethod($"FieldGetter_{info.Name}", typeof(object), new[] { typeof(object) }, + var dm = new DynamicMethod($"FieldGetter_{info.Name}", typeof(object), [typeof(object)], GetOwnerType(info), true); var il = dm.GetILGenerator(); TryEmitFieldInstanceArgument(il, info); - il.Emit(info is { IsLiteral: true, IsInitOnly: false } + il.Emit(info.IsConst() ? FishTranspiler.Constant(info.GetRawConstantValue()) : FishTranspiler.Field(info)); @@ -755,7 +778,7 @@ public class ReflectionCaching : ClassWithFishPatches { Log.Error($"PerformanceFish failed to generate an optimized delegate for { info.FullDescription()}. Reverting to default behaviour instead.\n{ex}\n{ - new StackTrace() /*StackTraceUtility.ExtractStackTrace()*/}"); + Environment.StackTrace}"); return null; } } @@ -765,7 +788,7 @@ public class ReflectionCaching : ClassWithFishPatches try { var dm = new DynamicMethod($"FieldSetter_{info.Name}", typeof(void), - new[] { typeof(object), typeof(object) }, GetOwnerType(info), true); + [typeof(object), typeof(object)], GetOwnerType(info), true); var il = dm.GetILGenerator(); TryEmitFieldInstanceArgument(il, info); @@ -776,18 +799,17 @@ public class ReflectionCaching : ClassWithFishPatches { il.Emit(FishTranspiler.Call(typeof(ReflectionCaching), info.FieldType.IsNullable() ? nameof(UnboxNullableSafely) : nameof(UnboxSafely), - new[] { typeof(object) }, - new[] - { + [typeof(object)], + [ info.FieldType.IsNullable() // TODO: verify that this is actually correct ? Nullable.GetUnderlyingType(info.FieldType) : info.FieldType - })); + ])); } else { il.Emit(FishTranspiler.Call(typeof(ReflectionCaching), nameof(CastOrConvert), - generics: new[] { info.FieldType })); + generics: [info.FieldType])); } il.Emit(FishTranspiler.StoreField(info)); @@ -800,7 +822,7 @@ public class ReflectionCaching : ClassWithFishPatches { Log.Error($"PerformanceFish failed to generate an optimized delegate for { info.FullDescription()}. Reverting to default behaviour instead.\n{ex}\n{ - new StackTrace() /*StackTraceUtility.ExtractStackTrace()*/}"); + Environment.StackTrace}"); return null; } } @@ -839,9 +861,9 @@ public class ReflectionCaching : ClassWithFishPatches public delegate void FieldSetter(object? obj, object? value); } - public class MethodBasePatches + public sealed class MethodBasePatches { - public class Invoke_Patch : FishPatch + public sealed class Invoke_Patch : FishPatch { public override bool DefaultState => false; // TODO: fix @@ -885,6 +907,7 @@ public class ReflectionCaching : ClassWithFishPatches } // Similar to HarmonyLib.MethodInvoker, but correctly handles a couple of edge cases Harmony would throw on. + [SuppressMessage("Globalization", "CA1310")] public static MethodInvoker? MakeInvokeDelegate(MethodBase methodBase) { if (methodBase.DeclaringType is null && methodBase.Name.StartsWith("PadMethod")) @@ -902,7 +925,7 @@ public class ReflectionCaching : ClassWithFishPatches return null; var dm = new DynamicMethod($"MethodInvoker_{methodBase.Name}", typeof(object), - new[] { typeof(object), typeof(object[]) }, + [typeof(object), typeof(object[])], GetOwnerType(methodBase), true); var il = dm.GetILGenerator(); @@ -937,7 +960,7 @@ public class ReflectionCaching : ClassWithFishPatches { Log.Warning($"PerformanceFish failed to generate an optimized delegate for { Reflection.FullDescription(methodBase)}. Reverting to default behaviour instead.\n{ex}\n{ - new StackTrace() /*StackTraceUtility.ExtractStackTrace()*/}"); + Environment.StackTrace}"); return null; } } @@ -961,15 +984,14 @@ public class ReflectionCaching : ClassWithFishPatches il.Emit(parameterType.IsValueType ? FishTranspiler.Call(typeof(ReflectionCaching), parameterType.IsNullable() ? nameof(UnboxNullableSafely) : nameof(UnboxSafely), - new[] { typeof(object) }, - new[] - { + [typeof(object)], + [ parameterType.IsNullable() ? Nullable.GetUnderlyingType(parameterType) : parameterType - }) + ]) : FishTranspiler.Call(typeof(ReflectionCaching), nameof(CastOrConvert), - generics: new[] { parameterType })); + generics: [parameterType])); } private static void EmitInvokeByRefParameterLoad(ILGenerator il, Type parameterType) @@ -981,7 +1003,7 @@ public class ReflectionCaching : ClassWithFishPatches if (parameterType.IsNullable()) { il.Emit(FishTranspiler.Call(typeof(ReflectionCaching), nameof(VerifyNullableBoxObject), - generics: new[] { Nullable.GetUnderlyingType(parameterType) })); + generics: [Nullable.GetUnderlyingType(parameterType)])); il.Emit(FishTranspiler.UnboxAddress(parameterType)); } @@ -989,16 +1011,13 @@ public class ReflectionCaching : ClassWithFishPatches { il.Emit(parameterType.IsValueType ? FishTranspiler.Call(typeof(ReflectionCaching), nameof(UnboxRefSafely), - // new[] { typeof(object).MakeByRefType() }, - generics: new[] - { + generics: + [ /*parameterType.IsNullable() ? Nullable.GetUnderlyingType(parameterType) :*/ parameterType - }) - : FishTranspiler.Call(typeof(ReflectionCaching), nameof(CastRefSafely), - // new[] { typeof(object).MakeByRefType() }, - generics: new[] { parameterType })); + ]) + : FishTranspiler.Call(typeof(ReflectionCaching), nameof(CastRefSafely), generics: [parameterType])); } } @@ -1022,14 +1041,12 @@ public class ReflectionCaching : ClassWithFishPatches if (declaringType.IsValueType) { il.Emit(FishTranspiler.ArgumentAddress(0)); - il.Emit(FishTranspiler.Call(typeof(ReflectionCaching), nameof(UnboxRefSafely), - generics: new[] { declaringType })); + il.Emit(FishTranspiler.Call(typeof(ReflectionCaching), nameof(UnboxRefSafely), generics: [declaringType])); } else { il.Emit(FishTranspiler.This); - il.Emit(FishTranspiler.Call(typeof(ReflectionCaching), nameof(CastOrConvert), - generics: new[] { declaringType })); + il.Emit(FishTranspiler.Call(typeof(ReflectionCaching), nameof(CastOrConvert), generics: [declaringType])); } } diff --git a/Source/PerformanceFish/TextureLoadingPatches.cs b/Source/PerformanceFish/TextureLoadingPatches.cs index 22b1fa8..d6f0619 100644 --- a/Source/PerformanceFish/TextureLoadingPatches.cs +++ b/Source/PerformanceFish/TextureLoadingPatches.cs @@ -6,17 +6,17 @@ using System.IO; using Mono.Cecil; using Mono.Cecil.Cil; -using PerformanceFish.Pools; +using FisheryLib.Pools; using PerformanceFish.Prepatching; using RimWorld.IO; namespace PerformanceFish; -public class TextureLoadingPatches : ClassWithFishPrepatches +public sealed class TextureLoadingPatches : ClassWithFishPrepatches { public const string DDS_EXTENSION = ".dds"; - public class ModContentLoader_StaticConstructor : FishPrepatch + public sealed class ModContentLoader_StaticConstructor : FishPrepatch { public override string? Description { get; } = "Adds .dds to the accepted extensions for texture loading. Those files load faster than png, render at " @@ -30,7 +30,7 @@ public class TextureLoadingPatches : ClassWithFishPrepatches = ModContentLoader.AcceptableExtensionsTexture.Add(DDS_EXTENSION); } - public class ModContentLoader_LoadItem : FishPrepatch + public sealed class ModContentLoader_LoadItem : FishPrepatch { public override string? Description { get; } = "Adds .dds to the accepted extensions for texture loading. Those files load faster than png, render at " @@ -52,7 +52,7 @@ public class TextureLoadingPatches : ClassWithFishPrepatches } } - public class ModContentLoader_LoadTexture : FishPrepatch + public sealed class ModContentLoader_LoadTexture : FishPrepatch { public override string? Description { get; } = "Adds .dds to the accepted extensions for texture loading. Those files load faster than png, render at " @@ -146,7 +146,7 @@ public class TextureLoadingPatches : ClassWithFishPrepatches public static FileInfo? GetFileInfo(VirtualFile file) => file is FilesystemFile systemFile ? systemFile.fileInfo : null; - public class GetAllFilesForModPatch : FishPrepatch + public sealed class GetAllFilesForModPatch : FishPrepatch { public override string? Description { get; } = "Adds .dds to the accepted extensions for texture loading. Those files load faster than png, render at " @@ -162,7 +162,7 @@ public class TextureLoadingPatches : ClassWithFishPrepatches && method.DeclaringType.Name == "Dictionary`2"); ilProcessor.instructions[index].Operand = module.ImportReference(AccessTools.Constructor( - typeof(Dictionary), new[] { typeof(IEqualityComparer) })); + typeof(Dictionary), [typeof(IEqualityComparer)])); ilProcessor.InsertAt(index, OpCodes.Call, AccessTools.PropertyGetter(typeof(StringComparer), nameof(StringComparer.OrdinalIgnoreCase))); } diff --git a/Source/PerformanceFish/ThingCompCaching.cs b/Source/PerformanceFish/ThingCompCaching.cs index 1c4685b..2cb7e74 100644 --- a/Source/PerformanceFish/ThingCompCaching.cs +++ b/Source/PerformanceFish/ThingCompCaching.cs @@ -9,11 +9,15 @@ using IdeoForbidsCache namespace PerformanceFish; -public class ThingCompCaching : ClassWithFishPatches +public sealed class ThingCompCaching : ClassWithFishPatches { - public class CompAssignableToPawn_Bed_Patch : FishPatch + public sealed class CompAssignableToPawn_Bed_Patch : FishPatch { - public override string Description { get; } = "Caches results of CompAssignableToPawn_Bed.IdeoligionForbids"; + public override string Description { get; } + = "Caches results of CompAssignableToPawn_Bed.IdeoligionForbids" + .AppendWhen(!ModsConfig.IdeologyActive, ". Requires Ideology"); + + public override bool Enabled => base.Enabled && ModsConfig.IdeologyActive; public override MethodBase TargetMethodInfo { get; } = AccessTools.Method(typeof(CompAssignableToPawn_Bed), nameof(CompAssignableToPawn_Bed.IdeoligionForbids)); @@ -21,7 +25,7 @@ public class ThingCompCaching : ClassWithFishPatches [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool Prefix(CompAssignableToPawn_Bed __instance, Pawn? pawn, ref bool __result, out bool __state) { - if (pawn is null) + if (pawn is null || __instance.Props.maxAssignedPawnsCount == 1) { __state = false; return true; @@ -54,16 +58,16 @@ public class ThingCompCaching : ClassWithFishPatches public record struct IdeoForbidsCacheValue { public bool Result; - private int _nextRefreshTick; - private int _assignedPawnsVersion; - private int _directRelationsVersion; - private List _assignedPawns; - private List _directRelations; + private int _nextRefreshTick = -2; + private int _assignedPawnsVersion = -2; + private int _directRelationsVersion = -2; + private List _assignedPawns = _nullPawns; + private List _directRelations = _nullRelations; public void Update(CompAssignableToPawn_Bed comp, Pawn pawn, bool result) { - _directRelations = pawn.relations.DirectRelations; - _assignedPawns = comp.assignedPawns; + _directRelations = pawn.relations?.DirectRelations ?? _nullRelations; + _assignedPawns = comp.assignedPawns ?? _nullPawns; _directRelationsVersion = _directRelations._version; Result = result; _assignedPawnsVersion = _assignedPawns._version; @@ -78,5 +82,12 @@ public class ThingCompCaching : ClassWithFishPatches || _assignedPawnsVersion != _assignedPawns._version || _directRelationsVersion != _directRelations._version; } + + private static readonly List _nullRelations = []; + private static readonly List _nullPawns = []; + + public IdeoForbidsCacheValue() + { + } } } \ No newline at end of file diff --git a/Source/PerformanceFish/ThingFilterPatches.cs b/Source/PerformanceFish/ThingFilterPatches.cs index 32dde8d..1ed9a5a 100644 --- a/Source/PerformanceFish/ThingFilterPatches.cs +++ b/Source/PerformanceFish/ThingFilterPatches.cs @@ -6,14 +6,15 @@ global using AllowedDefsListCache = PerformanceFish.Cache.ByReference; +using System.Linq; using PerformanceFish.Cache; namespace PerformanceFish; -public class ThingFilterPatches : ClassWithFishPatches +public sealed class ThingFilterPatches : ClassWithFishPatches { public override bool RequiresLoadedGameForPatching => true; - /*public class Allows_Patch : FishPatch + /*public sealed class Allows_Patch : FishPatch { public override Expression TargetMethod { get; } = static () => new ThingFilter().Allows(null as Thing); @@ -55,7 +56,7 @@ public class ThingFilterPatches : ClassWithFishPatches } }*/ - public class AllowedThingDefs_Patch : FishPatch + public sealed class AllowedThingDefs_Patch : FishPatch { public override string Description { get; } = "Small optimization. Returns a list instead of hashset for better performance when enumerating"; @@ -70,29 +71,31 @@ public class ThingFilterPatches : ClassWithFishPatches => Reflection.GetCodeInstructions(Replacement); } - public class AllStorableThingDefs_Patch : FishPatch + public sealed class AllStorableThingDefs_Patch : FishPatch { public override string Description { get; } = "Small optimization"; public override MethodBase TargetMethodInfo { get; } = AccessTools.PropertyGetter(typeof(ThingFilter), nameof(ThingFilter.AllStorableThingDefs)); - public static IEnumerable Replacement() - { - var allDefs = DefDatabase.defsList; - var count = allDefs.Count; - for (var i = 0; i < count; i++) - { - if (allDefs[i].EverStorable(true)) - yield return allDefs[i]; - } - } + public static ThingDef[]? AllStorableThingDefsCache; + + public static IEnumerable Replacement() => AllStorableThingDefsCache ?? Update(); + + [MethodImpl(MethodImplOptions.NoInlining)] + private static IEnumerable Update() + => Current.ProgramState != ProgramState.Playing + ? Original() + : AllStorableThingDefsCache = Original().ToArray(); + + public static IEnumerable Original() + => DefDatabase.AllDefs.Where(static def => def.EverStorable(true)); public static CodeInstructions Transpiler(CodeInstructions codes) => Reflection.MakeReplacementCall(Replacement); } - public class CopyAllowancesFrom_Patch : FirstPriorityFishPatch + public sealed class CopyAllowancesFrom_Patch : FirstPriorityFishPatch { public override string Description { get; } = "Used by the WorkGiver_DoBill patch to allow for faster refreshing of its cache"; @@ -109,7 +112,7 @@ public class ThingFilterPatches : ClassWithFishPatches } } - public class SetAllow_Patch : FishPatch + public sealed class SetAllow_Patch : FishPatch { public override string Description { get; } = "Used by the WorkGiver_DoBill patch to allow for faster refreshing of its cache"; @@ -149,7 +152,7 @@ public class ThingFilterPatches : ClassWithFishPatches private static int ComparerMethod(ThingDef a, ThingDef b) => a.BaseMarketValue.CompareTo(b.BaseMarketValue); } - public class SetDisallowAll_Patch : FishPatch + public sealed class SetDisallowAll_Patch : FishPatch { public override string Description { get; } = "Used by the WorkGiver_DoBill patch to allow for faster refreshing of its cache"; @@ -161,7 +164,7 @@ public class ThingFilterPatches : ClassWithFishPatches public static void Postfix(ThingFilter __instance) => ForceSynchronizeCache(__instance); } - public class SetAllowAll_Patch : FishPatch + public sealed class SetAllowAll_Patch : FishPatch { public override string Description { get; } = "Used by the WorkGiver_DoBill patch to allow for faster refreshing of its cache"; @@ -173,31 +176,22 @@ public class ThingFilterPatches : ClassWithFishPatches public static void Postfix(ThingFilter __instance) => ForceSynchronizeCache(__instance); } - public class BestThingRequest_Patch : FishPatch + public sealed class BestThingRequest_Patch : FishPatch { + public override List LinkedPatches { get; } = [typeof(Listers.Things.ThingsMatching_Patch)]; + public override string? Description { get; } = "RimWorld is normally only capable of creating ThingRequests either for predefined groups or for single " + "defs. This patch makes ThingFilters return requests for multiple defs, improving performance for " + "cases where the fallback group would have to be something like all haulables. Refueling benefits a " + "lot from this. Requires the patch on ListerThings.ThingsMatching to function."; - public override bool Enabled - { - set - { - if (base.Enabled == value) - return; - - Get().Enabled = base.Enabled = value; - } - } - public override MethodBase TargetMethodInfo { get; } = AccessTools.PropertyGetter(typeof(ThingFilter), nameof(ThingFilter.BestThingRequest)); public static void Postfix(ThingFilter __instance, ref ThingRequest __result) { - if (__result.group is not (ThingRequestGroup.HaulableEver or ThingRequestGroup.Everything) + if (__result.group is not ThingRequestGroup.HaulableEver and not ThingRequestGroup.Everything || __instance.allowedDefs.Count > 16) { return; @@ -213,7 +207,7 @@ public class ThingFilterPatches : ClassWithFishPatches public record struct AllowedDefsListCacheValue : ICacheable, ICacheable { - public List Defs = new(); + public List Defs = []; private int _nextRefreshTick = -2; public bool Dirty @@ -230,7 +224,8 @@ public class ThingFilterPatches : ClassWithFishPatches public void Update(ref ThingFilter key, int tickOffset) { var allowedDefs = key.allowedDefs; - allowedDefs.Remove(null); // apparently happens + while (allowedDefs.Remove(null)) + ; // apparently happens Defs.ReplaceContentsWith(allowedDefs); diff --git a/Source/PerformanceFish/ThingOwnerUtilityCaching.cs b/Source/PerformanceFish/ThingOwnerUtilityCaching.cs index 58d8cac..64a36f4 100644 --- a/Source/PerformanceFish/ThingOwnerUtilityCaching.cs +++ b/Source/PerformanceFish/ThingOwnerUtilityCaching.cs @@ -10,10 +10,18 @@ using PerformanceFish.Prepatching; namespace PerformanceFish; -public class ThingOwnerUtilityPreCaching : ClassWithFishPrepatches +public sealed class ThingOwnerUtilityPreCaching : ClassWithFishPrepatches { - public class GetAllThingsRecursively_Patch : FishPrepatch + public sealed class GetAllThingsRecursively_Patch : FishPrepatch { + // https://github.com/jptrrs/HumanResources/blob/master/Source/Harmony/ThingOwnerUtility_GetAllThingsRecursively.cs + // Harmony patches on generics like there strip out information from the generic T argument, due to harmony + // replacing the method with one made with Reflection.Emit + // noted down as known edge case on the harmony wiki here: + // https://harmony.pardeike.net/articles/patching-edgecases.html#generics + public override List IncompatibleModIDs { get; } + = [ModCompatibility.PackageIDs.HUMAN_RESOURCES]; + public override string Description { get; } = "Caching of information about mostly unspawned pawns and things. Relatively large performance impact"; @@ -82,9 +90,9 @@ public class ThingOwnerUtilityPreCaching : ClassWithFishPrepatches + (map.listerThings.listsByGroup[(int)ThingRequestGroup.ThingHolder]?.Count ?? 0); } -/*public class ThingOwnerUtilityCaching : ClassWithFishPatches +/*public sealed class ThingOwnerUtilityCaching : ClassWithFishPatches { - public class GetAllThingsRecursively_Patch : FishPatch + public sealed class GetAllThingsRecursively_Patch : FishPatch { public override string Description { get; } = "Caching of information about mostly unspawned pawns and things. Relatively large performance impact"; diff --git a/Source/PerformanceFish/ThingPatches.cs b/Source/PerformanceFish/ThingPatches.cs new file mode 100644 index 0000000..63e90b5 --- /dev/null +++ b/Source/PerformanceFish/ThingPatches.cs @@ -0,0 +1,75 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using Mono.Cecil; +using Mono.Cecil.Cil; +using PerformanceFish.Prepatching; + +namespace PerformanceFish; + +public sealed class ThingPatches : ClassWithFishPrepatches +{ + public sealed class ExposeDataFixStuffPatch : FishPrepatch + { + public override string? Description { get; } + = "This is an attempt at better logging and fixing errors coming from missing stuff, like wood or cloth, " + + "after mod removal. Only runs when loading a save and only when detecting things in this erroneous " + + "state. No performance impact, unless the errors were causing issues that ended up fixed."; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredMethod(typeof(Thing), nameof(Thing.ExposeData)); + + public static void Postfix(Thing __instance) + { + if (Scribe.mode == LoadSaveMode.LoadingVars + && __instance is { def: { MadeFromStuff: true } def, Stuff: null }) + { + TryFixStuff(__instance, def); + } + } + + private static void TryFixStuff(Thing __instance, ThingDef def) + { + string label; + try + { + label = __instance.ToString(); + } + catch (Exception e) + { + label = __instance.thingIDNumber.ToStringCached(); + Log.Error($"Exception trying to fetch label for thing with def '{def}':\n{e}"); + } + + Log.Error($"Thing '{label}' of def '{def}' is madeFromStuff but stuff=null. Assigning default."); + + __instance.SetStuffDirect(GenStuff.DefaultStuffFor(def)); + } + } + + public sealed class SpawnedPatch : FishPrepatch + { + public override string? Description { get; } + = "Optimization for this property reducing its amount of instructions by 2/3 without changing results"; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredPropertyGetter(typeof(Thing), nameof(Thing.Spawned)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(MiscExtensions.IsSpawned); + } + + public sealed class MapHeldPatch : FishPrepatch + { + public override string? Description { get; } + = "Optimization for this property reducing its amount of instructions by 2/3 without changing results"; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredPropertyGetter(typeof(Thing), nameof(Thing.MapHeld)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(MiscExtensions.TryGetMapHeld); + } +} \ No newline at end of file diff --git a/Source/PerformanceFish/ThoughtWorker_Precept_AltarSharingOptimization.cs b/Source/PerformanceFish/ThoughtWorker_Precept_AltarSharingOptimization.cs index 561b92c..da8d806 100644 --- a/Source/PerformanceFish/ThoughtWorker_Precept_AltarSharingOptimization.cs +++ b/Source/PerformanceFish/ThoughtWorker_Precept_AltarSharingOptimization.cs @@ -9,9 +9,9 @@ using SharedAltarCache namespace PerformanceFish; -public class ThoughtWorker_Precept_AltarSharingOptimization : ClassWithFishPatches +public sealed class ThoughtWorker_Precept_AltarSharingOptimization : ClassWithFishPatches { - public class SharedAltar_Patch : FirstPriorityFishPatch + public sealed class SharedAltar_Patch : FirstPriorityFishPatch { public override string Description { get; } = "Caches results of ideology's shared altar thoughtworker and throttles it to wait a minimum of 128 ticks " @@ -23,7 +23,7 @@ public class ThoughtWorker_Precept_AltarSharingOptimization : ClassWithFishPatch public static bool Prefix(ThoughtWorker_Precept_AltarSharing __instance, Pawn pawn, ref Thing? __result, out bool __state) { - if (!pawn.Spawned) + if (!pawn.IsSpawned()) { __result = null; return __state = false; @@ -60,7 +60,7 @@ public class ThoughtWorker_Precept_AltarSharingOptimization : ClassWithFishPatch thing = result; _nextLateRefreshTick = TickHelper.Add(3072, pawn.thingIDNumber, 2048); _nextEarlyRefreshTick = TickHelper.Add(128, pawn.thingIDNumber, 128); - _lister = pawn.Map.listerThings; + _lister = pawn.GetMap().listerThings; _allStructuresListVersion = _lister.listsByGroup[(int)ThingRequestGroup.BuildingArtificial]._version; } diff --git a/Source/PerformanceFish/Utility/CellIndexExtensions.cs b/Source/PerformanceFish/Utility/CellIndexExtensions.cs new file mode 100644 index 0000000..73e3338 --- /dev/null +++ b/Source/PerformanceFish/Utility/CellIndexExtensions.cs @@ -0,0 +1,38 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +namespace PerformanceFish.Utility; + +public static class CellIndexExtensions +{ + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int CellToIndex(this in IntVec3 cell, Map map) => cell.CellToIndex(map.cellIndices); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int CellToIndex(this in IntVec3 cell, CellIndices cellIndices) + => cell.CellToIndex(cellIndices.mapSizeX); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int CellToIndex(this in IntVec3 cell, int mapSizeX) => (cell.z * mapSizeX) + cell.x; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int CellToIndex(this IntVec2 cell, Map map) => cell.CellToIndex(map.cellIndices); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int CellToIndex(this IntVec2 cell, CellIndices cellIndices) + => cell.CellToIndex(cellIndices.mapSizeX); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int CellToIndex(this IntVec2 cell, int mapSizeX) => (cell.z * mapSizeX) + cell.x; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int CellToIndex(int x, int z, Map map) => CellToIndex(x, z, map.cellIndices); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int CellToIndex(int x, int z, CellIndices cellIndices) => CellToIndex(x, z, cellIndices.mapSizeX); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int CellToIndex(int x, int z, int mapSizeX) => (z * mapSizeX) + x; +} \ No newline at end of file diff --git a/Source/PerformanceFish/Utility/CollectionExtensions.cs b/Source/PerformanceFish/Utility/CollectionExtensions.cs index 3117500..482ce82 100644 --- a/Source/PerformanceFish/Utility/CollectionExtensions.cs +++ b/Source/PerformanceFish/Utility/CollectionExtensions.cs @@ -4,6 +4,7 @@ // file, You can obtain one at https://mozilla.org/MPL/2.0/. using System.Diagnostics.CodeAnalysis; +using System.Linq; using Mono.Collections.Generic; namespace PerformanceFish.Utility; @@ -295,6 +296,8 @@ public static class CollectionExtensions return ThrowForNoElements(); } + + public static List AsOrToList(this IEnumerable enumerable) => enumerable as List ?? enumerable.ToList(); [DoesNotReturn] private static T ThrowForNoElements() diff --git a/Source/PerformanceFish/Utility/Exposable.cs b/Source/PerformanceFish/Utility/Exposable.cs index d54c750..089e351 100644 --- a/Source/PerformanceFish/Utility/Exposable.cs +++ b/Source/PerformanceFish/Utility/Exposable.cs @@ -9,10 +9,9 @@ namespace PerformanceFish.Utility; /// Scribe_Deep normally creates a new instance when loading data. Scribe on this class prevents that. Also includes a /// try-catch block /// -public class Exposable : IExposable +public sealed class Exposable(IExposable @this) : IExposable { - public readonly IExposable Parent; - public Exposable(IExposable @this) => Parent = @this; + public readonly IExposable Parent = @this; public void ExposeData() { @@ -27,7 +26,7 @@ public class Exposable : IExposable } public override string ToString() => TrimName(Parent.ToString()); - public override bool Equals(object obj) => obj.Equals(Parent); + public override bool Equals(object? obj) => Parent.Equals(obj); public override int GetHashCode() => Parent.GetHashCode(); public static void Scribe(IExposable iExposable, string label, bool trimLabel = true) diff --git a/Source/PerformanceFish/Utility/GUIHelper.cs b/Source/PerformanceFish/Utility/GUIHelper.cs new file mode 100644 index 0000000..dbc6f60 --- /dev/null +++ b/Source/PerformanceFish/Utility/GUIHelper.cs @@ -0,0 +1,19 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +namespace PerformanceFish.Utility; + +public static class GUIHelper +{ + /// + /// Unity calls OnGUI with EventType.Layout at the beginning and EventType.Repaint at the end of every frame. + /// Anything drawn within the Layout call in turn gets covered every time, making it a waste of CPU cycles. + /// + public static bool CanSkip + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => Event.current.type == EventType.Layout; + } +} \ No newline at end of file diff --git a/Source/PerformanceFish/Utility/MiscExtensions.cs b/Source/PerformanceFish/Utility/MiscExtensions.cs new file mode 100644 index 0000000..0310507 --- /dev/null +++ b/Source/PerformanceFish/Utility/MiscExtensions.cs @@ -0,0 +1,140 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using System.Security; +using Verse.Sound; + +namespace PerformanceFish.Utility; + +public static class MiscExtensions +{ + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [SecuritySafeCritical] + public static bool AsBool(this int value) // ref on parameter instead of var would enforce stack allocation + { + var temp = (byte)value; // bool is 32 bits in .NET, but the jit compiler only eliminates when casting to byte first + return Unsafe.As(ref temp); // result is a direct return with no instructions whatsoever + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [SecuritySafeCritical] + public static int AsInt(this bool value) + { + var temp = value; + return Unsafe.As(ref temp); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool IsItem(this Thing thing) => thing.def.category == ThingCategory.Item; + + public static ISlotGroupParent? GetSlotGroupParent(this in IntVec3 position, Map map) + => map.haulDestinationManager.SlotGroupAt(position)?.parent; + + public static ISlotGroupParent? StoringSlotGroupParent(this Thing thing) + => thing.Position.GetSlotGroupParent(thing.GetMap()); + + public static int SlotGroupCellCount(this Thing thing) => ((ISlotGroupParent)thing).AllSlotCellsList().Count; + + public static List GetThingListUnchecked(this in IntVec3 cell, Map map) + => map.thingGrid.ThingsListAtFast(cell.CellToIndex(map)); + + public static List GetThingListUnchecked(this IntVec2 cell, Map map) + => map.thingGrid.ThingsListAtFast(cell.CellToIndex(map)); + + public static Region? RegionAtUnchecked(this IntVec3 c, Map map, + RegionType allowedRegionTypes = RegionType.Set_Passable) + { + map.regionAndRoomUpdater.TryRebuildDirtyRegionsAndRooms(); + + return map.regionGrid.regionGrid[c.CellToIndex(map)] is { valid: true } region + && (region.type & allowedRegionTypes) != RegionType.None + ? region + : null; + } + + public static Region? GetValidRegionAtUnchecked(this RegionGrid grid, in IntVec3 c) + { + var map = grid.map; + + map.regionAndRoomUpdater.TryRebuildDirtyRegionsAndRooms(); + return grid.regionGrid[c.CellToIndex(map)] is { valid: true } region ? region : null; + } + + public static bool ContainsThingStackableWith(this List thingsOfSingleDef, Thing t) + { + var def = t.def; + + for (var i = thingsOfSingleDef.Count; i-- > 0;) + { + if (thingsOfSingleDef[i].stackCount < def.stackLimit && thingsOfSingleDef[i].CanStackWith(t)) + return true; + } + + return false; + } + + public static Map? TryGetMapHeld(this Thing thing) + { + var maps = Current.Game.Maps; + var mapIndex = (uint)thing.mapIndexOrState; + + return mapIndex < (uint)maps.Count + ? maps[(int)mapIndex] + : thing.ParentHolder is { } parentHolder + ? ThingOwnerUtility.GetRootMap(parentHolder) + : null; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Map? TryGetMap(this Thing thing) + { + var maps = Current.Game.Maps; + var mapIndex = (uint)thing.mapIndexOrState; + + return mapIndex < (uint)maps.Count ? maps[(int)mapIndex] : null; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Map GetMap(this Thing thing) => Current.Game.Maps[thing.mapIndexOrState]; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Map GetMap(this Region region) => Current.Game.Maps[region.mapIndex]; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool IsSpawned(this Thing thing) => (uint)thing.mapIndexOrState < (uint)Current.Game.Maps.Count; + + public static void InvokeWhenCellIndicesReady(this Map map, Action action) + { + if (map.cellIndices != null) + action(map); + else + map.Events().ComponentsConstructed += action; + } + + public static void AddLetterSilently(this LetterStack letterStack, Letter letter, Color color, bool playSound = false, + string? debugInfo = null) + { + var letterDef = letter.def.MemberwiseClone(); + letterDef.index = 0; + letterDef.shortHash = 0; + letterDef.color = color; + letterDef.flashColor = color; + letter.def = letterDef; + letterStack.AddLetterSilently(letter, playSound, debugInfo); + } + + public static void AddLetterSilently(this LetterStack letterStack, Letter letter, bool playSound = false, + string? debugInfo = null) + { + if (playSound) + letter.def.arriveSound.PlayOneShotOnCamera(); + + letter.arrivalTime = Time.time; + letter.arrivalTick = Find.TickManager.TicksGame; + letter.debugInfo = debugInfo; + letterStack.letters.Add(letter); + letter.Received(); + } +} \ No newline at end of file diff --git a/Source/PerformanceFish/Utility/PipetteTool.cs b/Source/PerformanceFish/Utility/PipetteTool.cs new file mode 100644 index 0000000..ea5cd41 --- /dev/null +++ b/Source/PerformanceFish/Utility/PipetteTool.cs @@ -0,0 +1,80 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using System.Linq; +using JetBrains.Annotations; +using UnityEngine.Rendering; + +namespace PerformanceFish.Utility; + +public static class PipetteTool +{ + [UsedImplicitly] + [DebugAction("Misc", "Pipette tool", actionType = DebugActionType.ToolMap, + allowedGameStates = AllowedGameStates.PlayingOnMap)] + public static void Action() + { + var things = UI.MouseCell().GetThingList(Find.CurrentMap).ToList(); + things.Sort(static (x, y) => ((int)x.def.altitudeLayer).CompareTo((int)y.def.altitudeLayer)); + + for (var i = things.Count; i-- > 0; ) + { + var thing = things[i]; + var material = thing.Graphic?.MatAt(thing.Rotation, thing); + if (material == null) + continue; + + var texture = material.mainTexture; + if (texture == null) + continue; + + var destinationTexture = RenderTexture.GetTemporary(texture.width, texture.height); + Graphics.Blit(texture, destinationTexture); + + AsyncGPUReadback.Request(destinationTexture, callback: result + => + { + try + { + using var pixelDataNative = result.GetData(); + + var pixelDataFiltered = pixelDataNative + .Where(static color => (color.r > 0 || color.g > 0 || color.b > 0) && color.a > 0) + .ToArray(); + + var averageColor = pixelDataFiltered.Length < 1 + ? (Color32)Color.black + : GetAverage(pixelDataFiltered); + + Log.Message($"Texture of thing '{thing}' has average color of {averageColor} { + "(■)".Colorize(averageColor)}."); + + Find.LetterStack.AddLetterSilently(LetterMaker.MakeLetter("Pipette result", + $"Texture of thing '{thing}' has average color of {averageColor} { + "(■)".Colorize(averageColor)}", + LetterDefOf.NeutralEvent), averageColor); + } + catch (Exception e) + { + Log.Error($"Exception in AsyncGPUReadback:\n{e}"); + } + finally + { + RenderTexture.ReleaseTemporary(destinationTexture); + } + }); + break; + } + } + + private static Color32 GetAverage(Color32[] colors) + => new(GetAverage(colors, static color => color.r), + GetAverage(colors, static color => color.g), + GetAverage(colors, static color => color.b), + GetAverage(colors, static color => color.a)); + + private static byte GetAverage(IEnumerable colors, Func selector) + => (byte)Mathf.RoundToInt((float)colors.Average(selector)); +} \ No newline at end of file diff --git a/Source/PerformanceFish/Utility/PooledArray.cs b/Source/PerformanceFish/Utility/PooledArray.cs new file mode 100644 index 0000000..93b6c18 --- /dev/null +++ b/Source/PerformanceFish/Utility/PooledArray.cs @@ -0,0 +1,105 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using System.Diagnostics.CodeAnalysis; + +namespace PerformanceFish.Utility; + +public record struct PooledArray : IDisposable, IEnumerable +{ + private static T[]?[] _buffers = new T[]?[4]; + private static int _bufferCount; + + private T[] _array; + private int _length; + + public T[] BackingArray => _array; + public int Length => _length; + public int Capacity => _array.Length; + + public T this[int index] + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + Guard.IsLessThan(index, Length); + return _array[index]; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + set + { + Guard.IsLessThan(index, Length); + _array[index] = value; + } + } + + public PooledArray() : this(0) + { + } + + public PooledArray(int length) + { + if (_bufferCount < 1) + { + NewBuffer(length); + } + else + { + ref var bucket = ref _buffers[--_bufferCount]; + _array = bucket!; + bucket = null; + if (_array.Length < length) + ResizeBuffer(length); + } + + _length = length; + } + + public PooledArray(ICollection collection) : this(collection.Count) => collection.CopyTo(_array, 0); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public ref T GetReference(int index) + { + Guard.IsLessThan(index, Length); + return ref _array[index]; + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private void ResizeBuffer(int length) => Array.Resize(ref _array, Mathf.NextPowerOfTwo(length)); + + [MemberNotNull(nameof(_array))] + [MethodImpl(MethodImplOptions.NoInlining)] + private void NewBuffer(int length) => _array = new T[Mathf.NextPowerOfTwo(length)]; + + public void Dispose() + { + if (++_bufferCount > _buffers.Length) + ExpandBuffers(_bufferCount); + + if (_length > 0) + Array.Clear(_array, 0, _length); + + _buffers[_bufferCount - 1] = _array; + } + + public void Sort(IComparer comparer) => _array.AsSpan()[.._length].Sort(comparer); + + private static void ExpandBuffers(int minLength) + { + var newBuffers = new T[]?[Mathf.NextPowerOfTwo(minLength)]; + + Array.Copy(_buffers, newBuffers, _buffers.Length); + + _buffers = newBuffers; + } + + public IEnumerator GetEnumerator() + { + for (var i = 0; i < _length; i++) + yield return _array[i]; + } + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); +} \ No newline at end of file diff --git a/Source/PerformanceFish/Utility/ReflectionExtensions.cs b/Source/PerformanceFish/Utility/ReflectionExtensions.cs index b898c9b..3528539 100644 --- a/Source/PerformanceFish/Utility/ReflectionExtensions.cs +++ b/Source/PerformanceFish/Utility/ReflectionExtensions.cs @@ -3,6 +3,8 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. +using System.Diagnostics; +using System.Reflection.Emit; using JetBrains.Annotations; namespace PerformanceFish.Utility; @@ -27,6 +29,8 @@ public static class ReflectionExtensions return null; } + + public static bool IsConst(this FieldInfo info) => info is { IsLiteral: true, IsInitOnly: false }; public static IEnumerable SubclassesWithNoMethodOverride(this Type type, params string[] names) { @@ -60,7 +64,7 @@ public static class ReflectionExtensions yield return subclass; } - public static IEnumerable SubclassesWithNoMethodOverride(this Type type, Type[] allowedDeclaringTypes, + public static IEnumerable SubclassesWithNoMethodOverride(this Type type, Type?[] allowedDeclaringTypes, params string[] names) { Guard.IsNotNull(type); @@ -75,8 +79,11 @@ public static class ReflectionExtensions var hasOverrides = false; for (var j = names.Length; j-- > 0;) { - if (allowedDeclaringTypes.Contains(AccessTools.Method(allSubclasses[i], names[j])!.DeclaringType!)) + if (AccessTools.Method(allSubclasses[i], names[j])!.DeclaringType is { } declaringType + && allowedDeclaringTypes.Contains(declaringType)) + { continue; + } hasOverrides = true; break; @@ -87,7 +94,7 @@ public static class ReflectionExtensions } } - public static IEnumerable SubclassesWithNoMethodOverrideAndSelf(this Type type, Type[] allowedDeclaringTypes, + public static IEnumerable SubclassesWithNoMethodOverrideAndSelf(this Type type, Type?[] allowedDeclaringTypes, params string[] names) { yield return type; @@ -95,4 +102,94 @@ public static class ReflectionExtensions foreach (var subclass in type.SubclassesWithNoMethodOverride(allowedDeclaringTypes, names)) yield return subclass; } + + public static Version GetReferencedAssemblyVersion(this Assembly assembly, Assembly referencedAssembly) + => assembly.GetReferencedAssemblyVersion(referencedAssembly.GetName().Name); + + public static Version GetReferencedAssemblyVersion(this Assembly assembly, string referencedAssemblyName) + => assembly.GetReferencedAssemblies().First(reference + => reference.FullName.StartsWith($"{referencedAssemblyName}, Version", StringComparison.Ordinal)).Version; + + public static Version GetLoadedVersion(this Assembly assembly) => assembly.GetName().Version; + + public static T MemberwiseClone(this T obj) => MemberwiseCloneCache.InstanceFunc(obj); + + private static class MemberwiseCloneCache + { + [ThreadStatic] + private static FishTable? _staticFuncs; + + public static FishTable StaticFuncs => _staticFuncs ??= Initialize(); + + [MethodImpl(MethodImplOptions.NoInlining)] + private static FishTable Initialize() + => new() + { + ValueInitializer = static type + => (Delegate)AccessTools.DeclaredField(typeof(MemberwiseCloneCache<>).MakeGenericType(type), + nameof(MemberwiseCloneCache.StaticFunc)).GetValue(null) + }; + } + + private static class MemberwiseCloneCache + { + internal static readonly Func StaticFunc, InstanceFunc; + + static MemberwiseCloneCache() + { + var type = typeof(T); + try + { + var dm = new DynamicMethod($"FisheryMemberwiseCloneFunc_{type.Name}", + type, [type], type, true); + + var il = dm.GetILGenerator(); + + if (type.IsValueType) + { + il.Emit(FishTranspiler.Argument(0)); + } + else + { + var copyVariable = FishTranspiler.NewLocalVariable(type, il); + + il.Emit(FishTranspiler.New(type, Type.EmptyTypes)); + il.Emit(copyVariable.Store()); + + foreach (var field in typeof(T).GetFields(BindingFlags.Instance + | BindingFlags.Public + | BindingFlags.NonPublic)) + { + var fieldInstruction = FishTranspiler.Field(field); + + il.Emit(copyVariable.Load()); + il.Emit(FishTranspiler.Argument(0)); + il.Emit(fieldInstruction.Load()); + il.Emit(fieldInstruction.Store()); + } + + il.Emit(copyVariable.Load()); + } + + il.Emit(FishTranspiler.Return); + + StaticFunc = (Func)dm.CreateDelegate(typeof(Func)); + + InstanceFunc = static obj => obj!.GetType() == typeof(T) + ? StaticFunc(obj) + : ((Func)MemberwiseCloneCache.StaticFuncs.GetOrAdd(obj.GetType()))(obj); + } + catch (Exception e) + { + Log.Error($"Failed creating a MemberwiseClone delegate for {type.FullDescription()}\n{ + e}\n{new StackTrace()}"); + + var defaultCloneFunc = (Func)AccessTools + .DeclaredMethod(typeof(object), nameof(MemberwiseClone)) + .CreateDelegate(typeof(Func)); + + InstanceFunc = StaticFunc = obj => (T)defaultCloneFunc(obj!); + } + } + } } \ No newline at end of file diff --git a/Source/PerformanceFish/Utility/StringExtensions.cs b/Source/PerformanceFish/Utility/StringExtensions.cs index a996e8c..430b6b4 100644 --- a/Source/PerformanceFish/Utility/StringExtensions.cs +++ b/Source/PerformanceFish/Utility/StringExtensions.cs @@ -8,5 +8,8 @@ namespace PerformanceFish.Utility; public static class StringExtensions { public static bool NameEqualsCaseInsensitive(this MethodInfo methodInfo, string name) - => methodInfo.Name.Equals(name, StringComparison.InvariantCultureIgnoreCase); + => methodInfo.Name.Equals(name, StringComparison.OrdinalIgnoreCase); + + public static string AppendWhen(this string instance, bool predicate, string text) + => predicate ? instance + text : instance; } \ No newline at end of file diff --git a/Source/PerformanceFish/Utility/ThingHelper.cs b/Source/PerformanceFish/Utility/ThingHelper.cs new file mode 100644 index 0000000..118bffb --- /dev/null +++ b/Source/PerformanceFish/Utility/ThingHelper.cs @@ -0,0 +1,13 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +namespace PerformanceFish.Utility; + +public static class ThingHelper +{ + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int GetKey(this Thing thing) + => thing.thingIDNumber != -1 ? thing.thingIDNumber : RuntimeHelpers.GetHashCode(thing); +} \ No newline at end of file diff --git a/Source/PerformanceFish/TickHelper.cs b/Source/PerformanceFish/Utility/TickHelper.cs similarity index 77% rename from Source/PerformanceFish/TickHelper.cs rename to Source/PerformanceFish/Utility/TickHelper.cs index 2ee93b7..cc02ba9 100644 --- a/Source/PerformanceFish/TickHelper.cs +++ b/Source/PerformanceFish/Utility/TickHelper.cs @@ -3,7 +3,7 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. -namespace PerformanceFish; +namespace PerformanceFish.Utility; public static class TickHelper { @@ -11,7 +11,11 @@ public static class TickHelper public static bool Past(int tick) => tick < TicksGame; [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool MatchesModulo(int powerOfTwo) => (TicksGame & (powerOfTwo - 1)) == 0; + public static bool MatchesModulo(int powerOfTwo) => MatchesModulo(powerOfTwo, 0); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool MatchesModulo(int powerOfTwo, int offset) + => ((TicksGame + offset) & (powerOfTwo - 1)) == 0; [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int Add(int ticks) => ticks + TicksGame; diff --git a/Source/PerformanceFish/UtilityPatches.cs b/Source/PerformanceFish/UtilityPatches.cs index de8fe51..b3a8a32 100644 --- a/Source/PerformanceFish/UtilityPatches.cs +++ b/Source/PerformanceFish/UtilityPatches.cs @@ -5,12 +5,14 @@ namespace PerformanceFish; -public class UtilityPatches : ClassWithFishPatches +public sealed class UtilityPatches : ClassWithFishPatches { - public class FinalizeInit_Patch : FishPatch + public sealed class FinalizeInit_Patch : FishPatch { public override bool Enabled => true; + public override bool ShowSettings => false; + public override string Description { get; } = "Necessary for patches that require a loaded game to function"; @@ -31,13 +33,15 @@ public class UtilityPatches : ClassWithFishPatches } } - public class ClearAllMapsAndWorld_Patch : FishPatch + public sealed class ClearAllMapsAndWorld_Patch : FishPatch { public override bool Enabled => true; + public override bool ShowSettings => false; + public override string Description { get; } - = "A patch to make the game clear all Performance Fish caches whenever saves get unloaded, to avoid " - + "anything getting carried over to a new game by mistake"; + = "This clears all Performance Fish caches whenever saves get unloaded, to avoid anything getting carried " + + "over to a new game by mistake"; public override Delegate TargetMethodGroup => Verse.Profile.MemoryUtility.ClearAllMapsAndWorld; diff --git a/Source/PerformanceFish/UtilityPrepatches.cs b/Source/PerformanceFish/UtilityPrepatches.cs index 544ea2b..9f9935a 100644 --- a/Source/PerformanceFish/UtilityPrepatches.cs +++ b/Source/PerformanceFish/UtilityPrepatches.cs @@ -3,14 +3,13 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. -using System.Diagnostics; using PerformanceFish.Prepatching; namespace PerformanceFish; -public class UtilityPrepatches : ClassWithFishPrepatches +public sealed class UtilityPrepatches : ClassWithFishPrepatches { - public class CreateModClassesPatch : FishPrepatch + public sealed class CreateModClassesPatch : FishPrepatch { public override string? Description { get; } = "Hook for very early loading of patches, right after the game finishes loading up game assemblies into " @@ -18,6 +17,8 @@ public class UtilityPrepatches : ClassWithFishPrepatches public override bool Enabled => true; + public override bool ShowSettings => false; + public override MethodBase TargetMethodBase { get; } = methodof(LoadedModManager.CreateModClasses); @@ -30,21 +31,8 @@ public class UtilityPrepatches : ClassWithFishPrepatches catch (Exception e) { Log.Error($"Exception caught within OnAssembliesLoaded:\n{e}\n{ - new StackTrace() /*StackTraceUtility.ExtractStackTrace()*/}"); + Environment.StackTrace /*StackTraceUtility.ExtractStackTrace()*/}"); } } } - - public class ThingDestroy : FishPrepatch - { - public override string? Description { get; } - = "Hook to invoke an event whenever things get destroyed. Certain functions require this."; - - public override bool Enabled => true; - - public override MethodBase TargetMethodBase { get; } - = AccessTools.DeclaredMethod(typeof(Thing), nameof(Thing.Destroy)); - - public static void Postfix(Thing __instance) => Cache.Utility.NotifyThingDestroyed(__instance); - } } \ No newline at end of file diff --git a/Source/PerformanceFish/WorkGiverDefFixes.cs b/Source/PerformanceFish/WorkGiverDefFixes.cs new file mode 100644 index 0000000..c7aa2bc --- /dev/null +++ b/Source/PerformanceFish/WorkGiverDefFixes.cs @@ -0,0 +1,57 @@ +// Copyright (c) 2023 bradson +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +using Mono.Cecil; +using Mono.Cecil.Cil; +using PerformanceFish.Prepatching; + +namespace PerformanceFish; + +public sealed class WorkGiverDefFixes : ClassWithFishPrepatches +{ + public sealed class WorkerPatch : FishPrepatch + { + public override string? Description { get; } + = "RimWorld has no checks to verify that workGiverDefs include valid classes with their actual " + + "implementation. This means whenever mods either don't provide one or it simply fails to load for any " + + "reason, entirely uninformative errors get spammed at the point pawns try starting a job at. This patch " + + "here adds a check, logging the erroneous def with mod source when possible and disabling the workGiver " + + "from running to prevent the error spam."; + + public override MethodBase TargetMethodBase { get; } + = AccessTools.DeclaredPropertyGetter(typeof(WorkGiverDef), nameof(WorkGiverDef.Worker)); + + public override void Transpiler(ILProcessor ilProcessor, ModuleDefinition module) + => ilProcessor.ReplaceBodyWith(Replacement); + + public static WorkGiver Replacement(WorkGiverDef instance) + { + if (instance.workerInt == null) + { + if (instance.giverClass is null) + TryFixAndLogError(instance); + + instance.workerInt = (WorkGiver)Activator.CreateInstance(instance.giverClass!); + instance.workerInt.def = instance; + } + + return instance.workerInt; + } + + public static void TryFixAndLogError(WorkGiverDef instance) + { + instance.giverClass = typeof(WorkGiver_AlwaysSkip); + Log.Error($"Detected missing giverClass in WorkGiverDef '{ + instance.defName ?? "null"}' from mod '{ + instance.modContentPack?.Name ?? "null"}' for WorkTypeDef '{ + instance.workType?.defName ?? "null"}'. Disabling now to avoid further issues."); + } + } + + public sealed class WorkGiver_AlwaysSkip : WorkGiver + { + public override bool ShouldSkip(Pawn pawn, bool forced = false) => true; + } +} \ No newline at end of file