Skip to content

Commit

Permalink
Reduce lambda usage in entity renderers. Reduces garbage collections
Browse files Browse the repository at this point in the history
  • Loading branch information
ethanmoffat committed May 8, 2023
1 parent 1300e6f commit 07547bb
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using EndlessClient.Rendering.Character;
using EndlessClient.Rendering.Chat;
using EndlessClient.Rendering.Map;
using EOLib.Domain.Character;
using Microsoft.Xna.Framework;
Expand Down Expand Up @@ -31,28 +30,32 @@ 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;

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;
}
}
}

0 comments on commit 07547bb

Please sign in to comment.