From 8503ddcbaa94bde3ec9b481e1bda9fcf79bc480c Mon Sep 17 00:00:00 2001 From: blattersturm Date: Wed, 28 Oct 2020 11:38:07 +0100 Subject: [PATCH] Profiler hot path fix: unneeded LINQ .Any invocation --- MenuAPI/Menu.cs | 23 ++++++++++++++++++++++- MenuAPI/MenuController.cs | 11 ++++++----- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/MenuAPI/Menu.cs b/MenuAPI/Menu.cs index 82ba90a..50ede28 100644 --- a/MenuAPI/Menu.cs +++ b/MenuAPI/Menu.cs @@ -328,6 +328,8 @@ protected virtual void DynamicListItemSelectEvent(Menu menu, MenuDynamicListItem private int index = 0; + private bool visible = false; + public int ViewIndexOffset { get; private set; } = 0; private List VisibleMenuItems @@ -371,7 +373,26 @@ private List VisibleMenuItems public int Size => filterActive ? FilterItems.Count : MenuItems.Count; - public bool Visible { get; set; } = false; + public bool Visible + { + get + { + return visible; + } + set + { + if (value) + { + MenuController.VisibleMenus.Add(this); + } + else + { + MenuController.VisibleMenus.Remove(this); + } + + visible = value; + } + } #if FIVEM public bool LeftAligned => MenuController.MenuAlignment == MenuController.MenuAlignmentOption.Left; diff --git a/MenuAPI/MenuController.cs b/MenuAPI/MenuController.cs index c3717d4..bb044f5 100644 --- a/MenuAPI/MenuController.cs +++ b/MenuAPI/MenuController.cs @@ -13,6 +13,7 @@ namespace MenuAPI public class MenuController : BaseScript { public static List Menus { get; protected set; } = new List(); + internal static HashSet VisibleMenus { get; } = new HashSet(); #if FIVEM public const string _texture_dict = "commonmenu"; public const string _header_texture = "interaction_bgd"; @@ -52,11 +53,11 @@ public class MenuController : BaseScript public static float ScreenHeight => 1080; public static bool DisableMenuButtons { get; set; } = false; #if FIVEM - public static bool AreMenuButtonsEnabled => Menus.Any((m) => m.Visible) && !Game.IsPaused && CitizenFX.Core.UI.Screen.Fading.IsFadedIn && !IsPlayerSwitchInProgress() && !DisableMenuButtons && !Game.Player.IsDead; + public static bool AreMenuButtonsEnabled => IsAnyMenuOpen() && !Game.IsPaused && CitizenFX.Core.UI.Screen.Fading.IsFadedIn && !IsPlayerSwitchInProgress() && !DisableMenuButtons && !Game.Player.IsDead; #endif #if REDM public static bool AreMenuButtonsEnabled => - Menus.Any((m) => m.Visible) && + IsAnyMenuOpen() && !Call(IS_PAUSE_MENU_ACTIVE) && Call(IS_SCREEN_FADED_IN) && !DisableMenuButtons && @@ -268,8 +269,8 @@ private static void UnloadAssets() /// public static Menu GetCurrentMenu() { - if (Menus.Any((m) => m.Visible)) - return Menus.Find((m) => m.Visible); + if (IsAnyMenuOpen()) + return VisibleMenus.FirstOrDefault(); return null; } @@ -277,7 +278,7 @@ public static Menu GetCurrentMenu() /// Returns true if any menu is currently open. /// /// - public static bool IsAnyMenuOpen() => Menus.Any((m) => m.Visible); + public static bool IsAnyMenuOpen() => VisibleMenus.Count > 0; #region Process Menu Buttons