Skip to content

Commit 984e043

Browse files
committed
perf: Move config parsing to the LOADING scene
This moves the entire config node parsing process to happen only during part compilation.
1 parent 10444f5 commit 984e043

File tree

3 files changed

+111
-81
lines changed

3 files changed

+111
-81
lines changed

Source/RocketSoundEnhancement/PartModules/RSE_Module.cs

Lines changed: 51 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Collections;
22
using System.Collections.Generic;
3+
using System.Runtime.InteropServices;
34
using RocketSoundEnhancement.AudioFilters;
45
using RocketSoundEnhancement.Unity;
56
using UnityEngine;
@@ -17,7 +18,6 @@ public class RSE_Module : PartModule
1718

1819
public GameObject AudioParent { get; protected set; }
1920

20-
public ConfigNode PartConfigNode;
2121
public bool PrepareSoundLayers = true;
2222
public bool Initialized;
2323
public bool GamePaused;
@@ -54,49 +54,8 @@ public override void OnStart(StartState state)
5454
string partParentName = part.name + "_" + this.moduleName;
5555
AudioParent = AudioUtility.CreateAudioParent(part, partParentName);
5656

57-
if (!float.TryParse(PartConfigNode.GetValue("volume"), out Volume)) Volume = 1;
58-
if (!float.TryParse(PartConfigNode.GetValue("DopplerFactor"), out DopplerFactor)) DopplerFactor = 0.5f;
59-
60-
if (PartConfigNode.HasNode("AIRSIMULATION"))
61-
{
62-
var node = PartConfigNode.GetNode("AIRSIMULATION");
63-
64-
if (node.HasValue("EnableCombFilter")) bool.TryParse(node.GetValue("EnableCombFilter"), out EnableCombFilter);
65-
if (node.HasValue("EnableLowpassFilter")) bool.TryParse(node.GetValue("EnableLowpassFilter"), out EnableLowpassFilter);
66-
if (node.HasValue("EnableDistortionFilter")) bool.TryParse(node.GetValue("EnableDistortionFilter"), out EnableDistortionFilter);
67-
68-
if (node.HasValue("UpdateMode")) node.TryGetEnum("UpdateMode", ref AirSimUpdateMode, AirSimulationUpdate.Full);
69-
70-
if (node.HasValue("FarLowpass")) FarLowpass = float.Parse(node.GetValue("FarLowpass"));
71-
if (node.HasValue("MaxCombDelay")) MaxCombDelay = float.Parse(node.GetValue("MaxCombDelay"));
72-
if (node.HasValue("MaxCombMix")) MaxCombMix = float.Parse(node.GetValue("MaxCombMix"));
73-
if (node.HasValue("MaxDistortion")) MaxDistortion = float.Parse(node.GetValue("MaxDistortion"));
74-
if (node.HasValue("AngleHighpass")) AngleHighpass = float.Parse(node.GetValue("AngleHighpass"));
75-
}
76-
77-
UseAirSimulation = !(!EnableLowpassFilter && !EnableCombFilter && !EnableDistortionFilter);
78-
7957
if (PrepareSoundLayers)
8058
{
81-
foreach (var node in PartConfigNode.GetNodes())
82-
{
83-
var soundLayers = AudioUtility.CreateSoundLayerGroup(node.GetNodes("SOUNDLAYER"));
84-
if (soundLayers.Count == 0) continue;
85-
86-
var groupName = node.name;
87-
88-
if(node.name == "SOUNDLAYERGROUP")
89-
{
90-
groupName = node.GetValue("name");
91-
}
92-
93-
if (SoundLayerGroups.ContainsKey(groupName)) { SoundLayerGroups[groupName].AddRange(soundLayers); continue; }
94-
95-
SoundLayerGroups.Add(groupName, soundLayers);
96-
}
97-
98-
SoundLayers = AudioUtility.CreateSoundLayerGroup(PartConfigNode.GetNodes("SOUNDLAYER"));
99-
10059
if (SoundLayerGroups.Count > 0)
10160
{
10261
foreach (var soundLayerGroup in SoundLayerGroups)
@@ -262,7 +221,7 @@ public void PlaySoundLayer(SoundLayer soundLayer, float control, float volume, b
262221

263222
if (source.isPlaying && soundLayer.loop)
264223
source.volume = 0;
265-
224+
266225
return;
267226
}
268227

@@ -342,15 +301,58 @@ public override void OnLoad(ConfigNode node)
342301
{
343302
base.OnLoad(node);
344303

345-
if (part.partInfo is null)
304+
if (part?.partInfo?.partPrefab != null)
305+
{
306+
var prefab = part.partInfo.partPrefab.FindModuleImplementing<RSE_Module>();
307+
308+
SoundLayerGroups = prefab.SoundLayerGroups;
309+
SoundLayers = prefab.SoundLayers;
310+
return;
311+
}
312+
313+
// Do the actual parsing during part compilation.
314+
315+
node.TryGetValue("volume", ref Volume);
316+
node.TryGetValue("DopplerFactor", ref DopplerFactor);
317+
318+
ConfigNode sim = null;
319+
if (node.TryGetNode("AIRSIMULATION", ref sim))
346320
{
347-
PartConfigNode = node;
321+
sim.TryGetValue("EnableCombFilter", ref EnableCombFilter);
322+
sim.TryGetValue("EnableLowpassFilter", ref EnableLowpassFilter);
323+
sim.TryGetValue("EnableDistortionFilter", ref EnableDistortionFilter);
324+
325+
sim.TryGetEnum("UpdateMode", ref AirSimUpdateMode, AirSimulationUpdate.Full);
326+
327+
sim.TryGetValue("FarLowpass", ref FarLowpass);
328+
sim.TryGetValue("MaxCombDelay", ref MaxCombDelay);
329+
sim.TryGetValue("MaxCombMix", ref MaxCombMix);
330+
sim.TryGetValue("MaxDistortion", ref MaxDistortion);
331+
sim.TryGetValue("AngleHighpass", ref AngleHighpass);
348332
}
349-
else
333+
334+
UseAirSimulation = !(!EnableLowpassFilter && !EnableCombFilter && !EnableDistortionFilter);
335+
336+
if (PrepareSoundLayers)
350337
{
351-
PartConfigNode = part.partInfo.partPrefab
352-
.FindModuleImplementing<RSE_Module>()
353-
.PartConfigNode;
338+
foreach (var lnode in node.GetNodes())
339+
{
340+
var soundLayers = AudioUtility.CreateSoundLayerGroup(lnode.GetNodes("SOUNDLAYER"));
341+
if (soundLayers.Count == 0) continue;
342+
343+
var groupName = lnode.name;
344+
345+
if (lnode.name == "SOUNDLAYERGROUP")
346+
{
347+
groupName = lnode.GetValue("name");
348+
}
349+
350+
if (SoundLayerGroups.ContainsKey(groupName)) { SoundLayerGroups[groupName].AddRange(soundLayers); continue; }
351+
352+
SoundLayerGroups.Add(groupName, soundLayers);
353+
}
354+
355+
SoundLayers = AudioUtility.CreateSoundLayerGroup(node.GetNodes("SOUNDLAYER"));
354356
}
355357
}
356358
}

Source/RocketSoundEnhancement/PartModules/RSE_Wheels.cs

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -35,27 +35,6 @@ public override void OnStart(StartState state)
3535

3636
base.OnStart(state);
3737

38-
if (PartConfigNode.HasNode("Motor"))
39-
{
40-
ConfigNode offLoadVolumeScaleNode;
41-
if ((offLoadVolumeScaleNode = PartConfigNode.GetNode("Motor").GetNode("offLoadVolumeScale")) != null && offLoadVolumeScaleNode.HasValues())
42-
{
43-
foreach (ConfigNode.Value node in offLoadVolumeScaleNode.values)
44-
{
45-
string soundLayerName = node.name;
46-
float value = float.Parse(node.value);
47-
48-
if (offLoadVolumeScale.ContainsKey(soundLayerName))
49-
{
50-
offLoadVolumeScale[soundLayerName] = value;
51-
continue;
52-
}
53-
54-
offLoadVolumeScale.Add(soundLayerName, value);
55-
}
56-
}
57-
}
58-
5938
moduleWheel = part.GetComponent<ModuleWheelBase>();
6039
moduleMotor = part.GetComponent<ModuleWheelMotor>();
6140
moduleDeploy = part.GetComponent<ModuleWheelDeployment>();
@@ -192,5 +171,41 @@ public override void FixedUpdate()
192171

193172
slipDisplacement = Mathf.Sqrt(x * x + y * y);
194173
}
174+
175+
public override void OnLoad(ConfigNode node)
176+
{
177+
base.OnLoad(node);
178+
179+
if (part?.partInfo?.partPrefab != null)
180+
{
181+
var prefab = part.partInfo.partPrefab.FindModuleImplementing<RSE_Wheels>();
182+
offLoadVolumeScale = prefab.offLoadVolumeScale;
183+
return;
184+
}
185+
186+
ConfigNode motor = null;
187+
if (node.TryGetNode("Motor", ref motor))
188+
{
189+
ConfigNode offLoadVolumeScaleNode = motor.GetNode("offLoadVolumeScale");
190+
191+
if (offLoadVolumeScaleNode != null && offLoadVolumeScaleNode.HasValue())
192+
{
193+
foreach (ConfigNode.Value vnode in offLoadVolumeScaleNode.values)
194+
{
195+
string soundLayerName = vnode.name;
196+
float value = float.Parse(vnode.value);
197+
198+
if (offLoadVolumeScale.ContainsKey(soundLayerName))
199+
{
200+
offLoadVolumeScale[soundLayerName] = value;
201+
continue;
202+
}
203+
204+
offLoadVolumeScale.Add(soundLayerName, value);
205+
}
206+
}
207+
}
208+
}
209+
195210
}
196211
}

