diff --git a/Assets/Scenes/SandboxMain.cs b/Assets/Scenes/SandboxMain.cs index c8c4c13..f14c761 100644 --- a/Assets/Scenes/SandboxMain.cs +++ b/Assets/Scenes/SandboxMain.cs @@ -6,10 +6,29 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using UniRx.Async; +using Unity.Collections; +using Unity.Jobs; using UnityEngine; using UnityEngine.Networking; using UnityEngine.UI; +public struct MyJob : IJob +{ + public int loopCount; + public NativeArray inOut; + public int result; + + public void Execute() + { + result = 0; + for (int i = 0; i < loopCount; i++) + { + result++; + } + inOut[0] = result; + } +} + public class SandboxMain : MonoBehaviour { public Button okButton; @@ -20,11 +39,45 @@ public class SandboxMain : MonoBehaviour UniTaskCompletionSource ucs; + + + async UniTask RunStandardDelayAsync() + { + UnityEngine.Debug.Log("DEB"); + + await UniTask.DelayFrame(30); + + UnityEngine.Debug.Log("DEB END"); + } + + async UniTask RunJobAsync() + { + var job = new MyJob() { loopCount = 999, inOut = new NativeArray(1, Allocator.TempJob) }; + JobHandle.ScheduleBatchedJobs(); + + var scheduled = job.Schedule(); + + + + + UnityEngine.Debug.Log("OK"); + await scheduled; // .ConfigureAwait(PlayerLoopTiming.Update); // .WaitAsync(PlayerLoopTiming.Update); + UnityEngine.Debug.Log("OK2"); + + job.inOut.Dispose(); + } + void Start() { + Application.SetStackTraceLogType(LogType.Error, StackTraceLogType.Full); + Application.SetStackTraceLogType(LogType.Exception, StackTraceLogType.Full); + var playerLoop = UnityEngine.LowLevel.PlayerLoop.GetCurrentPlayerLoop(); ShowPlayerLoop.DumpPlayerLoop("Current", playerLoop); + + RunStandardDelayAsync().Forget(); + //for (int i = 0; i < 14; i++) //{ // TimingDump((PlayerLoopTiming)i).Forget(); @@ -36,6 +89,19 @@ public class SandboxMain : MonoBehaviour // ----- + RunJobAsync().Forget(); + + //var cor = UniTask.ToCoroutine(async () => + // { + // var job = new MyJob() { loopCount = 999, inOut = new NativeArray(1, Allocator.TempJob) }; + // JobHandle.ScheduleBatchedJobs(); + // await job.Schedule().WaitAsync(PlayerLoopTiming.Update); + // job.inOut.Dispose(); + // }); + + //StartCoroutine(cor); + + Application.logMessageReceived += Application_logMessageReceived; @@ -56,6 +122,22 @@ public class SandboxMain : MonoBehaviour }); } + async UniTask SimpleAwait() + { + await UniTask.Yield(); + await UniTask.Yield(); + await UniTask.Yield(); + throw new InvalidOperationException("bar!!!"); + } + + IEnumerator SimpleCoroutine() + { + yield return null; + yield return null; + yield return null; + throw new InvalidOperationException("foo!!!"); + } + async UniTask TimingDump(PlayerLoopTiming timing) { while (true) @@ -124,33 +206,33 @@ public class SandboxMain : MonoBehaviour } } -/* -PlayerLoopTiming.Initialization -PlayerLoopTiming.LastInitialization -PlayerLoopTiming.EarlyUpdate -PlayerLoopTiming.LastEarlyUpdate -PlayerLoopTiming.PreUpdate -PlayerLoopTiming.LastPreUpdate -PlayerLoopTiming.Update -Update -yield null -yield WaitForSeconds -yield WWW -yield StartCoroutine -PlayerLoopTiming.LastUpdate -PlayerLoopTiming.PreLateUpdate -LateUpdate -PlayerLoopTiming.LastPreLateUpdate -PlayerLoopTiming.PostLateUpdate -PlayerLoopTiming.LastPostLateUpdate -yield WaitForEndOfFrame + /* + PlayerLoopTiming.Initialization + PlayerLoopTiming.LastInitialization + PlayerLoopTiming.EarlyUpdate + PlayerLoopTiming.LastEarlyUpdate + PlayerLoopTiming.PreUpdate + PlayerLoopTiming.LastPreUpdate + PlayerLoopTiming.Update + Update + yield null + yield WaitForSeconds + yield WWW + yield StartCoroutine + PlayerLoopTiming.LastUpdate + PlayerLoopTiming.PreLateUpdate + LateUpdate + PlayerLoopTiming.LastPreLateUpdate + PlayerLoopTiming.PostLateUpdate + PlayerLoopTiming.LastPostLateUpdate + yield WaitForEndOfFrame -// --- Physics Loop -PlayerLoopTiming.FixedUpdate -FixedUpdate -yield WaitForFixedUpdate -PlayerLoopTiming.LastFixedUpdate -*/ + // --- Physics Loop + PlayerLoopTiming.FixedUpdate + FixedUpdate + yield WaitForFixedUpdate + PlayerLoopTiming.LastFixedUpdate + */ diff --git a/Assets/UniRx.Async/UnityAsyncExtensions.Jobs.cs b/Assets/UniRx.Async/UnityAsyncExtensions.Jobs.cs index 4c76539..fea8b21 100644 --- a/Assets/UniRx.Async/UnityAsyncExtensions.Jobs.cs +++ b/Assets/UniRx.Async/UnityAsyncExtensions.Jobs.cs @@ -9,42 +9,45 @@ namespace UniRx.Async { public static partial class UnityAsyncExtensions { + public static async UniTask WaitAsync(this JobHandle jobHandle, PlayerLoopTiming waitTiming) + { + await UniTask.Yield(waitTiming); + jobHandle.Complete(); + } + public static UniTask.Awaiter GetAwaiter(this JobHandle jobHandle) { - var handler = JobHandlePromise.Create(jobHandle, CancellationToken.None, out var token); - if (handler.GetStatus(token).IsCompleted() && handler is JobHandlePromise loopItem) + var handler = JobHandlePromise.Create(jobHandle, out var token); { - PlayerLoopHelper.AddAction(PlayerLoopTiming.EarlyUpdate, loopItem); - PlayerLoopHelper.AddAction(PlayerLoopTiming.PreUpdate, loopItem); - PlayerLoopHelper.AddAction(PlayerLoopTiming.Update, loopItem); - PlayerLoopHelper.AddAction(PlayerLoopTiming.PreLateUpdate, loopItem); - PlayerLoopHelper.AddAction(PlayerLoopTiming.PostLateUpdate, loopItem); + PlayerLoopHelper.AddAction(PlayerLoopTiming.EarlyUpdate, handler); + PlayerLoopHelper.AddAction(PlayerLoopTiming.PreUpdate, handler); + PlayerLoopHelper.AddAction(PlayerLoopTiming.Update, handler); + PlayerLoopHelper.AddAction(PlayerLoopTiming.PreLateUpdate, handler); + PlayerLoopHelper.AddAction(PlayerLoopTiming.PostLateUpdate, handler); } return new UniTask(handler, token).GetAwaiter(); } - public static UniTask ToUniTask(this JobHandle jobHandle, CancellationToken cancellation = default(CancellationToken)) + public static UniTask ToUniTask(this JobHandle jobHandle) { - var handler = JobHandlePromise.Create(jobHandle, cancellation, out var token); - if (handler.GetStatus(token).IsCompleted() && handler is JobHandlePromise loopItem) + var handler = JobHandlePromise.Create(jobHandle, out var token); { - PlayerLoopHelper.AddAction(PlayerLoopTiming.EarlyUpdate, loopItem); - PlayerLoopHelper.AddAction(PlayerLoopTiming.PreUpdate, loopItem); - PlayerLoopHelper.AddAction(PlayerLoopTiming.Update, loopItem); - PlayerLoopHelper.AddAction(PlayerLoopTiming.PreLateUpdate, loopItem); - PlayerLoopHelper.AddAction(PlayerLoopTiming.PostLateUpdate, loopItem); + PlayerLoopHelper.AddAction(PlayerLoopTiming.EarlyUpdate, handler); + PlayerLoopHelper.AddAction(PlayerLoopTiming.PreUpdate, handler); + PlayerLoopHelper.AddAction(PlayerLoopTiming.Update, handler); + PlayerLoopHelper.AddAction(PlayerLoopTiming.PreLateUpdate, handler); + PlayerLoopHelper.AddAction(PlayerLoopTiming.PostLateUpdate, handler); } return new UniTask(handler, token); } - public static UniTask ConfigureAwait(this JobHandle jobHandle, PlayerLoopTiming waitTiming, CancellationToken cancellation = default(CancellationToken)) + public static UniTask ConfigureAwait(this JobHandle jobHandle, PlayerLoopTiming waitTiming) { - var handler = JobHandlePromise.Create(jobHandle, cancellation, out var token); - if (handler.GetStatus(token).IsCompleted() && handler is JobHandlePromise loopItem) + var handler = JobHandlePromise.Create(jobHandle, out var token); { - PlayerLoopHelper.AddAction(waitTiming, loopItem); + PlayerLoopHelper.AddAction(waitTiming, handler); } return new UniTask(handler, token); @@ -53,22 +56,16 @@ namespace UniRx.Async sealed class JobHandlePromise : IUniTaskSource, IPlayerLoopItem { JobHandle jobHandle; - CancellationToken cancellationToken; UniTaskCompletionSourceCore core; - public static IUniTaskSource Create(JobHandle jobHandle, CancellationToken cancellationToken, out short token) + // Cancellation is not supported. + public static JobHandlePromise Create(JobHandle jobHandle, out short token) { - if (cancellationToken.IsCancellationRequested) - { - return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); - } - // not use pool. var result = new JobHandlePromise(); result.jobHandle = jobHandle; - result.cancellationToken = cancellationToken; TaskTracker.TrackActiveTask(result, 3); @@ -99,12 +96,6 @@ namespace UniRx.Async public bool MoveNext() { - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - return false; - } - if (jobHandle.IsCompleted) { jobHandle.Complete();