Skip to content

Commit 1c91c8f

Browse files
committed
Reduce allocations in LevelCrossings
1 parent a23bd5c commit 1c91c8f

File tree

1 file changed

+15
-11
lines changed

1 file changed

+15
-11
lines changed

Source/Orts.Simulation/Simulation/LevelCrossing.cs

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,12 @@ void UpdateCrossings(Train train, float elapsedTime)
108108
// Separate tests are performed for present speed and for possible maximum speed to avoid anomolies if train accelerates.
109109
// Special test is also done to check on section availability to avoid closure beyond signal at danger.
110110

111-
foreach (var crossing in TrackCrossingItems.Values.Where(ci => ci.CrossingGroup != null))
111+
foreach (var key in TrackCrossingItems.Keys)
112112
{
113+
var crossing = TrackCrossingItems[key];
114+
if (crossing?.CrossingGroup == null)
115+
continue;
116+
113117
var predictedDist = crossing.CrossingGroup.WarningTime * absSpeedMpS;
114118
var maxPredictedDist = crossing.CrossingGroup.WarningTime * (maxSpeedMpS - absSpeedMpS) / 2; // added distance if train accelerates to maxspeed
115119
var minimumDist = crossing.CrossingGroup.MinimumDistance;
@@ -299,11 +303,15 @@ void UpdateCrossings(Train train, float elapsedTime)
299303
public LevelCrossingItem SearchNearLevelCrossing(Train train, float reqDist, bool trainForwards, out float frontDist)
300304
{
301305
LevelCrossingItem roadItem = LevelCrossingItem.None;
302-
frontDist = -1;
306+
frontDist = -1;
303307
Traveller traveller = trainForwards ? train.FrontTDBTraveller :
304308
new Traveller(train.RearTDBTraveller, Traveller.TravellerDirection.Backward);
305-
foreach (var crossing in TrackCrossingItems.Values.Where(ci => ci.CrossingGroup != null))
309+
foreach (var key in TrackCrossingItems.Keys)
306310
{
311+
var crossing = TrackCrossingItems[key];
312+
if (crossing?.CrossingGroup == null)
313+
continue;
314+
307315
if (crossing.Trains.Contains(train))
308316
{
309317
frontDist = crossing.DistanceTo(traveller, reqDist);
@@ -445,14 +453,10 @@ public bool HasTrain
445453
{
446454
get
447455
{
448-
bool trains = Items.Any(i => i.Trains.Count > 0);
449-
bool staticconsists = Items.Any(i => i.StaticConsists.Count > 0);
450-
if (trains && staticconsists)
451-
return true;
452-
else if (trains || staticconsists)
453-
return true;
454-
else
455-
return false;
456+
foreach (var item in Items)
457+
if (item.Trains.Count > 0 || item.StaticConsists.Count > 0)
458+
return true;
459+
return false;
456460
}
457461
}
458462
}

0 commit comments

Comments
 (0)