From 07547bbf729eeb9f8c02dcc96b143ea239f10786 Mon Sep 17 00:00:00 2001 From: Ethan Moffat Date: Sun, 7 May 2023 22:07:26 -0700 Subject: [PATCH] Reduce lambda usage in entity renderers. Reduces garbage collections --- .../MapItemLayerRenderer.cs | 7 +++++-- .../MapEntityRenderers/NPCEntityRenderer.cs | 8 +++++--- .../OtherCharacterEntityRenderer.cs | 19 +++++++++++-------- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/EndlessClient/Rendering/MapEntityRenderers/MapItemLayerRenderer.cs b/EndlessClient/Rendering/MapEntityRenderers/MapItemLayerRenderer.cs index 0933ca119..2d7072e11 100644 --- a/EndlessClient/Rendering/MapEntityRenderers/MapItemLayerRenderer.cs +++ b/EndlessClient/Rendering/MapEntityRenderers/MapItemLayerRenderer.cs @@ -32,14 +32,15 @@ public MapItemLayerRenderer(ICharacterProvider characterProvider, protected override bool ElementExistsAt(int row, int col) { - return _currentMapStateProvider.MapItems.Any(item => item.X == col && item.Y == row); + return _currentMapStateProvider.MapItems.Any(IsItemAt); + bool IsItemAt(MapItem item) => item.X == col && item.Y == row; } public override void RenderElementAt(SpriteBatch spriteBatch, int row, int col, int alpha, Vector2 additionalOffset = default) { var items = _currentMapStateProvider .MapItems - .Where(item => item.X == col && item.Y == row) + .Where(IsItemAt) .OrderBy(item => item.UniqueID); foreach (var item in items) @@ -53,6 +54,8 @@ public override void RenderElementAt(SpriteBatch spriteBatch, int row, int col, itemPos.Y - (int) Math.Round(itemTexture.Height/2.0)) + additionalOffset, Color.FromNonPremultiplied(255, 255, 255, alpha)); } + + bool IsItemAt(MapItem item) => item.X == col && item.Y == row; } protected override Vector2 GetDrawCoordinatesFromGridUnits(int gridX, int gridY) diff --git a/EndlessClient/Rendering/MapEntityRenderers/NPCEntityRenderer.cs b/EndlessClient/Rendering/MapEntityRenderers/NPCEntityRenderer.cs index dba818d45..f8f5b37e0 100644 --- a/EndlessClient/Rendering/MapEntityRenderers/NPCEntityRenderer.cs +++ b/EndlessClient/Rendering/MapEntityRenderers/NPCEntityRenderer.cs @@ -29,14 +29,14 @@ public NPCEntityRenderer(ICharacterProvider characterProvider, protected override bool ElementExistsAt(int row, int col) { - return _npcRendererProvider.NPCRenderers.Values - .Count(n => IsNpcAt(n.NPC, row, col)) > 0; + return _npcRendererProvider.NPCRenderers.Values.Any(IsNpcAt); + bool IsNpcAt(INPCRenderer rend) => NPCEntityRenderer.IsNpcAt(rend.NPC, row, col); } public override void RenderElementAt(SpriteBatch spriteBatch, int row, int col, int alpha, Vector2 additionalOffset = default) { var indicesToRender = _npcRendererProvider.NPCRenderers.Values - .Where(n => IsNpcAt(n.NPC, row, col)) + .Where(IsNpcAt) .Select(n => n.NPC.Index); foreach (var index in indicesToRender) @@ -49,6 +49,8 @@ public override void RenderElementAt(SpriteBatch spriteBatch, int row, int col, var renderer = _npcRendererProvider.NPCRenderers[index]; renderer.DrawToSpriteBatch(spriteBatch); } + + bool IsNpcAt(INPCRenderer rend) => NPCEntityRenderer.IsNpcAt(rend.NPC, row, col); } private static bool IsNpcAt(EOLib.Domain.NPC.NPC npc, int row, int col) diff --git a/EndlessClient/Rendering/MapEntityRenderers/OtherCharacterEntityRenderer.cs b/EndlessClient/Rendering/MapEntityRenderers/OtherCharacterEntityRenderer.cs index dfe825bdc..e27c6aaf9 100644 --- a/EndlessClient/Rendering/MapEntityRenderers/OtherCharacterEntityRenderer.cs +++ b/EndlessClient/Rendering/MapEntityRenderers/OtherCharacterEntityRenderer.cs @@ -1,5 +1,4 @@ using EndlessClient.Rendering.Character; -using EndlessClient.Rendering.Chat; using EndlessClient.Rendering.Map; using EOLib.Domain.Character; using Microsoft.Xna.Framework; @@ -31,16 +30,19 @@ public OtherCharacterEntityRenderer(ICharacterProvider characterProvider, protected override bool ElementExistsAt(int row, int col) { return _characterStateCache.OtherCharacters.Values - .Select(x => x.RenderProperties) - .Any(c => c.MapY == row && c.MapX == col); + .Any(IsCharAt); + + bool IsCharAt(EOLib.Domain.Character.Character c) => OtherCharacterEntityRenderer.IsCharAt(c, row, col); } public override void RenderElementAt(SpriteBatch spriteBatch, int row, int col, int alpha, Vector2 additionalOffset = default) { - var idsToRender = _characterStateCache.OtherCharacters.Keys.Where(k => IsAtPosition(k, row, col)); + var toRender = _characterStateCache.OtherCharacters.Values.Where(IsCharAt); - foreach (var id in idsToRender) + foreach (var rend in toRender) { + var id = rend.ID; + if (!_characterRendererProvider.CharacterRenderers.ContainsKey(id) || _characterRendererProvider.CharacterRenderers[id] == null) return; @@ -48,11 +50,12 @@ public override void RenderElementAt(SpriteBatch spriteBatch, int row, int col, var renderer = _characterRendererProvider.CharacterRenderers[id]; renderer.DrawToSpriteBatch(spriteBatch); } + + bool IsCharAt(EOLib.Domain.Character.Character c) => OtherCharacterEntityRenderer.IsCharAt(c, row, col); } - private bool IsAtPosition(int characterId, int row, int col) + private static bool IsCharAt(EOLib.Domain.Character.Character c, int row, int col) { - var rp = _characterStateCache.OtherCharacters[characterId].RenderProperties; - return row == rp.MapY && col == rp.MapX; + return row == c.Y && col == c.X; } } } \ No newline at end of file