mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-05-14 14:29:52 -05:00
BREAKING CHANGE: Introduce NextFrameIfTimedOut as a new interface method of IAwaitCaller
This is a breaking change since it introduces new interface method to IAwaitCaller. ---- NextFrameIfTimedOut() is added to IAwaitCaller. The following inheritors also introduce the method. - ImmediateCaller.NextFrameIfTimedOut() just invokes NextFrame(). - RuntimeOnlyAwaitCaller.NextFrameIfTimedOut() invokes NextFrame() if timed out. Otherwise, do nothing. - RuntimeOnlyNoThreadAwaitCaller.NextFrameIfTimedOut() works same as RuntimeOnlyAwaitCaller. Constructor of RuntimeOnlyAwaitCaller and RuntimeOnlyNoThreadAwaitCaller now take argument of timeout in seconds. The default value is 1/1000 (1 milliseconds). See also: https://github.com/vrm-c/UniVRM/pull/1781#pullrequestreview-1100131840
This commit is contained in:
parent
8399f9cd18
commit
a68d0122ce
|
|
@ -31,5 +31,11 @@ namespace VRMShaders
|
|||
/// <typeparam name="T"></typeparam>
|
||||
/// <returns></returns>
|
||||
Task<T> Run<T>(Func<T> action);
|
||||
|
||||
/// <summary>
|
||||
/// 指定した時間が経過している場合のみ、NextFrame() を使って1フレーム待つ
|
||||
/// </summary>
|
||||
/// <returns>タイムアウト時はNextFrame()を呼び出す。そうではない場合、Task.CompletedTaskを返す</returns>
|
||||
Task NextFrameIfTimedOut();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,5 +23,7 @@ namespace VRMShaders
|
|||
{
|
||||
return Task.FromResult(action());
|
||||
}
|
||||
|
||||
public Task NextFrameIfTimedOut() => NextFrame();
|
||||
}
|
||||
}
|
||||
|
|
@ -10,14 +10,23 @@ namespace VRMShaders
|
|||
public sealed class RuntimeOnlyAwaitCaller : IAwaitCaller
|
||||
{
|
||||
private readonly NextFrameTaskScheduler _scheduler;
|
||||
private readonly float _timeOutInSeconds;
|
||||
private float _lastTimeoutBaseTime;
|
||||
|
||||
public RuntimeOnlyAwaitCaller()
|
||||
/// <summary>
|
||||
/// タイムアウト指定可能なコンストラクタ
|
||||
/// </summary>
|
||||
/// <param name="timeOutInSeconds">NextFrameIfTimedOutがタイムアウトと見なす時間(秒単位)</param>
|
||||
public RuntimeOnlyAwaitCaller(float timeOutInSeconds = 1f / 1000f)
|
||||
{
|
||||
_scheduler = new NextFrameTaskScheduler();
|
||||
_timeOutInSeconds = timeOutInSeconds;
|
||||
ResetLastTimeoutBaseTime();
|
||||
}
|
||||
|
||||
public Task NextFrame()
|
||||
{
|
||||
ResetLastTimeoutBaseTime();
|
||||
var tcs = new TaskCompletionSource<object>();
|
||||
_scheduler.Enqueue(() => tcs.SetResult(default));
|
||||
return tcs.Task;
|
||||
|
|
@ -33,50 +42,20 @@ namespace VRMShaders
|
|||
return Task.Run(action);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 指定した時間が経過している場合のみ、NextFrame() を使って1フレーム待つ
|
||||
/// </summary>
|
||||
/// <param name="timeOutInMilliseconds">タイムアウト時間(ミリ秒単位)</param>
|
||||
/// <returns>タイムアウト時はNextFrame()を呼び出す。そうではない場合、Task.CompletedTaskを返す</returns>
|
||||
public Task NextFrameIfTimedOut_(float timeOutInMilliseconds = 1f)
|
||||
{
|
||||
if (!CheckTimeOut(timeOutInMilliseconds))
|
||||
{
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
_lastBaseTime = 0f;
|
||||
return NextFrame();
|
||||
}
|
||||
public Task NextFrameIfTimedOut() => CheckTimeout() ? NextFrame() : Task.CompletedTask;
|
||||
|
||||
private bool CheckTimeOut(float timeOutInMilliseconds)
|
||||
private void ResetLastTimeoutBaseTime() => _lastTimeoutBaseTime = 0f;
|
||||
|
||||
private bool LastTimeoutBaseTimeNeedsReset => _lastTimeoutBaseTime == 0f;
|
||||
|
||||
private bool CheckTimeout()
|
||||
{
|
||||
float t = UnityEngine.Time.realtimeSinceStartup;
|
||||
if (_lastBaseTime == 0f)
|
||||
if (LastTimeoutBaseTimeNeedsReset)
|
||||
{
|
||||
// Reset base time
|
||||
_lastBaseTime = t;
|
||||
_lastTimeoutBaseTime = t;
|
||||
}
|
||||
return (t - _lastBaseTime) >= timeOutInMilliseconds * (1f / 1000f);
|
||||
}
|
||||
|
||||
private float _lastBaseTime;
|
||||
}
|
||||
|
||||
internal static class RuntimeOnlyAwaitCallerHelper
|
||||
{
|
||||
/// <summary>
|
||||
/// 指定した時間が経過している場合のみ、NextFrame() を使って1フレーム待つ
|
||||
/// </summary>
|
||||
/// <param name="iAwaitCaller">IAwaitCallerのインスタンス</param>
|
||||
/// <param name="timeOutInMilliseconds">タイムアウト時間(ミリ秒単位)</param>
|
||||
/// <returns>タイムアウト時はNextFrame()を呼び出す。そうではない場合、Task.CompletedTaskを返す</returns>
|
||||
internal static Task NextFrameIfTimedOut(this IAwaitCaller iAwaitCaller, float timeOutInMilliseconds)
|
||||
{
|
||||
if (iAwaitCaller is RuntimeOnlyAwaitCaller runtimeOnlyAwaitCaller)
|
||||
{
|
||||
return runtimeOnlyAwaitCaller.NextFrameIfTimedOut_(timeOutInMilliseconds);
|
||||
}
|
||||
return Task.CompletedTask;
|
||||
return (t - _lastTimeoutBaseTime) >= _timeOutInSeconds;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,14 +10,23 @@ namespace VRMShaders
|
|||
public sealed class RuntimeOnlyNoThreadAwaitCaller : IAwaitCaller
|
||||
{
|
||||
private readonly NextFrameTaskScheduler _scheduler;
|
||||
private readonly float _timeoutInSeconds;
|
||||
private float _lastTimeoutBaseTime;
|
||||
|
||||
public RuntimeOnlyNoThreadAwaitCaller()
|
||||
/// <summary>
|
||||
/// タイムアウト指定可能なコンストラクタ
|
||||
/// </summary>
|
||||
/// <param name="timeoutInSeconds">NextFrameIfTimedOutがタイムアウトと見なす時間(秒単位)</param>
|
||||
public RuntimeOnlyNoThreadAwaitCaller(float timeoutInSeconds = 1f / 1000f)
|
||||
{
|
||||
_scheduler = new NextFrameTaskScheduler();
|
||||
_timeoutInSeconds = timeoutInSeconds;
|
||||
ResetLastTimeoutBaseTime();
|
||||
}
|
||||
|
||||
public Task NextFrame()
|
||||
{
|
||||
ResetLastTimeoutBaseTime();
|
||||
var tcs = new TaskCompletionSource<object>();
|
||||
_scheduler.Enqueue(() => tcs.SetResult(default));
|
||||
return tcs.Task;
|
||||
|
|
@ -47,5 +56,21 @@ namespace VRMShaders
|
|||
return Task.FromException<T>(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public Task NextFrameIfTimedOut() => CheckTimeout() ? NextFrame() : Task.CompletedTask;
|
||||
|
||||
private void ResetLastTimeoutBaseTime() => _lastTimeoutBaseTime = 0f;
|
||||
|
||||
private bool LastTimeoutBaseTimeNeedsReset => _lastTimeoutBaseTime == 0f;
|
||||
|
||||
private bool CheckTimeout()
|
||||
{
|
||||
float t = UnityEngine.Time.realtimeSinceStartup;
|
||||
if (LastTimeoutBaseTimeNeedsReset)
|
||||
{
|
||||
_lastTimeoutBaseTime = t;
|
||||
}
|
||||
return (t - _lastTimeoutBaseTime) >= _timeoutInSeconds;
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user