perf: Optimize RocketSoundEnhancement.LateUpdate by patching AudioSource ctor#42
Merged
JonnyOThan merged 1 commit intoKSPModStewards:masterfrom Nov 8, 2025
Merged
Conversation
Every frame, RocketSoundEnhancement makes a FindObjectsOfType call in order to discover any new AudioSources that have been created in the last frame. This is slow. This commit does away with that by: - Patching AudioSource::.ctor to add the newly created AudioSource object to a list (if there is currently an instance of RocketSoundEnhancement active). - Processing the new items in the list in LateUpdate instead of checking all available items. There might be some further simplifications that can be done here now that we know that we're only processing new AudioSources. None of them would have an effect on performance though, so I have left them in just to be safe. In my testing this change reduces the time spent in RSE.LateUpdate from 4.4s to 90ms over a 253s launch to orbit.
JonnyOThan
reviewed
Nov 8, 2025
| build: | ||
| uses: KSPModdingLibs/KSPBuildTools/.github/workflows/build.yml@0.0.4 | ||
| with: | ||
| dependency-identifiers: Harmony2 |
Member
There was a problem hiding this comment.
This should be use-ckan: true and set the properties appropriately in the csproj
JonnyOThan
reviewed
Nov 8, 2025
|
|
||
| // This makes sure things still work even if a new audio source ends | ||
| // up being created while we are running. | ||
| source = newAudioSources[newAudioSources.Count - 1]; |
Member
There was a problem hiding this comment.
Maybe should check if the source is destroyed here and only return non-destroyed ones?
Oh never mind I thought you might be spreading them out over several frames.
JonnyOThan
reviewed
Nov 8, 2025
| { | ||
| AudioSource source = (AudioSource)sourceObj; | ||
| if (source != null) source.outputAudioMixerGroup = null; | ||
| if (source != null) |
Member
There was a problem hiding this comment.
There is a faster null check, see KSPCF
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Every frame, RocketSoundEnhancement makes a FindObjectsOfType call in order to discover any new AudioSources that have been created in the last frame. This is slow.
This commit does away with that by:
There might be some further simplifications that can be done here now that we know that we're only processing new AudioSources. None of them would have an effect on performance though, so I have left them in just to be safe.
In my testing this change reduces the time spent in RSE.LateUpdate from 4.4s to 90ms over a 253s launch to orbit.
In addition to the optimization itself, I have also: