Perf: Yet more caching ruleset objects' filter results

This commit is contained in:
yairm210
2024-04-25 15:29:09 +03:00
parent 12f0a80732
commit 18db0d4f2e
2 changed files with 17 additions and 7 deletions

View File

@ -504,9 +504,16 @@ class Building : RulesetStatsObject(), INonPerpetualConstruction {
return true
}
val cachedMatchesFilterResult = HashMap<String, Boolean>()
/** Implements [UniqueParameterType.BuildingFilter] */
fun matchesFilter(filter: String): Boolean {
return MultiFilter.multiFilter(filter, ::matchesSingleFilter)
val cachedAnswer = cachedMatchesFilterResult[filter]
if (cachedAnswer != null) return cachedAnswer
val newAnswer = MultiFilter.multiFilter(filter, { matchesSingleFilter(it) })
cachedMatchesFilterResult[filter] = newAnswer
return newAnswer
}
private fun matchesSingleFilter(filter: String): Boolean {

View File

@ -12,11 +12,7 @@ import com.unciv.models.ruleset.RejectionReason
import com.unciv.models.ruleset.RejectionReasonType
import com.unciv.models.ruleset.Ruleset
import com.unciv.models.ruleset.RulesetObject
import com.unciv.models.ruleset.unique.Conditionals
import com.unciv.models.ruleset.unique.StateForConditionals
import com.unciv.models.ruleset.unique.Unique
import com.unciv.models.ruleset.unique.UniqueTarget
import com.unciv.models.ruleset.unique.UniqueType
import com.unciv.models.ruleset.unique.*
import com.unciv.models.stats.Stat
import com.unciv.ui.components.extensions.getNeedMoreAmountString
import com.unciv.ui.components.extensions.toPercent
@ -360,9 +356,16 @@ class BaseUnit : RulesetObject(), INonPerpetualConstruction {
else ruleset.units[replaces!!]!!
}
val cachedMatchesFilterResult = HashMap<String, Boolean>()
/** Implements [UniqueParameterType.BaseUnitFilter][com.unciv.models.ruleset.unique.UniqueParameterType.BaseUnitFilter] */
fun matchesFilter(filter: String): Boolean {
return MultiFilter.multiFilter(filter, ::matchesSingleFilter)
val cachedAnswer = cachedMatchesFilterResult[filter]
if (cachedAnswer != null) return cachedAnswer
val newAnswer = MultiFilter.multiFilter(filter, { matchesSingleFilter(it) })
cachedMatchesFilterResult[filter] = newAnswer
return newAnswer
}
fun matchesSingleFilter(filter: String): Boolean {