make mare even less dumpy
This commit is contained in:
@@ -414,7 +414,7 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
|
|||||||
{
|
{
|
||||||
var gameObj = (GameObject*)p.Address;
|
var gameObj = (GameObject*)p.Address;
|
||||||
var drawObj = gameObj->DrawObject;
|
var drawObj = gameObj->DrawObject;
|
||||||
var playerName = p.Name;
|
var characterName = p.Name;
|
||||||
bool isDrawing = false;
|
bool isDrawing = false;
|
||||||
bool isDrawingChanged = false;
|
bool isDrawingChanged = false;
|
||||||
if ((nint)drawObj != IntPtr.Zero)
|
if ((nint)drawObj != IntPtr.Zero)
|
||||||
@@ -426,20 +426,20 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
|
|||||||
if (!isDrawing)
|
if (!isDrawing)
|
||||||
{
|
{
|
||||||
isDrawing = ((CharacterBase*)drawObj)->HasModelFilesInSlotLoaded != 0;
|
isDrawing = ((CharacterBase*)drawObj)->HasModelFilesInSlotLoaded != 0;
|
||||||
if (isDrawing && !string.Equals(_lastGlobalBlockPlayer, playerName, StringComparison.Ordinal)
|
if (isDrawing && !string.Equals(_lastGlobalBlockPlayer, characterName, StringComparison.Ordinal)
|
||||||
&& !string.Equals(_lastGlobalBlockReason, "HasModelFilesInSlotLoaded", StringComparison.Ordinal))
|
&& !string.Equals(_lastGlobalBlockReason, "HasModelFilesInSlotLoaded", StringComparison.Ordinal))
|
||||||
{
|
{
|
||||||
_lastGlobalBlockPlayer = playerName;
|
_lastGlobalBlockPlayer = characterName;
|
||||||
_lastGlobalBlockReason = "HasModelFilesInSlotLoaded";
|
_lastGlobalBlockReason = "HasModelFilesInSlotLoaded";
|
||||||
isDrawingChanged = true;
|
isDrawingChanged = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!string.Equals(_lastGlobalBlockPlayer, playerName, StringComparison.Ordinal)
|
if (!string.Equals(_lastGlobalBlockPlayer, characterName, StringComparison.Ordinal)
|
||||||
&& !string.Equals(_lastGlobalBlockReason, "HasModelInSlotLoaded", StringComparison.Ordinal))
|
&& !string.Equals(_lastGlobalBlockReason, "HasModelInSlotLoaded", StringComparison.Ordinal))
|
||||||
{
|
{
|
||||||
_lastGlobalBlockPlayer = playerName;
|
_lastGlobalBlockPlayer = characterName;
|
||||||
_lastGlobalBlockReason = "HasModelInSlotLoaded";
|
_lastGlobalBlockReason = "HasModelInSlotLoaded";
|
||||||
isDrawingChanged = true;
|
isDrawingChanged = true;
|
||||||
}
|
}
|
||||||
@@ -447,10 +447,10 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!string.Equals(_lastGlobalBlockPlayer, playerName, StringComparison.Ordinal)
|
if (!string.Equals(_lastGlobalBlockPlayer, characterName, StringComparison.Ordinal)
|
||||||
&& !string.Equals(_lastGlobalBlockReason, "RenderFlags", StringComparison.Ordinal))
|
&& !string.Equals(_lastGlobalBlockReason, "RenderFlags", StringComparison.Ordinal))
|
||||||
{
|
{
|
||||||
_lastGlobalBlockPlayer = playerName;
|
_lastGlobalBlockPlayer = characterName;
|
||||||
_lastGlobalBlockReason = "RenderFlags";
|
_lastGlobalBlockReason = "RenderFlags";
|
||||||
isDrawingChanged = true;
|
isDrawingChanged = true;
|
||||||
}
|
}
|
||||||
@@ -459,7 +459,7 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
|
|||||||
|
|
||||||
if (isDrawingChanged)
|
if (isDrawingChanged)
|
||||||
{
|
{
|
||||||
_logger.LogTrace("Global draw block: START => {name} ({reason})", playerName, _lastGlobalBlockReason);
|
_logger.LogTrace("Global draw block: START => {name} ({reason})", characterName, _lastGlobalBlockReason);
|
||||||
}
|
}
|
||||||
|
|
||||||
IsAnythingDrawing |= isDrawing;
|
IsAnythingDrawing |= isDrawing;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Microsoft.Extensions.Hosting;
|
using MareSynchronos.MareConfiguration;
|
||||||
|
using Microsoft.Extensions.Hosting;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
@@ -14,13 +15,15 @@ public sealed class MareMediator : IHostedService
|
|||||||
private readonly CancellationTokenSource _loopCts = new();
|
private readonly CancellationTokenSource _loopCts = new();
|
||||||
private readonly ConcurrentQueue<MessageBase> _messageQueue = new();
|
private readonly ConcurrentQueue<MessageBase> _messageQueue = new();
|
||||||
private readonly PerformanceCollectorService _performanceCollector;
|
private readonly PerformanceCollectorService _performanceCollector;
|
||||||
|
private readonly MareConfigService _mareConfigService;
|
||||||
private readonly Dictionary<Type, HashSet<SubscriberAction>> _subscriberDict = [];
|
private readonly Dictionary<Type, HashSet<SubscriberAction>> _subscriberDict = [];
|
||||||
private bool _processQueue = false;
|
private bool _processQueue = false;
|
||||||
private readonly Dictionary<Type, MethodInfo?> _genericExecuteMethods = new();
|
private readonly Dictionary<Type, MethodInfo?> _genericExecuteMethods = new();
|
||||||
public MareMediator(ILogger<MareMediator> logger, PerformanceCollectorService performanceCollector)
|
public MareMediator(ILogger<MareMediator> logger, PerformanceCollectorService performanceCollector, MareConfigService mareConfigService)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_performanceCollector = performanceCollector;
|
_performanceCollector = performanceCollector;
|
||||||
|
_mareConfigService = mareConfigService;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void PrintSubscriberInfo()
|
public void PrintSubscriberInfo()
|
||||||
@@ -147,7 +150,7 @@ public sealed class MareMediator : IHostedService
|
|||||||
var msgType = message.GetType();
|
var msgType = message.GetType();
|
||||||
if (!_genericExecuteMethods.TryGetValue(msgType, out var methodInfo))
|
if (!_genericExecuteMethods.TryGetValue(msgType, out var methodInfo))
|
||||||
{
|
{
|
||||||
_genericExecuteMethods[message.GetType()] = methodInfo = GetType()
|
_genericExecuteMethods[msgType] = methodInfo = GetType()
|
||||||
.GetMethod(nameof(ExecuteReflected), System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?
|
.GetMethod(nameof(ExecuteReflected), System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?
|
||||||
.MakeGenericMethod(msgType);
|
.MakeGenericMethod(msgType);
|
||||||
}
|
}
|
||||||
@@ -158,14 +161,20 @@ public sealed class MareMediator : IHostedService
|
|||||||
|
|
||||||
private void ExecuteReflected<T>(List<SubscriberAction> subscribers, T message) where T : MessageBase
|
private void ExecuteReflected<T>(List<SubscriberAction> subscribers, T message) where T : MessageBase
|
||||||
{
|
{
|
||||||
var msgTypeName = message.GetType().Name;
|
|
||||||
foreach (SubscriberAction subscriber in subscribers)
|
foreach (SubscriberAction subscriber in subscribers)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var isSameThread = message.KeepThreadContext ? "$" : string.Empty;
|
if (_mareConfigService.Current.LogPerformance)
|
||||||
_performanceCollector.LogPerformance(this, $"{isSameThread}Execute>{msgTypeName}+{subscriber.Subscriber.GetType().Name}>{subscriber.Subscriber}",
|
{
|
||||||
() => ((Action<T>)subscriber.Action).Invoke(message));
|
var isSameThread = message.KeepThreadContext ? "$" : string.Empty;
|
||||||
|
_performanceCollector.LogPerformance(this, $"{isSameThread}Execute>{message.GetType().Name}+{subscriber.Subscriber.GetType().Name}>{subscriber.Subscriber}",
|
||||||
|
() => ((Action<T>)subscriber.Action).Invoke(message));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
((Action<T>)subscriber.Action).Invoke(message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ public sealed class PerformanceCollectorService : IHostedService
|
|||||||
private const string _counterSplit = "=>";
|
private const string _counterSplit = "=>";
|
||||||
private readonly ILogger<PerformanceCollectorService> _logger;
|
private readonly ILogger<PerformanceCollectorService> _logger;
|
||||||
private readonly MareConfigService _mareConfigService;
|
private readonly MareConfigService _mareConfigService;
|
||||||
public ConcurrentDictionary<string, RollingList<Tuple<TimeOnly, long>>> PerformanceCounters { get; } = new(StringComparer.Ordinal);
|
public ConcurrentDictionary<string, RollingList<(TimeOnly, long)>> PerformanceCounters { get; } = new(StringComparer.Ordinal);
|
||||||
private readonly CancellationTokenSource _periodicLogPruneTask = new();
|
private readonly CancellationTokenSource _periodicLogPruneTask = new();
|
||||||
|
|
||||||
public PerformanceCollectorService(ILogger<PerformanceCollectorService> logger, MareConfigService mareConfigService)
|
public PerformanceCollectorService(ILogger<PerformanceCollectorService> logger, MareConfigService mareConfigService)
|
||||||
@@ -45,7 +45,7 @@ public sealed class PerformanceCollectorService : IHostedService
|
|||||||
if (TimeSpan.FromTicks(elapsed) > TimeSpan.FromMilliseconds(10))
|
if (TimeSpan.FromTicks(elapsed) > TimeSpan.FromMilliseconds(10))
|
||||||
_logger.LogWarning(">10ms spike on {counterName}: {time}", counterName, TimeSpan.FromTicks(elapsed));
|
_logger.LogWarning(">10ms spike on {counterName}: {time}", counterName, TimeSpan.FromTicks(elapsed));
|
||||||
#endif
|
#endif
|
||||||
list.Add(new(TimeOnly.FromDateTime(DateTime.Now), elapsed));
|
list.Add((TimeOnly.FromDateTime(DateTime.Now), elapsed));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -134,13 +134,13 @@ public sealed class PerformanceCollectorService : IHostedService
|
|||||||
|
|
||||||
if (pastEntries.Any())
|
if (pastEntries.Any())
|
||||||
{
|
{
|
||||||
sb.Append((" " + TimeSpan.FromTicks(pastEntries.LastOrDefault()?.Item2 ?? 0).TotalMilliseconds.ToString("0.00000", CultureInfo.InvariantCulture)).PadRight(15));
|
sb.Append((" " + TimeSpan.FromTicks(pastEntries.LastOrDefault() == default ? 0 : pastEntries.Last().Item2).TotalMilliseconds.ToString("0.00000", CultureInfo.InvariantCulture)).PadRight(15));
|
||||||
sb.Append('|');
|
sb.Append('|');
|
||||||
sb.Append((" " + TimeSpan.FromTicks(pastEntries.Max(m => m.Item2)).TotalMilliseconds.ToString("0.00000", CultureInfo.InvariantCulture)).PadRight(15));
|
sb.Append((" " + TimeSpan.FromTicks(pastEntries.Max(m => m.Item2)).TotalMilliseconds.ToString("0.00000", CultureInfo.InvariantCulture)).PadRight(15));
|
||||||
sb.Append('|');
|
sb.Append('|');
|
||||||
sb.Append((" " + TimeSpan.FromTicks((long)pastEntries.Average(m => m.Item2)).TotalMilliseconds.ToString("0.00000", CultureInfo.InvariantCulture)).PadRight(15));
|
sb.Append((" " + TimeSpan.FromTicks((long)pastEntries.Average(m => m.Item2)).TotalMilliseconds.ToString("0.00000", CultureInfo.InvariantCulture)).PadRight(15));
|
||||||
sb.Append('|');
|
sb.Append('|');
|
||||||
sb.Append((" " + (pastEntries.LastOrDefault()?.Item1.ToString("HH:mm:ss.ffff", CultureInfo.InvariantCulture) ?? "-")).PadRight(15, ' '));
|
sb.Append((" " + (pastEntries.LastOrDefault() == default ? "-" : pastEntries.Last().Item1.ToString("HH:mm:ss.ffff", CultureInfo.InvariantCulture))).PadRight(15, ' '));
|
||||||
sb.Append('|');
|
sb.Append('|');
|
||||||
sb.Append((" " + pastEntries.Count).PadRight(10));
|
sb.Append((" " + pastEntries.Count).PadRight(10));
|
||||||
sb.Append('|');
|
sb.Append('|');
|
||||||
|
|||||||
Reference in New Issue
Block a user