Skip to content

Commit 63eccbb

Browse files
authored
Merge pull request #34 from blattersturm/fix/menu-visibility-performance
Profiler hot path fix: unneeded LINQ .Any invocation
2 parents c23651e + 8503ddc commit 63eccbb

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

MenuAPI/Menu.cs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,8 @@ protected virtual void DynamicListItemSelectEvent(Menu menu, MenuDynamicListItem
328328

329329
private int index = 0;
330330

331+
private bool visible = false;
332+
331333
public int ViewIndexOffset { get; private set; } = 0;
332334

333335
private List<MenuItem> VisibleMenuItems
@@ -371,7 +373,26 @@ private List<MenuItem> VisibleMenuItems
371373

372374
public int Size => filterActive ? FilterItems.Count : MenuItems.Count;
373375

374-
public bool Visible { get; set; } = false;
376+
public bool Visible
377+
{
378+
get
379+
{
380+
return visible;
381+
}
382+
set
383+
{
384+
if (value)
385+
{
386+
MenuController.VisibleMenus.Add(this);
387+
}
388+
else
389+
{
390+
MenuController.VisibleMenus.Remove(this);
391+
}
392+
393+
visible = value;
394+
}
395+
}
375396

376397
#if FIVEM
377398
public bool LeftAligned => MenuController.MenuAlignment == MenuController.MenuAlignmentOption.Left;

MenuAPI/MenuController.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ namespace MenuAPI
1313
public class MenuController : BaseScript
1414
{
1515
public static List<Menu> Menus { get; protected set; } = new List<Menu>();
16+
internal static HashSet<Menu> VisibleMenus { get; } = new HashSet<Menu>();
1617
#if FIVEM
1718
public const string _texture_dict = "commonmenu";
1819
public const string _header_texture = "interaction_bgd";
@@ -52,11 +53,11 @@ public class MenuController : BaseScript
5253
public static float ScreenHeight => 1080;
5354
public static bool DisableMenuButtons { get; set; } = false;
5455
#if FIVEM
55-
public static bool AreMenuButtonsEnabled => Menus.Any((m) => m.Visible) && !Game.IsPaused && CitizenFX.Core.UI.Screen.Fading.IsFadedIn && !IsPlayerSwitchInProgress() && !DisableMenuButtons && !Game.Player.IsDead;
56+
public static bool AreMenuButtonsEnabled => IsAnyMenuOpen() && !Game.IsPaused && CitizenFX.Core.UI.Screen.Fading.IsFadedIn && !IsPlayerSwitchInProgress() && !DisableMenuButtons && !Game.Player.IsDead;
5657
#endif
5758
#if REDM
5859
public static bool AreMenuButtonsEnabled =>
59-
Menus.Any((m) => m.Visible) &&
60+
IsAnyMenuOpen() &&
6061
!Call<bool>(IS_PAUSE_MENU_ACTIVE) &&
6162
Call<bool>(IS_SCREEN_FADED_IN) &&
6263
!DisableMenuButtons &&
@@ -268,16 +269,16 @@ private static void UnloadAssets()
268269
/// <returns></returns>
269270
public static Menu GetCurrentMenu()
270271
{
271-
if (Menus.Any((m) => m.Visible))
272-
return Menus.Find((m) => m.Visible);
272+
if (IsAnyMenuOpen())
273+
return VisibleMenus.FirstOrDefault();
273274
return null;
274275
}
275276

276277
/// <summary>
277278
/// Returns true if any menu is currently open.
278279
/// </summary>
279280
/// <returns></returns>
280-
public static bool IsAnyMenuOpen() => Menus.Any((m) => m.Visible);
281+
public static bool IsAnyMenuOpen() => VisibleMenus.Count > 0;
281282

282283

283284
#region Process Menu Buttons

0 commit comments

Comments
 (0)