Skip to content

Commit 16fb55d

Browse files
committed
potential fix for gradual performance degradation from music sources
1 parent e64b7a1 commit 16fb55d

File tree

12 files changed

+347
-335
lines changed

12 files changed

+347
-335
lines changed

.editorconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ resharper_csharp_wrap_before_declaration_rpar = true
143143
resharper_csharp_wrap_before_invocation_rpar = true
144144
resharper_csharp_wrap_parameters_style = chop_if_long
145145
resharper_keep_existing_invocation_parens_arrangement = false
146+
resharper_keep_existing_primary_constructor_declaration_parens_arrangement = false
146147
resharper_keep_existing_property_patterns_arrangement = false
147148
resharper_max_initializer_elements_on_line = 2
148149
resharper_max_invocation_arguments_on_line = 5

Intersect.Client.Core/Core/Audio.cs

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public static partial class Audio
3232
//Music
3333
private static string? sQueuedMusic = string.Empty;
3434

35-
private static GameAudioInstance? sMyMusic { get; set; }
35+
private static GameAudioInstance? _activeMusicSource;
3636

3737
//Init
3838
public static void Init()
@@ -48,7 +48,7 @@ public static void Init()
4848

4949
public static void UpdateGlobalVolume()
5050
{
51-
sMyMusic?.SetVolume(sMyMusic.GetVolume(), true);
51+
_activeMusicSource?.Update();
5252
for (var i = 0; i < sGameSounds.Count; i++)
5353
{
5454
_ = sGameSounds[i].Update();
@@ -62,18 +62,25 @@ public static void UpdateGlobalVolume()
6262
//Update
6363
public static void Update()
6464
{
65-
if (sMyMusic != null)
65+
if (_activeMusicSource != null)
6666
{
67+
_activeMusicSource.Update();
6768
var currentTime = Timing.Global.MillisecondsUtc;
6869
if (sFadeTimer != 0 && sFadeTimer < currentTime)
6970
{
7071
if (sFadingOut)
7172
{
72-
sMyMusic.SetVolume(sMyMusic.GetVolume() - 1, true);
73-
if (sMyMusic.GetVolume() <= 1 && !string.IsNullOrEmpty(sQueuedMusic))
73+
if (--_activeMusicSource.Volume < 1)
7474
{
7575
StopMusic();
76-
PlayMusic(sQueuedMusic, 0, sQueuedFade, sQueuedLoop);
76+
if (!string.IsNullOrEmpty(sQueuedMusic))
77+
{
78+
PlayMusic(sQueuedMusic, 0, sQueuedFade, sQueuedLoop);
79+
}
80+
else
81+
{
82+
sFadeTimer = currentTime + sFadeRate;
83+
}
7784
}
7885
else
7986
{
@@ -82,8 +89,7 @@ public static void Update()
8289
}
8390
else
8491
{
85-
sMyMusic.SetVolume(sMyMusic.GetVolume() + 1, true);
86-
if (sMyMusic.GetVolume() < 100)
92+
if (++_activeMusicSource.Volume < 100)
8793
{
8894
sFadeTimer = currentTime + sFadeRate;
8995
}
@@ -132,12 +138,12 @@ public static void PlayMusic(string filename, int fadeout = 0, int fadein = 0, b
132138
ClearQueue();
133139

134140
filename = GameContentManager.RemoveExtension(filename);
135-
if (sMyMusic != null)
141+
if (_activeMusicSource != null)
136142
{
137143
if (fadeout == 0 ||
138-
sMyMusic.State == GameAudioInstance.AudioInstanceState.Stopped ||
139-
sMyMusic.State == GameAudioInstance.AudioInstanceState.Paused ||
140-
sMyMusic.GetVolume() == 0)
144+
_activeMusicSource.State == GameAudioInstance.AudioInstanceState.Stopped ||
145+
_activeMusicSource.State == GameAudioInstance.AudioInstanceState.Paused ||
146+
_activeMusicSource.Volume < 1)
141147
{
142148
StopMusic();
143149
StartMusic(filename, fadein, loop);
@@ -181,16 +187,16 @@ private static void StartMusic(string filename, int fadein = 0, bool loop = fals
181187
return;
182188
}
183189

184-
if (sMyMusic != null)
190+
if (_activeMusicSource != null)
185191
{
186192
ApplicationContext.Context.Value?.Logger.LogTrace($"Trying to start '{filename}' without properly closing '{sCurrentSong}'.");
187193
}
188194

189-
sMyMusic = music.CreateInstance();
195+
_activeMusicSource = music.CreateInstance();
190196
sCurrentSong = filename;
191-
sMyMusic.Play();
192-
sMyMusic.SetVolume(0, true);
193-
sMyMusic.IsLooping = loop;
197+
_activeMusicSource.Play();
198+
_activeMusicSource.Volume = 0;
199+
_activeMusicSource.IsLooping = loop;
194200
sFadeRate = fadein / 100;
195201
sFadeTimer = Timing.Global.MillisecondsUtc + sFadeRate;
196202
sFadingOut = false;
@@ -202,26 +208,26 @@ private static void StartMusic(string filename, int fadein = 0, bool loop = fals
202208
/// <param name="fadeout">The time (in ms) it should take to fade out the current music track.</param>
203209
public static void StopMusic(int fadeout = 0)
204210
{
205-
if (sMyMusic == null)
211+
if (_activeMusicSource == null)
206212
{
207213
return;
208214
}
209215

210216
if (fadeout == 0 ||
211-
sMyMusic.State == GameAudioInstance.AudioInstanceState.Stopped ||
212-
sMyMusic.State == GameAudioInstance.AudioInstanceState.Paused ||
213-
sMyMusic.GetVolume() == 0)
217+
_activeMusicSource.State == GameAudioInstance.AudioInstanceState.Stopped ||
218+
_activeMusicSource.State == GameAudioInstance.AudioInstanceState.Paused ||
219+
_activeMusicSource.Volume < 1)
214220
{
215221
sCurrentSong = string.Empty;
216-
sMyMusic.Stop();
217-
sMyMusic.Dispose();
218-
sMyMusic = null;
222+
_activeMusicSource.Stop();
223+
_activeMusicSource.Dispose();
224+
_activeMusicSource = null;
219225
sFadeTimer = 0;
220226
}
221227
else
222228
{
223229
//Start fadeout
224-
sFadeRate = fadeout / sMyMusic.GetVolume();
230+
sFadeRate = fadeout / Math.Max(1, _activeMusicSource.Volume);
225231
sFadeTimer = Timing.Global.MillisecondsUtc + sFadeRate;
226232
sFadingOut = true;
227233
}

Intersect.Client.Core/Core/Sounds/MapSound.cs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public MapSound(
3939
mY = y;
4040
mMapId = mapId;
4141
mEntity = parent;
42-
mSound.SetVolume(0);
42+
mSound.Volume = 0;
4343
}
4444

4545
public void UpdatePosition(int x, int y, Guid mapId)
@@ -65,7 +65,10 @@ private void UpdateSoundVolume()
6565
{
6666
if (mMapId == Guid.Empty)
6767
{
68-
mSound?.SetVolume(0);
68+
if (mSound is { } sound)
69+
{
70+
sound.Volume = 0;
71+
}
6972
return;
7073
}
7174

@@ -78,23 +81,26 @@ private void UpdateSoundVolume()
7881

7982
if (mX == -1 || mY == -1 || mDistance <= 0)
8083
{
81-
mSound?.SetVolume(100);
84+
if (mSound is { } sound)
85+
{
86+
sound.Volume = 100;
87+
}
8288
}
8389
else
8490
{
91+
var volume = 0f;
8592
if (mDistance > 0 && Globals.GridMaps.ContainsKey(mMapId))
8693
{
87-
var volume = 100 - 100 / (mDistance + 1) * CalculateSoundDistance();
94+
volume = 100 - 100 / ((mDistance + 1) * CalculateSoundDistance());
8895
if (volume < 0)
8996
{
9097
volume = 0f;
9198
}
92-
93-
mSound?.SetVolume((int)volume);
9499
}
95-
else
100+
101+
if (mSound is { } sound)
96102
{
97-
mSound?.SetVolume(0);
103+
sound.Volume = (int)volume;
98104
}
99105
}
100106
}

Intersect.Client.Core/Core/Sounds/Sound.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,7 @@ public Sound(string filename, bool loop, int loopInterval)
4040
{
4141
mSound = sound.CreateInstance();
4242
mSound.IsLooping = mLoop && mLoopInterval <= 0;
43-
44-
mSound.SetVolume(100);
43+
mSound.Volume = 100;
4544
mSound.Play();
4645
Loaded = true;
4746
}
@@ -67,6 +66,8 @@ public virtual bool Update()
6766
return false;
6867
}
6968

69+
mSound?.Update();
70+
7071
if (mLoop && mLoopInterval > 0 && mSound?.State == GameAudioInstance.AudioInstanceState.Stopped)
7172
{
7273
if (mStoppedTime == -1)
@@ -84,7 +85,8 @@ public virtual bool Update()
8485

8586
return true;
8687
}
87-
else if (mLoop || mSound?.State != GameAudioInstance.AudioInstanceState.Stopped)
88+
89+
if (mLoop || mSound?.State != GameAudioInstance.AudioInstanceState.Stopped)
8890
{
8991
return true;
9092
}

0 commit comments

Comments
 (0)