daily update on 20240427 by nitload youmu

This commit is contained in:
YoumuLiu
2024-04-28 02:01:30 +08:00
parent f83a130074
commit 0e01d99e1e
35 changed files with 406 additions and 262 deletions
@@ -30,6 +30,8 @@
//-----------------------------------------------------------------------
using StgSharp.Math;
using StgSharpDebug.Logic;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -42,133 +44,14 @@ namespace StgSharp.Graphics
{
public abstract partial class Form
{
private List<FrameAsyncThread> multiFrameAsyncThreadList = new List<FrameAsyncThread>();
private List<FrameAsyncThread> singleFrameAsyncThreadList = new List<FrameAsyncThread>();
private BluePaint renderLogic;
/// <summary>
/// Init this form and render it on screen, and respond with operation
/// </summary>
public unsafe void Show()
{
Init();
frameTimeProvider = new TimeSpanProvider(1 / 60.0, TimeSpanProvider.DefaultProvider);
MethodInfo[] methods = this.GetType().GetMethods(
BindingFlags.Public |
BindingFlags.Instance |
BindingFlags.DeclaredOnly);
GahterSignleFrameAsyncThread(methods);
GatherMultiFrameAsyncThread(methods);
//if no other operation
if (singleFrameAsyncThreadList.Count == 0)
{
while (!ShouldClose)
{
ProcessInput();
Main( );
InternalIO.glfwSwapBuffers(windowID);
InternalIO.glfwPollEvents();
frameTimeProvider.WaitNextSpan();
Interlocked.Add(ref _frameCount, 1);
}
return;
}
List<IGrouping<int, FrameAsyncThread>> threadGroup = singleFrameAsyncThreadList.GroupBy<FrameAsyncThread, int>((t) => t.Priority).ToList();
if (threadGroup.Count == 1)
{
int p = threadGroup.First().Key;
(Barrier, Barrier) bPair = FrameAsyncThread.CombineAsync(true, singleFrameAsyncThreadList);
FrameAsyncThread.AsyncStartAll(singleFrameAsyncThreadList);
switch (Scaler.SignOf(p))
{
case 0:
while (!ShouldClose)
{
bPair.Item1.SignalAndWait();
ProcessInput();
Main( );
InternalIO.glfwSwapBuffers(windowID);
InternalIO.glfwPollEvents();
bPair.Item2.SignalAndWait();
Interlocked.Add(ref _frameCount, 1);
frameTimeProvider.WaitNextSpan();
}
break;
case 1:
while (!ShouldClose)
{
bPair.Item1.SignalAndWait();
bPair.Item2.SignalAndWait();
ProcessInput();
Main( );
InternalIO.glfwSwapBuffers(windowID);
InternalIO.glfwPollEvents();
Interlocked.Add(ref _frameCount, 1);
frameTimeProvider.WaitNextSpan();
}
break;
case -1:
while (!ShouldClose)
{
ProcessInput();
Main( );
InternalIO.glfwSwapBuffers(windowID);
InternalIO.glfwPollEvents();
bPair.Item1.SignalAndWait();
bPair.Item2.SignalAndWait();
Interlocked.Add(ref _frameCount, 1);
frameTimeProvider.WaitNextSpan();
}
break;
default:
return;
}
FrameAsyncThread.TerminateAll(singleFrameAsyncThreadList);
bPair.Item1.SignalAndWait();
return;
}
threadGroup.Sort();
int priority = threadGroup.Count; //rearrange priority label
(Barrier, Barrier)[] barrierList = new (Barrier, Barrier)[priority];
for (int i = 0; i < priority; i++)
{
var group = threadGroup[i].ToList();
foreach (var t in group)
{
t.Priority = priority;
}
barrierList[i] = FrameAsyncThread.CombineAsync(true, group);
//setting thread sync
}
FrameAsyncThread.AsyncStartAll(singleFrameAsyncThreadList);
while (!ShouldClose)
{
barrierList[0].Item1.SignalAndWait();
int i = 0;
while (i < priority - 1)
{
barrierList[i].Item2.SignalAndWait();
barrierList[i + 1].Item1.SignalAndWait();
}
barrierList[priority - 1].Item1.SignalAndWait();
InternalIO.glfwSwapBuffers(windowID);
InternalIO.glfwPollEvents();
frameTimeProvider.WaitNextSpan();
Interlocked.Add(ref _frameCount, 1);
}
FrameAsyncThread.TerminateAll(singleFrameAsyncThreadList);
foreach ((Barrier, Barrier) bPair in barrierList)
{
bPair.Item1.SignalAndWait();
bPair.Item2.SignalAndWait();
}
FrameAsyncThread.WaitAll(singleFrameAsyncThreadList);
//InternalDeinit();
}
private void GahterSignleFrameAsyncThread(MethodInfo[] methods)
@@ -190,32 +73,10 @@ namespace StgSharp.Graphics
}
ThreadStart s = (ThreadStart)Delegate.CreateDelegate(typeof(ThreadStart), this, m);
FrameAsyncThread thread = new(s, attr._priority);
singleFrameAsyncThreadList.Add(thread);
//singleFrameAsyncThreadList.Add(thread);
}
}
private void GatherMultiFrameAsyncThread(MethodInfo[] methods)
{
if (methods.Length == 0)
{
return;
}
foreach (MethodInfo m in methods) //find all methods decorated by RenderActivityAttribute
{
MultiFrameActivityAttribute attr = m.GetCustomAttribute<MultiFrameActivityAttribute>(false);
if (attr == null)
{
continue;
}
if (!m.IsStatic && (m.GetParameters().Length != 0) && (m.ReturnType != typeof(void)))
{
throw new NotSupportedException("A render activity cannot have parameters, returning value or be static.");
}
ThreadStart s = (ThreadStart)Delegate.CreateDelegate(typeof(ThreadStart), this, m);
FrameAsyncThread thread = new(s, 0);
multiFrameAsyncThreadList.Add(thread);
}
}
}
}