UniVRM/Assets/VRMShaders/GLTF/IO/Runtime/AwaitCaller/IAwaitCaller.cs
Takayuki Matsuoka a68d0122ce 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
2022-09-08 17:39:05 +09:00

42 lines
1.4 KiB
C#

using System;
using System.Threading.Tasks;
namespace VRMShaders
{
/// <summary>
/// ImporterContext の 非同期実行 LoadAsync を補助する。
/// この関数を経由して await すること。
/// そうしないと、同期実行 Load 時にデッドロックに陥るかもしれない。
/// (SynchronizationContext に Post された 継続が再開されない)
/// </summary>
public interface IAwaitCaller
{
/// <summary>
/// フレームレートを維持するために1フレーム待つ
/// </summary>
/// <returns></returns>
Task NextFrame();
/// <summary>
/// 非同期に実行して、終了を待つ
/// </summary>
/// <param name="action"></param>
/// <returns></returns>
Task Run(Action action);
/// <summary>
/// 非同期に実行して、終了を待つ
/// </summary>
/// <param name="action"></param>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
Task<T> Run<T>(Func<T> action);
/// <summary>
/// 指定した時間が経過している場合のみ、NextFrame() を使って1フレーム待つ
/// </summary>
/// <returns>タイムアウト時はNextFrame()を呼び出す。そうではない場合、Task.CompletedTaskを返す</returns>
Task NextFrameIfTimedOut();
}
}