use dotnet thread pool for keen parallel cringe
All checks were successful
Build / Build Launcher (push) Successful in 1m23s

This commit is contained in:
zznty
2024-08-30 00:14:01 +07:00
parent 319755c170
commit d9cdfc5360
2 changed files with 75 additions and 8 deletions

View File

@@ -1,4 +1,5 @@
using HarmonyLib; using CringeLauncher.Utils;
using HarmonyLib;
using Sandbox; using Sandbox;
using Sandbox.Engine.Multiplayer; using Sandbox.Engine.Multiplayer;
using Sandbox.Engine.Networking; using Sandbox.Engine.Networking;
@@ -71,7 +72,8 @@ public class Launcher : IDisposable
PluginLoader.Main.Instance.Splash?.SetBarValue(.75f); PluginLoader.Main.Instance.Splash?.SetBarValue(.75f);
SpaceEngineersGame.SetupPerGameSettings(); SpaceEngineersGame.SetupPerGameSettings();
ConfigureSettings(); ConfigureSettings();
MySandboxGame.InitMultithreading(); // MySandboxGame.InitMultithreading();
InitThreadPool();
PluginLoader.Main.Instance.Splash?.SetBarValue(.85f); PluginLoader.Main.Instance.Splash?.SetBarValue(.85f);
MyVRage.Platform.System.OnThreadpoolInitialized(); MyVRage.Platform.System.OnThreadpoolInitialized();
InitRender(); InitRender();
@@ -80,15 +82,20 @@ public class Launcher : IDisposable
_game = new(args); _game = new(args);
PluginLoader.Main.Instance.Splash?.SetText("Launching..."); PluginLoader.Main.Instance.Splash?.SetText("Launching...");
} }
public void Run() => _game?.Run(); public void Run() => _game?.Run();
#region Keen shit #region Keen shit
private static void ConfigureSettings() private static void InitThreadPool()
{ {
MyPlatformGameSettings.ENABLE_LOGOS = false; ParallelTasks.Parallel.Scheduler = new ThreadPoolScheduler();
} }
private static void ConfigureSettings()
{
MyPlatformGameSettings.ENABLE_LOGOS = false;
}
private static void InitTexts() private static void InitTexts()
{ {

View File

@@ -0,0 +1,60 @@
using System.Diagnostics;
using System.Reflection;
using HarmonyLib;
using Havok;
using ParallelTasks;
using CringeTask = ParallelTasks.Task;
namespace CringeLauncher.Utils;
public class ThreadPoolScheduler : IWorkScheduler
{
public void Schedule(CringeTask item)
{
ThreadPool.UnsafeQueueUserWorkItem(new ThreadPoolWorkItemTask(item), false);
}
public bool WaitForTasksToFinish(TimeSpan waitTimeout) => true;
public void ScheduleOnEachWorker(Action action)
{
}
public int ReadAndClearExecutionTime() => 0;
public void SuspendThreads(TimeSpan waitTimeout)
{
}
public void ResumeThreads()
{
}
public int ThreadCount { get; } = ThreadPool.ThreadCount;
}
[HarmonyPatch]
internal class ThreadPoolWorkItemTask(CringeTask task) : IThreadPoolWorkItem
{
public void Execute()
{
if (HkBaseSystem.IsInitialized && !HkBaseSystem.IsThreadInitialized)
HkBaseSystem.InitThread(Thread.CurrentThread.Name);
task.Execute();
}
private static MethodBase TargetMethod()
{
var type = Type.GetType("System.Threading.PortableThreadPool+WorkerThread, System.Private.CoreLib", true);
return AccessTools.DeclaredMethod(type, "WorkerThreadStart");
}
private static void Postfix()
{
if (!HkBaseSystem.IsInitialized || !HkBaseSystem.IsThreadInitialized) return;
HkBaseSystem.QuitThread();
Debug.WriteLine($"Hk Shutdown for {Thread.CurrentThread.Name}");
}
}