less locking for screen connection, force more concurrency

This commit is contained in:
Vinzenz Schroeter 2024-04-30 23:49:39 +02:00 committed by RobbersDaughter
parent 0b10695e07
commit 0e93b1356f
10 changed files with 143 additions and 93 deletions

View file

@ -4,25 +4,30 @@ using TanksServer.Graphics;
namespace TanksServer.Interactivity;
internal sealed class PlayerScreenData(ILogger logger)
internal sealed class PlayerScreenData(ILogger logger, Player player)
{
private readonly Memory<byte> _data = new byte[MapService.PixelsPerRow * MapService.PixelsPerColumn / 2];
private int _count;
public void Clear()
public ReadOnlyMemory<byte> Build(GamePixelGrid gamePixelGrid)
{
_count = 0;
_data.Span.Clear();
}
Clear();
foreach (var gamePixel in gamePixelGrid)
{
if (!gamePixel.EntityType.HasValue)
continue;
Add(gamePixel.EntityType.Value, gamePixel.BelongsTo == player);
}
public ReadOnlyMemory<byte> GetPacket()
{
var index = _count / 2 + (_count % 2 == 0 ? 0 : 1);
logger.LogTrace("packet length: {} (count={})", index, _count);
if (logger.IsEnabled(LogLevel.Trace))
logger.LogTrace("packet length: {} (count={})", index, _count);
return _data[..index];
}
public void Add(GamePixelEntityType entityKind, bool isCurrentPlayer)
private void Add(GamePixelEntityType entityKind, bool isCurrentPlayer)
{
var result = (byte)(isCurrentPlayer ? 0x1 : 0x0);
var kind = (byte)entityKind;
@ -36,4 +41,10 @@ internal sealed class PlayerScreenData(ILogger logger)
_data.Span[index] = result;
_count++;
}
private void Clear()
{
_count = 0;
_data.Span.Clear();
}
}