move building character data to main framework thread
This commit is contained in:
@@ -3,6 +3,8 @@ using System.Collections.Generic;
|
|||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Dalamud.Game;
|
||||||
using Dalamud.Utility;
|
using Dalamud.Utility;
|
||||||
using FFXIVClientStructs.FFXIV.Client.Game.Character;
|
using FFXIVClientStructs.FFXIV.Client.Game.Character;
|
||||||
using FFXIVClientStructs.FFXIV.Client.Graphics.Scene;
|
using FFXIVClientStructs.FFXIV.Client.Graphics.Scene;
|
||||||
@@ -33,7 +35,12 @@ public class CharacterDataFactory
|
|||||||
this.transientResourceManager = transientResourceManager;
|
this.transientResourceManager = transientResourceManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
public unsafe CharacterData BuildCharacterData(CharacterData previousData, ObjectKind objectKind, IntPtr playerPointer, CancellationToken token)
|
private unsafe bool CheckForPointer(IntPtr playerPointer)
|
||||||
|
{
|
||||||
|
return playerPointer == IntPtr.Zero || ((Character*)playerPointer)->GameObject.GetDrawObject() == null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<CharacterData> BuildCharacterData(CharacterData previousData, ObjectKind objectKind, IntPtr playerPointer, CancellationToken token)
|
||||||
{
|
{
|
||||||
if (!_ipcManager.Initialized)
|
if (!_ipcManager.Initialized)
|
||||||
{
|
{
|
||||||
@@ -43,7 +50,7 @@ public class CharacterDataFactory
|
|||||||
bool pointerIsZero = true;
|
bool pointerIsZero = true;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
pointerIsZero = playerPointer == IntPtr.Zero || ((Character*)playerPointer)->GameObject.GetDrawObject() == null;
|
pointerIsZero = CheckForPointer(playerPointer);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -65,7 +72,7 @@ public class CharacterDataFactory
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
return CreateCharacterData(previousData, objectKind, playerPointer, token);
|
return await _dalamudUtil.RunOnFrameworkThread(() => CreateCharacterData(previousData, objectKind, playerPointer, token));
|
||||||
}
|
}
|
||||||
catch (OperationCanceledException)
|
catch (OperationCanceledException)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ namespace MareSynchronos.Managers
|
|||||||
foreach (var unprocessedObject in playerRelatedObjects.Where(c => c.HasUnprocessedUpdate).ToList())
|
foreach (var unprocessedObject in playerRelatedObjects.Where(c => c.HasUnprocessedUpdate).ToList())
|
||||||
{
|
{
|
||||||
Logger.Verbose("Building Cache for " + unprocessedObject.ObjectKind);
|
Logger.Verbose("Building Cache for " + unprocessedObject.ObjectKind);
|
||||||
PermanentDataCache = _characterDataFactory.BuildCharacterData(PermanentDataCache, unprocessedObject.ObjectKind, unprocessedObject.Address, token);
|
PermanentDataCache = await _characterDataFactory.BuildCharacterData(PermanentDataCache, unprocessedObject.ObjectKind, unprocessedObject.Address, token);
|
||||||
if (!token.IsCancellationRequested)
|
if (!token.IsCancellationRequested)
|
||||||
{
|
{
|
||||||
unprocessedObject.HasUnprocessedUpdate = false;
|
unprocessedObject.HasUnprocessedUpdate = false;
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
using Dalamud.Game;
|
using Dalamud.Game;
|
||||||
using Dalamud.Game.ClientState;
|
using Dalamud.Game.ClientState;
|
||||||
using Dalamud.Game.ClientState.Conditions;
|
using Dalamud.Game.ClientState.Conditions;
|
||||||
@@ -189,6 +190,11 @@ namespace MareSynchronos.Utils
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<T> RunOnFrameworkThread<T>(Func<T> func)
|
||||||
|
{
|
||||||
|
return await _framework.RunOnFrameworkThread(func);
|
||||||
|
}
|
||||||
|
|
||||||
public unsafe void WaitWhileCharacterIsDrawing(string name, IntPtr characterAddress, CancellationToken? ct = null)
|
public unsafe void WaitWhileCharacterIsDrawing(string name, IntPtr characterAddress, CancellationToken? ct = null)
|
||||||
{
|
{
|
||||||
if (!_clientState.IsLoggedIn || characterAddress == IntPtr.Zero) return;
|
if (!_clientState.IsLoggedIn || characterAddress == IntPtr.Zero) return;
|
||||||
|
|||||||
Reference in New Issue
Block a user