UniTask/Assets/Scenes/SandboxMain.cs

297 lines
6.9 KiB
C#
Raw Normal View History

2019-05-30 18:41:23 +08:00
using System;
using System.Collections;
2019-05-19 23:14:47 +08:00
using System.Collections.Generic;
2020-04-15 14:23:23 +08:00
using System.IO;
2020-04-19 02:38:30 +08:00
using System.Text;
2019-05-30 18:41:23 +08:00
using System.Threading;
2020-04-18 04:07:59 +08:00
using System.Threading.Tasks;
using Cysharp.Threading.Tasks;
2020-05-05 17:12:52 +08:00
using Unity.Collections;
using Unity.Jobs;
2019-05-19 23:14:47 +08:00
using UnityEngine;
2019-05-30 18:41:23 +08:00
using UnityEngine.Networking;
using UnityEngine.UI;
2019-05-19 23:14:47 +08:00
2020-05-05 17:12:52 +08:00
public struct MyJob : IJob
{
public int loopCount;
public NativeArray<int> inOut;
public int result;
public void Execute()
{
result = 0;
for (int i = 0; i < loopCount; i++)
{
result++;
}
inOut[0] = result;
}
}
2019-05-19 23:14:47 +08:00
public class SandboxMain : MonoBehaviour
{
2019-05-30 18:41:23 +08:00
public Button okButton;
public Button cancelButton;
2020-04-18 04:07:59 +08:00
public Text text;
2019-05-30 18:41:23 +08:00
CancellationTokenSource cts;
2019-05-19 23:14:47 +08:00
UniTaskCompletionSource ucs;
2020-04-18 04:07:59 +08:00
2020-05-05 17:12:52 +08:00
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<int>(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();
}
2020-04-18 04:07:59 +08:00
void Start()
2019-05-19 23:14:47 +08:00
{
2020-05-05 17:12:52 +08:00
Application.SetStackTraceLogType(LogType.Error, StackTraceLogType.Full);
Application.SetStackTraceLogType(LogType.Exception, StackTraceLogType.Full);
2020-05-05 04:22:49 +08:00
var playerLoop = UnityEngine.LowLevel.PlayerLoop.GetCurrentPlayerLoop();
ShowPlayerLoop.DumpPlayerLoop("Current", playerLoop);
2020-05-05 17:12:52 +08:00
RunStandardDelayAsync().Forget();
2020-05-05 04:22:49 +08:00
//for (int i = 0; i < 14; i++)
//{
// TimingDump((PlayerLoopTiming)i).Forget();
//}
//StartCoroutine(CoroutineDump("yield WaitForEndOfFrame", new WaitForEndOfFrame()));
//StartCoroutine(CoroutineDump("yield WaitForFixedUpdate", new WaitForFixedUpdate()));
//StartCoroutine(CoroutineDump("yield null", null));
2020-04-18 04:07:59 +08:00
// -----
2020-05-05 17:12:52 +08:00
RunJobAsync().Forget();
//var cor = UniTask.ToCoroutine(async () =>
// {
// var job = new MyJob() { loopCount = 999, inOut = new NativeArray<int>(1, Allocator.TempJob) };
// JobHandle.ScheduleBatchedJobs();
// await job.Schedule().WaitAsync(PlayerLoopTiming.Update);
// job.inOut.Dispose();
// });
//StartCoroutine(cor);
2020-04-18 04:07:59 +08:00
Application.logMessageReceived += Application_logMessageReceived;
ucs = new UniTaskCompletionSource();
2020-04-18 04:07:59 +08:00
2020-04-18 21:11:40 +08:00
okButton.onClick.AddListener(async () =>
2020-04-18 04:07:59 +08:00
{
2020-04-18 21:11:40 +08:00
await InnerAsync(false);
});
2020-04-18 04:07:59 +08:00
cancelButton.onClick.AddListener(async () =>
{
text.text = "";
2020-05-04 00:59:22 +08:00
// ucs.TrySetResult();
2020-04-18 04:07:59 +08:00
await ucs.Task;
});
}
2020-05-05 17:12:52 +08:00
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!!!");
}
2020-05-05 04:22:49 +08:00
async UniTask TimingDump(PlayerLoopTiming timing)
{
while (true)
{
await UniTask.Yield(timing);
Debug.Log("PlayerLoopTiming." + timing);
}
}
IEnumerator CoroutineDump(string msg, YieldInstruction waitObj)
{
while (true)
{
yield return waitObj;
Debug.Log(msg);
}
}
//private void Update()
//{
// Debug.Log("Update");
//}
//private void LateUpdate()
//{
// Debug.Log("LateUpdate");
//}
//private void FixedUpdate()
//{
// Debug.Log("FixedUpdate");
//}
2020-04-18 04:07:59 +08:00
private void Application_logMessageReceived(string condition, string stackTrace, LogType type)
{
text.text += "\n" + condition;
}
async UniTask OuterAsync(bool b)
2020-04-18 04:07:59 +08:00
{
UnityEngine.Debug.Log("START OUTER");
await InnerAsync(b);
await InnerAsync(b);
UnityEngine.Debug.Log("END OUTER");
// throw new InvalidOperationException("NAZO ERROR!?"); // error!?
}
async UniTask InnerAsync(bool b)
2020-04-18 04:07:59 +08:00
{
if (b)
{
UnityEngine.Debug.Log("Start delay:" + Time.frameCount);
await UniTask.DelayFrame(60);
2020-04-18 04:07:59 +08:00
UnityEngine.Debug.Log("End delay:" + Time.frameCount);
await UniTask.DelayFrame(60);
2020-04-18 04:07:59 +08:00
UnityEngine.Debug.Log("Onemore end delay:" + Time.frameCount);
}
else
{
2020-04-18 21:11:40 +08:00
UnityEngine.Debug.Log("Empty END");
throw new InvalidOperationException("FOOBARBAZ");
2020-04-18 04:07:59 +08:00
}
}
2019-05-30 18:41:23 +08:00
2020-05-05 17:12:52 +08:00
/*
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
*/
2020-04-18 04:07:59 +08:00
private void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
// e.SetObserved();
// or other custom write code.
UnityEngine.Debug.LogError("Unobserved:" + e.Exception.ToString());
2019-05-19 23:14:47 +08:00
}
}
2019-05-30 18:41:23 +08:00
2020-04-19 02:38:30 +08:00
public class ShowPlayerLoop
{
2020-05-05 04:22:49 +08:00
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
2020-04-19 02:38:30 +08:00
static void Init()
{
var playerLoop = UnityEngine.LowLevel.PlayerLoop.GetDefaultPlayerLoop();
2020-05-05 04:22:49 +08:00
DumpPlayerLoop("Default", playerLoop);
}
2020-04-19 02:38:30 +08:00
2020-05-05 04:22:49 +08:00
public static void DumpPlayerLoop(string which, UnityEngine.LowLevel.PlayerLoopSystem playerLoop)
{
2020-04-19 02:38:30 +08:00
var sb = new StringBuilder();
2020-05-05 04:22:49 +08:00
sb.AppendLine($"{which} PlayerLoop List");
2020-04-19 02:38:30 +08:00
foreach (var header in playerLoop.subSystemList)
{
sb.AppendFormat("------{0}------", header.type.Name);
sb.AppendLine();
foreach (var subSystem in header.subSystemList)
{
sb.AppendFormat("{0}.{1}", header.type.Name, subSystem.type.Name);
sb.AppendLine();
2020-05-05 04:22:49 +08:00
if (subSystem.subSystemList != null)
{
UnityEngine.Debug.LogWarning("More Subsystem:" + subSystem.subSystemList.Length);
}
2020-04-19 02:38:30 +08:00
}
}
UnityEngine.Debug.Log(sb.ToString());
}
}