Revert "relieve gc pressure maybe"

This reverts commit 40b8310ba9.
This commit is contained in:
Loporrit
2024-02-10 18:45:18 +00:00
parent 40b8310ba9
commit 5d2b25bccb
5 changed files with 68 additions and 85 deletions

View File

@@ -1,5 +1,7 @@
using Dalamud.Game.ClientState.Conditions;
using Dalamud.Game.ClientState.Objects;
using Dalamud.Game.ClientState.Objects.Enums;
using Dalamud.Game.ClientState.Objects.SubKinds;
using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game.Character;
using FFXIVClientStructs.FFXIV.Client.Game.Control;
@@ -12,24 +14,16 @@ using Microsoft.Extensions.Logging;
using System.Numerics;
using System.Runtime.CompilerServices;
using GameObject = FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject;
using DalamudGameObject = Dalamud.Game.ClientState.Objects.Types.GameObject;
namespace MareSynchronos.Services;
public class DalamudUtilService : IHostedService, IMediatorSubscriber
{
internal struct PlayerCharacter
{
public uint ObjectId;
public string Name;
public uint HomeWorldId;
public nint Address;
};
private struct PlayerInfo
{
public PlayerCharacter Character;
public string Hash;
public String Name;
public uint WorldId;
public String Hash;
};
private readonly List<uint> _classJobIdsIgnoredForPets = [30];
@@ -46,8 +40,7 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
private string _lastGlobalBlockPlayer = string.Empty;
private string _lastGlobalBlockReason = string.Empty;
private ushort _lastZone = 0;
private readonly Dictionary<string, PlayerCharacter> _playerCharas = new(StringComparer.Ordinal);
private readonly List<string> _notUpdatedCharas = [];
private Dictionary<string, (string Name, nint Address)> _playerCharas = new(StringComparer.Ordinal);
private bool _sentBetweenAreas = false;
private static readonly Dictionary<uint, PlayerInfo> _playerInfoCache = new();
@@ -77,7 +70,7 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
await RunOnFrameworkThread(() =>
{
var addr = GetPlayerCharacterFromCachedTableByIdent(ident);
var pc = _clientState.LocalPlayer!;
var pc = GetPlayerCharacter();
var gobj = CreateGameObject(addr);
// Any further than roughly 55y is out of range for targetting
if (gobj != null && Vector3.Distance(pc.Position, gobj.Position) < 55.0f)
@@ -186,6 +179,12 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
return await RunOnFrameworkThread(() => GetPet(playerPointer)).ConfigureAwait(false);
}
public PlayerCharacter GetPlayerCharacter()
{
EnsureIsOnFramework();
return _clientState.LocalPlayer!;
}
public IntPtr GetPlayerCharacterFromCachedTableByIdent(string characterName)
{
if (_playerCharas.TryGetValue(characterName, out var pchar)) return pchar.Address;
@@ -373,23 +372,21 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
return _gameGui.WorldToScreen(obj.Position, out var screenPos) ? screenPos : Vector2.Zero;
}
internal PlayerCharacter FindPlayerByNameHash(string ident)
internal (string Name, nint Address) FindPlayerByNameHash(string ident)
{
_playerCharas.TryGetValue(ident, out var result);
return result;
}
private unsafe PlayerInfo GetPlayerInfo(DalamudGameObject chara)
private PlayerInfo GetPlayerInfo(PlayerCharacter p)
{
uint id = chara.ObjectId;
uint id = p.ObjectId;
if (!_playerInfoCache.TryGetValue(id, out var info))
{
info.Character.ObjectId = id;
info.Character.Name = chara.Name.ToString();
info.Character.HomeWorldId = ((BattleChara*)chara.Address)->Character.HomeWorld;
info.Character.Address = chara.Address;
info.Hash = Crypto.GetHash256(info.Character.Name + info.Character.HomeWorldId.ToString());
info.Name = p.Name.ToString();
info.WorldId = p.HomeWorld.Id;
info.Hash = Crypto.GetHash256(info.Name + info.WorldId.ToString());
_playerInfoCache[id] = info;
}
@@ -402,6 +399,7 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
{
var gameObj = (GameObject*)p.Address;
var drawObj = gameObj->DrawObject;
var playerInfo = GetPlayerInfo(p);
bool isDrawing = false;
bool isDrawingChanged = false;
if ((nint)drawObj != IntPtr.Zero)
@@ -413,20 +411,20 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
if (!isDrawing)
{
isDrawing = ((CharacterBase*)drawObj)->HasModelFilesInSlotLoaded != 0;
if (isDrawing && !string.Equals(_lastGlobalBlockPlayer, p.Name, StringComparison.Ordinal)
if (isDrawing && !string.Equals(_lastGlobalBlockPlayer, playerInfo.Name, StringComparison.Ordinal)
&& !string.Equals(_lastGlobalBlockReason, "HasModelFilesInSlotLoaded", StringComparison.Ordinal))
{
_lastGlobalBlockPlayer = p.Name;
_lastGlobalBlockPlayer = playerInfo.Name;
_lastGlobalBlockReason = "HasModelFilesInSlotLoaded";
isDrawingChanged = true;
}
}
else
{
if (!string.Equals(_lastGlobalBlockPlayer, p.Name, StringComparison.Ordinal)
if (!string.Equals(_lastGlobalBlockPlayer, playerInfo.Name, StringComparison.Ordinal)
&& !string.Equals(_lastGlobalBlockReason, "HasModelInSlotLoaded", StringComparison.Ordinal))
{
_lastGlobalBlockPlayer = p.Name;
_lastGlobalBlockPlayer = playerInfo.Name;
_lastGlobalBlockReason = "HasModelInSlotLoaded";
isDrawingChanged = true;
}
@@ -434,10 +432,10 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
}
else
{
if (!string.Equals(_lastGlobalBlockPlayer, p.Name, StringComparison.Ordinal)
if (!string.Equals(_lastGlobalBlockPlayer, playerInfo.Name, StringComparison.Ordinal)
&& !string.Equals(_lastGlobalBlockReason, "RenderFlags", StringComparison.Ordinal))
{
_lastGlobalBlockPlayer = p.Name;
_lastGlobalBlockPlayer = playerInfo.Name;
_lastGlobalBlockReason = "RenderFlags";
isDrawingChanged = true;
}
@@ -446,7 +444,7 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
if (isDrawingChanged)
{
_logger.LogTrace("Global draw block: START => {name} ({reason})", p.Name, _lastGlobalBlockReason);
_logger.LogTrace("Global draw block: START => {name} ({reason})", playerInfo.Name, _lastGlobalBlockReason);
}
IsAnythingDrawing |= isDrawing;
@@ -466,32 +464,19 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
}
IsAnythingDrawing = false;
var playerCharaList = new Dictionary<string, (string Name, nint Address)>(StringComparer.Ordinal);
_performanceCollector.LogPerformance(this, "ObjTableToCharas",
() =>
{
_notUpdatedCharas.AddRange(_playerCharas.Keys);
foreach (var chara in _objectTable)
() => {
foreach (var p in _objectTable.OfType<PlayerCharacter>().Where(o => o.ObjectIndex < 200))
{
if (chara.ObjectIndex % 2 != 0 || chara.ObjectIndex >= 200) continue;
string charaName = chara.Name.ToString();
uint homeWorldId = ((BattleChara*)chara.Address)->Character.HomeWorld;
var info = GetPlayerInfo(chara);
if (!IsAnythingDrawing)
CheckCharacterForDrawing(info.Character);
_notUpdatedCharas.Remove(info.Hash);
_playerCharas[info.Hash] = info.Character;
CheckCharacterForDrawing(p);
var info = GetPlayerInfo(p);
playerCharaList.Add(info.Hash, (info.Name, p.Address));
}
foreach (var notUpdatedChara in _notUpdatedCharas)
{
_playerCharas.Remove(notUpdatedChara);
}
_notUpdatedCharas.Clear();
});
}
);
_playerCharas = playerCharaList;
if (!IsAnythingDrawing && !string.IsNullOrEmpty(_lastGlobalBlockPlayer))
{