daily update on 20241002 by nitload youmu, intrinsic function rebuild, syntax style arrange

This commit is contained in:
Nitload
2024-10-03 04:03:06 +08:00
parent 0979123ac0
commit 6e2f93b053
265 changed files with 26732 additions and 19058 deletions
@@ -28,8 +28,11 @@
//
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
using StgSharp.Controls;
using StgSharp.Graphics;
using StgSharp.MVVM.View;
using StgSharp.Threading;
using StgSharp.Timing;
using System;
using System.Collections.Generic;
@@ -40,6 +43,8 @@ namespace StgSharp.MVVM.ViewModel
{
public abstract partial class ViewModelBase
{
private volatile bool _closed = true;
private ViewBase _nextView, _currentView;
protected ViewBase CurrentView
@@ -51,46 +56,91 @@ namespace StgSharp.MVVM.ViewModel
/// <summary>
/// CustomizeInit this form and render it on screen, and respond with operation
/// </summary>
public unsafe void UseViewModel(string viewEntryName)
public unsafe void UseViewModel( string viewEntryName )
{
CustomizeInitialize();
//BuildGlobalKeyControl();
UseViewInNextFrame(viewEntryName);
while (0 == InternalIO.glfwWindowShouldClose(this.viewPortDisplay.ViewPortID))
{
ShowFrameOnce();
UseViewInNextFrame( viewEntryName );
TimeSpanAwaitingToken fpsCountingToken = fpsCountProvider.ParticipantSpanAwaiting(
1 );
fpsCountingToken.TimeSpanRefreshed += CountFps;
fpsCountingToken.MissTimeSpanRefreshed += CountFps;
if( _nextView != _currentView ) {
Interlocked.Exchange( ref _currentView, _nextView );
}
Thread renderThread = new Thread(
( token ) => {
try {
ProcessFrameWithoutEvent();
}
catch( Exception ex ) {
InternalIO.InternalWriteLog(
$"Critical error when rendering:\n" + $"{ex}",
LogType.Error );
ShouldClose = true;
}
} );
renderThread.Start();
/**/
using( TimeSpanAwaitingToken eventAwaitingToken = frameTimeProvider.ParticipantSpanAwaiting(
1 ) ) {
while( _closed ) {
if( _nextView != _currentView ) {
Interlocked.Exchange( ref _currentView, _nextView );
}
InternalIO.glfwPollEvents();
eventAwaitingToken.WaitNextSpan();
_closed = !ShouldClose;
}
}
/**/
renderThread.Join();
fpsCountingToken.Dispose();
fpsCountProvider.StopSpanProviding();
frameTimeProvider.StopSpanProviding();
}
protected void UseViewInNextFrame(string name)
protected void UseViewInNextFrame( string name )
{
if (!allView.TryGetValue(name, out ViewBase v))
{
throw new KeyNotFoundException($"{$"Cannot find View named {name} "}{$"in current View Model of {GetType().FullName}"}");
if( !allView.TryGetValue( name, out ViewBase v ) ) {
throw new KeyNotFoundException(
$"{$"Cannot find View named {name} "}{$"in current View Model of {GetType().FullName}"}" );
}
CurrentView = v;
}
private void CountFps( object sender, EventArgs e )
{
Interlocked.Exchange( ref _frameSpeed, _frameCount );
Interlocked.Exchange( ref _frameCount, 0 );
/**/
Console.Clear();
Console.WriteLine( FrameSpeed );
/**/
}
private unsafe void PrivateShow()
{
if (0 == InternalIO.glfwWindowShouldClose(this.viewPortDisplay.ViewPortID))
{
if( 0 == InternalIO.glfwWindowShouldClose(
this.viewPortDisplay.ViewPortID ) ) {
CurrentView.Use();
RenderStream.PollEvents();
}
}
private void ShowFrameOnce()
private void ProcessFrameWithoutEvent()
{
viewPortDisplay.FlushSize();
if (_nextView != _currentView)
{
Interlocked.Exchange(ref _currentView, _nextView);
using( TimeSpanAwaitingToken renderAwaitingToken = frameTimeProvider.ParticipantSpanAwaiting(
1 ) ) {
renderAwaitingToken.TimeSpanRefreshed += ( _, _ ) => { };
while( _closed ) {
foreach( ViewPort context in CurrentView.Render ) {
context.FlushSize();
}
CurrentView.Use();
renderAwaitingToken.WaitNextSpan();
Interlocked.Add( ref _frameCount, 1 );
}
}
CurrentView.Use();
RenderStream.PollEvents();
frameTimeProvider.WaitNextSpan();
Interlocked.Add(ref _frameCount, 1);
}
}