RunUnsynced, do not recalculate sync hash on reentry. Cache debug settings.

This commit is contained in:
Vapre
2021-08-13 20:19:40 +02:00
committed by teinarss
parent b3159d7515
commit 5ae4662f08
7 changed files with 29 additions and 18 deletions

View File

@@ -40,6 +40,7 @@ namespace OpenRA
public static Settings Settings; public static Settings Settings;
public static CursorManager Cursor; public static CursorManager Cursor;
public static bool HideCursor; public static bool HideCursor;
static WorldRenderer worldRenderer; static WorldRenderer worldRenderer;
static string modLaunchWrapper; static string modLaunchWrapper;
@@ -589,7 +590,7 @@ namespace OpenRA
if (Ui.LastTickTime.ShouldAdvance(tick)) if (Ui.LastTickTime.ShouldAdvance(tick))
{ {
Ui.LastTickTime.AdvanceTickTime(tick); Ui.LastTickTime.AdvanceTickTime(tick);
Sync.RunUnsynced(Settings.Debug.SyncCheckUnsyncedCode, world, Ui.Tick); Sync.RunUnsynced(world, Ui.Tick);
Cursor.Tick(); Cursor.Tick();
} }
@@ -601,14 +602,14 @@ namespace OpenRA
Sound.Tick(); Sound.Tick();
Sync.RunUnsynced(Settings.Debug.SyncCheckUnsyncedCode, world, orderManager.TickImmediate); Sync.RunUnsynced(world, orderManager.TickImmediate);
if (world == null) if (world == null)
return; return;
if (orderManager.TryTick()) if (orderManager.TryTick())
{ {
Sync.RunUnsynced(Settings.Debug.SyncCheckUnsyncedCode, world, () => Sync.RunUnsynced(world, () =>
{ {
world.OrderGenerator.Tick(world); world.OrderGenerator.Tick(world);
}); });
@@ -620,7 +621,7 @@ namespace OpenRA
// Wait until we have done our first world Tick before TickRendering // Wait until we have done our first world Tick before TickRendering
if (orderManager.LocalFrameNumber > 0) if (orderManager.LocalFrameNumber > 0)
Sync.RunUnsynced(Settings.Debug.SyncCheckUnsyncedCode, world, () => world.TickRender(worldRenderer)); Sync.RunUnsynced(world, () => world.TickRender(worldRenderer));
} }
benchmark?.Tick(LocalTick); benchmark?.Tick(LocalTick);

View File

@@ -37,17 +37,17 @@ namespace OpenRA
public void OnKeyInput(KeyInput input) public void OnKeyInput(KeyInput input)
{ {
Sync.RunUnsynced(Game.Settings.Debug.SyncCheckUnsyncedCode, world, () => Ui.HandleKeyPress(input)); Sync.RunUnsynced(world, () => Ui.HandleKeyPress(input));
} }
public void OnTextInput(string text) public void OnTextInput(string text)
{ {
Sync.RunUnsynced(Game.Settings.Debug.SyncCheckUnsyncedCode, world, () => Ui.HandleTextInput(text)); Sync.RunUnsynced(world, () => Ui.HandleTextInput(text));
} }
public void OnMouseInput(MouseInput input) public void OnMouseInput(MouseInput input)
{ {
Sync.RunUnsynced(Game.Settings.Debug.SyncCheckUnsyncedCode, world, () => Ui.HandleInput(input)); Sync.RunUnsynced(world, () => Ui.HandleInput(input));
} }
} }

View File

@@ -161,6 +161,11 @@ namespace OpenRA
return t.GetHashCode(); return t.GetHashCode();
} }
public static void RunUnsynced(World world, Action fn)
{
RunUnsynced(Game.Settings.Debug.SyncCheckUnsyncedCode, world, () => { fn(); return true; });
}
public static void RunUnsynced(bool checkSyncHash, World world, Action fn) public static void RunUnsynced(bool checkSyncHash, World world, Action fn)
{ {
RunUnsynced(checkSyncHash, world, () => { fn(); return true; }); RunUnsynced(checkSyncHash, world, () => { fn(); return true; });
@@ -168,13 +173,18 @@ namespace OpenRA
static bool inUnsyncedCode = false; static bool inUnsyncedCode = false;
public static T RunUnsynced<T>(World world, Func<T> fn)
{
return RunUnsynced(Game.Settings.Debug.SyncCheckUnsyncedCode, world, fn);
}
public static T RunUnsynced<T>(bool checkSyncHash, World world, Func<T> fn) public static T RunUnsynced<T>(bool checkSyncHash, World world, Func<T> fn)
{ {
if (world == null) // PERF: Detect sync changes in top level entry point only. Do not recalculate sync hash during reentry.
if (inUnsyncedCode || world == null)
return fn(); return fn();
var sync = checkSyncHash ? world.SyncHash() : 0; var sync = checkSyncHash ? world.SyncHash() : 0;
var prevInUnsyncedCode = inUnsyncedCode;
inUnsyncedCode = true; inUnsyncedCode = true;
try try
@@ -183,7 +193,7 @@ namespace OpenRA
} }
finally finally
{ {
inUnsyncedCode = prevInUnsyncedCode; inUnsyncedCode = false;
if (checkSyncHash && sync != world.SyncHash()) if (checkSyncHash && sync != world.SyncHash())
throw new InvalidOperationException("RunUnsynced: sync-changing code may not run here"); throw new InvalidOperationException("RunUnsynced: sync-changing code may not run here");
} }

View File

@@ -85,7 +85,7 @@ namespace OpenRA.Mods.Common.Traits
var optionsButton = root.GetOrNull<MenuButtonWidget>("OPTIONS_BUTTON"); var optionsButton = root.GetOrNull<MenuButtonWidget>("OPTIONS_BUTTON");
world.SetPauseState(false); world.SetPauseState(false);
if (optionsButton != null) if (optionsButton != null)
Sync.RunUnsynced(Game.Settings.Debug.SyncCheckUnsyncedCode, world, optionsButton.OnClick); Sync.RunUnsynced(world, optionsButton.OnClick);
} }
} }
} }

