Hatchery: Faster sorting algorithm #373
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Currently each loop of the Hatchery Automation sorts the whole pokémon list only to use at most the first 4 to fill the hatchery queue, this results in a significant overhead and some visible stuttering with large parties. On my 1100% save the automation used 99ms every second.
This PR proposes to use partial sorting to only compute the sorted top 4 pokémons, avoiding spending a lot of time sorting the 1300+ other.
Only caveat of this is that the pokerus spreading priority currently requires the whole list to be sorted to pick relevant uninfected/contagious pokémons depending on the current hatchery state. For instance the first contagious pokémon with the needed types to spread might be at the very end of the sorted list for all I know.
Therefore, when this priority is enabled (and some pokémons are uninfected), the previous complete sort is done instead to preserve functionnality at the cost of performance. This seems like a reasonable compromise considering it's very quick to be done spreading the pokerus.
The results show that with the attribute sort set to Breeding Efficiency (the most expensive), the loop goes from 99ms to 19ms. Stutters are also gone.
Before
After