daily update on 20240325 by nitload youmu

This commit is contained in:
YoumuLiu
2024-03-26 02:49:41 +08:00
parent 02be081eee
commit f0d91b6d51
36 changed files with 145 additions and 1815 deletions
+20 -15
View File
@@ -295,40 +295,44 @@ namespace StgSharp.Graphics
SwapBuffers();
PollEvents();
frameTimeProvider.WaitNextSpan();
Console.WriteLine(frameTimeProvider.CurrentSpan);
}
}
else
{
GLonUpdate update = new GLonUpdate((GLcontext*)graphicContextID); //更换GL库至双线程模式
FrameAsyncThread updateT = new AsyncUpdateDataTask(this); //建立两个异步线程
FrameAsyncThread renderT = new AsyncRenderFrameTask(this);
AsyncUpdateDataTask updateT = new AsyncUpdateDataTask(this); //建立两个异步线程
AsyncRenderFrameTask renderT = new AsyncRenderFrameTask(this);
frameAsyncTaskList.Add(renderT);
frameAsyncTaskList.Add(updateT);
gl = update;
update.ActivatedOperationBuffer = updateT.opBuffer;
SemaphoreSlim frameBeginSemaphore = FrameAsyncThread.CombineAsync(renderT, updateT);
SemaphoreSlim renderCompleteSemaphor = renderT.AsyncStart();
SemaphoreSlim updateCompleteSemaphor = updateT.AsyncStart();
Barrier frameBarrier = FrameAsyncThread.CombineBeginningAsync(true, renderT, updateT);
Barrier swapBufferBarrier = renderT.TodoCompleteBarrier;
Barrier exchangeBufferBarrier = updateT.TodoCompleteBarrier;
renderT.AsyncStart();
updateT.AsyncStart();
while (!ShouldClose)
{
Console.WriteLine(1);
frameBeginSemaphore.Release(2); //启动下一个渲染循环
Console.WriteLine(2);
renderCompleteSemaphor.Wait(); //等待两个线程完成
updateCompleteSemaphor.Wait();
Console.WriteLine(3);
SwapBuffers(); //GLFW必要操作
swapBufferBarrier.SignalAndWait();
SwapBuffers(); //绘制帧必要操作
PollEvents();
Console.WriteLine(4);
exchangeBufferBarrier.SignalAndWait();
FrameAsyncThread.ExchangeBuffer(updateT, renderT); //交换两个线程的缓冲区
update.ActivatedOperationBuffer = updateT.opBuffer;
Console.WriteLine(5);
frameTimeProvider.WaitNextSpan(); //等待下一帧开始
Console.WriteLine(6);
frameBarrier.SignalAndWait();
Console.WriteLine(frameTimeProvider.CurrentSpan);
}
updateT.Terminate();
renderT.Terminate();
}
}
}
@@ -397,5 +401,6 @@ namespace StgSharp.Graphics
#endregion form main
}
}
+44 -30
View File
@@ -494,24 +494,26 @@ namespace StgSharp.Graphics
}
//TODO 目前还不能加载任何任务
//TODO 任务的启动逻辑需要重构
public class FrameAsyncThread
{
private Thread _task;
protected SemaphoreSlim _frameCompleteSemaphore = new SemaphoreSlim(0, 1);
protected SemaphoreSlim _refreshSemaphore;
protected Barrier _drawCompleteBarrier;
private Thread _task;
private int _terminateToken;
protected Barrier _frameSpeedSyncBarrier;
protected Action _taskTODO;
protected Func<bool> _terminateSignature;
internal FrameOperationBuffer opBuffer;
internal FrameAsyncThread(Action action, IglFunc gl)
{
_taskTODO = action;
opBuffer = new FrameOperationBuffer(gl);
_terminateToken = 1;
_drawCompleteBarrier = new Barrier(2);
}
public Action TaskTODO
@@ -520,48 +522,53 @@ namespace StgSharp.Graphics
set => _taskTODO = value;
}
public virtual SemaphoreSlim AsyncStart()
public Barrier TodoCompleteBarrier
{
get => _drawCompleteBarrier;
}
public virtual void AsyncStart()
{
_task = new Thread(
() =>
{
while (true)
while (_terminateToken != 0)
{
_refreshSemaphore.Wait();
_taskTODO();
_frameCompleteSemaphore.Release();
_drawCompleteBarrier.SignalAndWait();
_frameSpeedSyncBarrier.SignalAndWait();
}
});
_task.Start();
return _frameCompleteSemaphore;
}
public static SemaphoreSlim CombineAsync(params FrameAsyncThread[] taskList)
{
if (taskList.Length == 0)
{
return null;
}
SemaphoreSlim refresh = new SemaphoreSlim(0, taskList.Length);
foreach (FrameAsyncThread item in taskList)
{
item._refreshSemaphore = refresh;
}
return refresh;
}
public static SemaphoreSlim CombineAsync(List<FrameAsyncThread> taskList)
public static Barrier CombineAsync(bool needOuterMonitor, List<FrameAsyncThread> taskList)
{
if (taskList.Count == 0)
{
return null;
}
SemaphoreSlim refresh = new SemaphoreSlim(taskList.Count);
Barrier b = new Barrier(taskList.Count + (needOuterMonitor ? 1 : 0));
foreach (FrameAsyncThread item in taskList)
{
item._refreshSemaphore = refresh;
item._frameSpeedSyncBarrier = b;
}
return refresh;
return b;
}
public static Barrier CombineBeginningAsync(bool needOuterMonitor, params FrameAsyncThread[] taskList)
{
if (taskList.Length == 0)
{
return null;
}
Barrier b = new Barrier(taskList.Length + (needOuterMonitor ? 1 : 0));
foreach (FrameAsyncThread item in taskList)
{
item._frameSpeedSyncBarrier = b;
}
return b;
}
public static void ExchangeBuffer(FrameAsyncThread task0, FrameAsyncThread task1)
@@ -571,6 +578,10 @@ namespace StgSharp.Graphics
task1.opBuffer = cache;
}
public void Terminate()
{
Interlocked.Exchange(ref _terminateToken, 0);
}
}
@@ -587,14 +598,17 @@ namespace StgSharp.Graphics
internal sealed class AsyncRenderFrameTask : FrameAsyncThread
{
public AsyncRenderFrameTask(Form f) : base(null, f.gl)
{
TaskTODO = FrameOperation;
}
private void FrameOperation()
{
while (opBuffer.CallNext()) {}
while (opBuffer.CallNext()) { }
}
}