View File

@@ -56,7 +56,7 @@ namespace OpenRA.Mods.Common.Traits
foreach (var sel in a.TraitsImplementing<INotifySelected>()) foreach (var sel in a.TraitsImplementing<INotifySelected>())
sel.Selected(a); sel.Selected(a);
Sync.RunUnsynced(Game.Settings.Debug.SyncCheckUnsyncedCode, world, () => world.OrderGenerator.SelectionChanged(world, actors)); Sync.RunUnsynced(world, () => world.OrderGenerator.SelectionChanged(world, actors));
foreach (var ns in worldNotifySelection) foreach (var ns in worldNotifySelection)
ns.SelectionChanged(); ns.SelectionChanged();
} }
@@ -66,7 +66,7 @@ namespace OpenRA.Mods.Common.Traits
if (actors.Remove(a)) if (actors.Remove(a))
{ {
UpdateHash(); UpdateHash();
Sync.RunUnsynced(Game.Settings.Debug.SyncCheckUnsyncedCode, world, () => world.OrderGenerator.SelectionChanged(world, actors)); Sync.RunUnsynced(world, () => world.OrderGenerator.SelectionChanged(world, actors));
foreach (var ns in worldNotifySelection) foreach (var ns in worldNotifySelection)
ns.SelectionChanged(); ns.SelectionChanged();
} }
@@ -121,7 +121,7 @@ namespace OpenRA.Mods.Common.Traits
foreach (var sel in a.TraitsImplementing<INotifySelected>()) foreach (var sel in a.TraitsImplementing<INotifySelected>())
sel.Selected(a); sel.Selected(a);
Sync.RunUnsynced(Game.Settings.Debug.SyncCheckUnsyncedCode, world, () => world.OrderGenerator.SelectionChanged(world, actors)); Sync.RunUnsynced(world, () => world.OrderGenerator.SelectionChanged(world, actors));
foreach (var ns in worldNotifySelection) foreach (var ns in worldNotifySelection)
ns.SelectionChanged(); ns.SelectionChanged();
@@ -148,7 +148,7 @@ namespace OpenRA.Mods.Common.Traits
{ {
actors.Clear(); actors.Clear();
UpdateHash(); UpdateHash();
Sync.RunUnsynced(Game.Settings.Debug.SyncCheckUnsyncedCode, world, () => world.OrderGenerator.SelectionChanged(world, actors)); Sync.RunUnsynced(world, () => world.OrderGenerator.SelectionChanged(world, actors));
foreach (var ns in worldNotifySelection) foreach (var ns in worldNotifySelection)
ns.SelectionChanged(); ns.SelectionChanged();
} }
@@ -170,7 +170,7 @@ namespace OpenRA.Mods.Common.Traits
if (removed > 0) if (removed > 0)
{ {
UpdateHash(); UpdateHash();
Sync.RunUnsynced(Game.Settings.Debug.SyncCheckUnsyncedCode, world, () => world.OrderGenerator.SelectionChanged(world, actors)); Sync.RunUnsynced(world, () => world.OrderGenerator.SelectionChanged(world, actors));
foreach (var ns in worldNotifySelection) foreach (var ns in worldNotifySelection)
ns.SelectionChanged(); ns.SelectionChanged();
} }

View File

@@ -74,7 +74,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
var optionsButton = playerRoot.GetOrNull<MenuButtonWidget>("OPTIONS_BUTTON"); var optionsButton = playerRoot.GetOrNull<MenuButtonWidget>("OPTIONS_BUTTON");
if (optionsButton != null) if (optionsButton != null)
Sync.RunUnsynced(Game.Settings.Debug.SyncCheckUnsyncedCode, world, optionsButton.OnClick); Sync.RunUnsynced(world, optionsButton.OnClick);
}; };
} }
} }

View File

@@ -211,7 +211,7 @@ namespace OpenRA.Mods.Common.Widgets
public override string GetCursor(int2 screenPos) public override string GetCursor(int2 screenPos)
{ {
return Sync.RunUnsynced(Game.Settings.Debug.SyncCheckUnsyncedCode, World, () => return Sync.RunUnsynced(World, () =>
{ {
// Always show an arrow while selecting // Always show an arrow while selecting
if (IsValidDragbox) if (IsValidDragbox)