Source/RocketSoundEnhancement/PartModules/ShipEffectsCollisions.cs

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,18 +31,8 @@ public override void OnStart(StartState state)
3131
{
3232
if (state == StartState.Editor || state == StartState.None)
3333
return;
34-
base.OnStart(state);
35-
36-
foreach (var node in PartConfigNode.GetNodes())
37-
{
38-
var soundLayerNodes = node.GetNodes("SOUNDLAYER");
39-
CollisionType collisionType;
4034

41-
if (Enum.TryParse(node.name, out collisionType))
42-
{
43-
SoundLayerCollisionGroups.Add(collisionType, AudioUtility.CreateSoundLayerGroup(soundLayerNodes));
44-
}
45-
}
35+
base.OnStart(state);
4636

4737
if (SoundLayerCollisionGroups.Count > 0)
4838
{
@@ -124,5 +114,28 @@ public void OnCollisionExit(Collision col)
124114
collisionType = CollisionType.CollisionExit;
125115
collision = col;
126116
}
117+
118+
public override void OnLoad(ConfigNode node)
119+
{
120+
base.OnLoad(node);
121+
122+
if (part?.partInfo?.partPrefab != null)
123+
{
124+
var prefab = part.partInfo.partPrefab.FindModuleImplementing<ShipEffectsCollisions>();
125+
126+
SoundLayerCollisionGroups = prefab.SoundLayerCollisionGroups;
127+
return;
128+
}
129+
130+
foreach (var child in node.GetNodes())
131+
{
132+
var soundLayerNodes = child.GetNodes("SOUNDLAYER");
133+
134+
if (Enum.TryParse(child.name, out CollisionType collisionType))
135+
{
136+
SoundLayerCollisionGroups.Add(collisionType, AudioUtility.CreateSoundLayerGroup(soundLayerNodes));
137+
}
138+
}
139+
}
127140
}
128141
}

0 commit comments

Comments
 (0)