the need for speed

This commit is contained in:
rootdarkarchon
2023-04-29 23:32:54 +02:00
parent de2cd97dbe
commit 3715ca5ce3
8 changed files with 82 additions and 102 deletions

View File

@@ -11,7 +11,6 @@ using MareSynchronos.Services.Mediator;
using MareSynchronos.Utils;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System.Globalization;
using System.Numerics;
using System.Runtime.CompilerServices;
using GameObject = FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject;
@@ -31,7 +30,7 @@ public class DalamudUtilService : IHostedService
private readonly List<uint> ClassJobIdsIgnoredForPets = new() { 30 };
private uint? _classJobId = 0;
private DateTime _delayedFrameworkUpdateCheck = DateTime.Now;
private Dictionary<string, IntPtr> _playerCharas = new(StringComparer.Ordinal);
private Dictionary<string, PlayerCharacter> _playerCharas = new(StringComparer.Ordinal);
private bool _sentBetweenAreas = false;
public DalamudUtilService(ILogger<DalamudUtilService> logger, ClientState clientState, ObjectTable objectTable, Framework framework,
@@ -113,17 +112,12 @@ public class DalamudUtilService : IHostedService
return await RunOnFrameworkThread(() => GetPetInternal(playerPointer)).ConfigureAwait(false);
}
public IntPtr GetPlayerCharacterFromObjectTableByName(string characterName, uint worldid)
public IntPtr GetPlayerCharacterFromObjectTableByIdent(string characterName)
{
if (_playerCharas.TryGetValue(characterName + worldid.ToString(CultureInfo.InvariantCulture), out var pchar)) return pchar;
if (_playerCharas.TryGetValue(characterName, out var pchar)) return pchar.Address;
return IntPtr.Zero;
}
public List<PlayerCharacter> GetPlayerCharacters()
{
return _objectTable.OfType<PlayerCharacter>().ToList();
}
public unsafe bool IsGameObjectPresent(IntPtr key)
{
return _objectTable.Any(f => f.Address == key);
@@ -238,7 +232,8 @@ public class DalamudUtilService : IHostedService
internal PlayerCharacter? FindPlayerByNameHash(string ident)
{
return _objectTable.OfType<PlayerCharacter>().FirstOrDefault(p => p.GetHash256().Equals(ident, StringComparison.Ordinal));
_playerCharas.TryGetValue(ident, out var result);
return result;
}
private void FrameworkOnUpdate(Framework framework)
@@ -250,7 +245,7 @@ public class DalamudUtilService : IHostedService
{
if (_clientState.LocalPlayer?.IsDead ?? false) return;
_playerCharas = _objectTable.OfType<PlayerCharacter>().ToDictionary(p => p.Name.ToString() + p.HomeWorld.Id.ToString(), p => p.Address, StringComparer.Ordinal);
_playerCharas = _performanceCollector.LogPerformance(this, "ObjTableToCharas", () => _objectTable.OfType<PlayerCharacter>().ToDictionary(p => p.GetHash256(), p => p, StringComparer.Ordinal));
if (GposeTarget != null && !IsInGpose)
{

View File

@@ -160,7 +160,7 @@ public sealed class MareMediator : IHostedService
private void ExecuteSubscriber<T>(SubscriberAction subscriber, T message) where T : MessageBase
{
var isSameThread = message.KeepThreadContext ? "$" : string.Empty;
_performanceCollector.LogPerformance(this, $"{isSameThread}Execute>{message.GetType().Name}+{subscriber.Subscriber.GetType().Name}", () => ((Action<T>)subscriber.Action).Invoke(message));
_performanceCollector.LogPerformance(this, $"{isSameThread}Execute>{message.GetType().Name}+{subscriber.Subscriber.GetType().Name}>{subscriber.Subscriber}", () => ((Action<T>)subscriber.Action).Invoke(message));
}
private sealed class SubscriberAction

View File

@@ -30,7 +30,7 @@ public record DisconnectedMessage : SameThreadMessage;
public record PenumbraModSettingChangedMessage : MessageBase;
public record PenumbraInitializedMessage : MessageBase;
public record PenumbraDisposedMessage : MessageBase;
public record PenumbraRedrawMessage(IntPtr Address, int ObjTblIdx, bool WasRequested) : MessageBase;
public record PenumbraRedrawMessage(IntPtr Address, int ObjTblIdx, bool WasRequested) : SameThreadMessage;
public record HeelsOffsetMessage : MessageBase;
public record PenumbraResourceLoadMessage(IntPtr GameObject, string GamePath, string FilePath) : SameThreadMessage;
public record CustomizePlusMessage : MessageBase;

View File

@@ -130,22 +130,14 @@ public sealed class PerformanceCollectorService : IHostedService
sb.Append((" " + TimeSpan.FromTicks(pastEntries.Max(m => m.Item2)).TotalMilliseconds.ToString("0.00000", CultureInfo.InvariantCulture)).PadRight(15));
sb.Append('|');
sb.Append((" " + TimeSpan.FromTicks((long)pastEntries.Average(m => m.Item2)).TotalMilliseconds.ToString("0.00000", CultureInfo.InvariantCulture)).PadRight(15));
}
else
{
sb.Append(" -".PadRight(15));
sb.Append('|');
sb.Append(" -".PadRight(15));
sb.Append((" " + (pastEntries.LastOrDefault()?.Item1.ToString("HH:mm:ss.ffff", CultureInfo.InvariantCulture) ?? "-")).PadRight(15, ' '));
sb.Append('|');
sb.Append(" -".PadRight(15));
sb.Append((" " + pastEntries.Count).PadRight(10));
sb.Append('|');
sb.Append(' ').Append(entry.Key);
sb.AppendLine();
}
sb.Append('|');
sb.Append((" " + (pastEntries.LastOrDefault()?.Item1.ToString("HH:mm:ss.ffff", CultureInfo.InvariantCulture) ?? "-")).PadRight(15, ' '));
sb.Append('|');
sb.Append((" " + pastEntries.Count).PadRight(10));
sb.Append('|');
sb.Append(' ').Append(entry.Key);
sb.AppendLine();
previousCaller = newCaller;
}
@@ -182,9 +174,9 @@ public sealed class PerformanceCollectorService : IHostedService
try
{
var last = entries.Value.ToList()[^1];
if (last.Item1.AddMinutes(10) < TimeOnly.FromDateTime(DateTime.Now))
if (last.Item1.AddMinutes(10) < TimeOnly.FromDateTime(DateTime.Now) && !_performanceCounters.TryRemove(entries.Key, out _))
{
_performanceCounters.Remove(entries.Key, out _);
_logger.LogDebug("Could not remove performance counter {counter}", entries.Key);
}
}
catch (Exception e)