From 889e2152a4712a6bcce43a3f0de8b85e1bd09163 Mon Sep 17 00:00:00 2001 From: abcdefg30 Date: Fri, 22 May 2020 13:47:35 +0200 Subject: [PATCH] Cache ProjectedCellBounds during load time --- OpenRA.Game/Map/Map.cs | 6 ++++-- OpenRA.Game/Traits/Player/Shroud.cs | 8 ++++---- OpenRA.Mods.Common/Traits/RevealsMap.cs | 3 +-- OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs | 4 ++-- OpenRA.Mods.Common/Widgets/RadarWidget.cs | 2 +- 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/OpenRA.Game/Map/Map.cs b/OpenRA.Game/Map/Map.cs index cf101e3856..b85bb89c54 100644 --- a/OpenRA.Game/Map/Map.cs +++ b/OpenRA.Game/Map/Map.cs @@ -233,7 +233,7 @@ namespace OpenRA public CellLayer Ramp { get; private set; } public CellLayer CustomTerrain { get; private set; } - public ProjectedCellRegion ProjectedCellBounds { get; private set; } + public PPos[] ProjectedCells { get; private set; } public CellRegion AllCells { get; private set; } public List AllEdgeCells { get; private set; } @@ -822,6 +822,7 @@ namespace OpenRA foreach (var puv in projectedCells) if (!Contains(puv)) return false; + return true; } @@ -1017,7 +1018,8 @@ namespace OpenRA ProjectedBottomRight = new WPos(br.U * 1024 - 1, (br.V + 1) * 1024 - 1, 0); } - ProjectedCellBounds = new ProjectedCellRegion(this, tl, br); + // PERF: This enumeration isn't going to change during the game + ProjectedCells = new ProjectedCellRegion(this, tl, br).ToArray(); } public void FixOpenAreas() diff --git a/OpenRA.Game/Traits/Player/Shroud.cs b/OpenRA.Game/Traits/Player/Shroud.cs index 99e5962c71..a69ce2315b 100644 --- a/OpenRA.Game/Traits/Player/Shroud.cs +++ b/OpenRA.Game/Traits/Player/Shroud.cs @@ -162,7 +162,7 @@ namespace OpenRA.Traits if (OnShroudChanged == null) return; - foreach (var puv in map.ProjectedCellBounds) + foreach (var puv in map.ProjectedCells) { if (!touched[puv]) continue; @@ -298,7 +298,7 @@ namespace OpenRA.Traits if (map.Bounds != s.map.Bounds) throw new ArgumentException("The map bounds of these shrouds do not match.", "s"); - foreach (var puv in map.ProjectedCellBounds) + foreach (var puv in map.ProjectedCells) { if (!explored[puv] && s.explored[puv]) { @@ -310,7 +310,7 @@ namespace OpenRA.Traits public void ExploreAll() { - foreach (var puv in map.ProjectedCellBounds) + foreach (var puv in map.ProjectedCells) { if (!explored[puv]) { @@ -322,7 +322,7 @@ namespace OpenRA.Traits public void ResetExploration() { - foreach (var puv in map.ProjectedCellBounds) + foreach (var puv in map.ProjectedCells) { touched[puv] = true; explored[puv] = (visibleCount[puv] + passiveVisibleCount[puv]) > 0; diff --git a/OpenRA.Mods.Common/Traits/RevealsMap.cs b/OpenRA.Mods.Common/Traits/RevealsMap.cs index 2f2c673ccb..28a74898f8 100644 --- a/OpenRA.Mods.Common/Traits/RevealsMap.cs +++ b/OpenRA.Mods.Common/Traits/RevealsMap.cs @@ -49,8 +49,7 @@ namespace OpenRA.Mods.Common.Traits protected PPos[] ProjectedCells(Actor self) { - var map = self.World.Map; - return map.ProjectedCellBounds.ToArray(); + return self.World.Map.ProjectedCells; } void INotifyActorDisposing.Disposing(Actor self) diff --git a/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs b/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs index 7b8ae1bb54..ea79e49fe8 100644 --- a/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs +++ b/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs @@ -271,7 +271,7 @@ namespace OpenRA.Mods.Common.Traits UpdateShroud(new ProjectedCellRegion(map, tl, br)); } - void UpdateShroud(ProjectedCellRegion region) + void UpdateShroud(IEnumerable region) { foreach (var puv in region) { @@ -299,7 +299,7 @@ namespace OpenRA.Mods.Common.Traits void IRenderShroud.RenderShroud(WorldRenderer wr) { - UpdateShroud(map.ProjectedCellBounds); + UpdateShroud(map.ProjectedCells); fogLayer.Draw(wr.Viewport); shroudLayer.Draw(wr.Viewport); } diff --git a/OpenRA.Mods.Common/Widgets/RadarWidget.cs b/OpenRA.Mods.Common/Widgets/RadarWidget.cs index 2de2650884..5958879f0b 100644 --- a/OpenRA.Mods.Common/Widgets/RadarWidget.cs +++ b/OpenRA.Mods.Common/Widgets/RadarWidget.cs @@ -134,7 +134,7 @@ namespace OpenRA.Mods.Common.Widgets if (newShroud != null) { newShroud.OnShroudChanged += UpdateShroudCell; - foreach (var puv in world.Map.ProjectedCellBounds) + foreach (var puv in world.Map.ProjectedCells) UpdateShroudCell(puv); }