UniTask

2020-11-18 雨辰

github:

https://github.com/Cysharp/UniTask

什么是UniTask
一般什么情况下使用UniTask
UniTask和UniRx什么关系
UniTask API
UniTaskTracker 可视化任务


什么是UniTask

UniTask是基于C# 5的async和await异步定制的一套Unity优化的异步解决方案;需要Unity2017以上的版本,并且需要升级c#库,
但并不如UniRx项目提供的更为轻量级,可是UniTask拥有强大的async/await和unity进行交互。


一般什么情况下使用UniTask

一般来说首先想到的是网络相关的处理和资源加载需要用UniTask来处理,使用UniRx来处理感觉不够用;还有复杂的运算也可以使用UniTask,当作一个线程来使用就好。


UniTask和UniRx什么关系

没有任何关系,名字比较相似,作者可能认识吧?UniRx并不依靠UniTask来进行异步,UniTask没有UniRx一样可以使用;两种作用不同的解决方案,一个针对多任务处理,一个基于微异步的游戏内容;在GitHub上也是两个解决方案,UniRx的包中有集成UniTask
UniRx
UniTask


UniTask API

基于Unity AsyncOperation拓展的async&awaitAPI

所有Unity中的异步AsyncOperation都可以使用await来等待异步结果,包括AsyncLoadScene、AsyncLoadAsset、AsyncOperation

public class No22_UniTask : MonoBehaviour { async void StartAsync() { // 加载资源 var load = await Resources.LoadAsync<TextAsset>("1"); // 加载场景 await SceneManager.LoadSceneAsync("SampleScene") .ConfigureAwait(Progress.Create<float>(p => Debug.LogFormat("p:{0}", p))); // 网络请求 UnityWebRequest req = UnityWebRequest.Get("http://www.baidu.com"); var op = await req.SendWebRequest(); } void Start() { StartAsync(); } } 
	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

UniTask API

UniTask.WaitUntil
UniTask.WaitWhile
UniTask.WaitUntilValueChanged
UniTask.SwitchToThreadPool
UniTask.SwitchToTaskPool
UniTask.SwitchToMainThread
UniTask.SwitchToSynchronizationContext
UniTask.Yield
UniTask.Run
UniTask.Lazy
UniTask.Void
UniTask.ConfigureAwait
UniTask.DelayFrame
UniTask.Delay(…, bool ignoreTimeScale = false, …) parameter


UniTask.WaitUntil
一直等待直到达到某种条件,才执行下面的代码

public class No22_UniTask : MonoBehaviour { private bool mValue; async void StartAsync() { Debug.LogFormat("frame start:{0}", Time.frameCount); Observable.TimerFrame(100).Subscribe(_ => mValue = true); // 一直等待直到达到某种条件,才执行下面的代码 await UniTask.WaitUntil(() => mValue == true); Debug.LogFormat("frame end:{0}", Time.frameCount); } void Start() { StartAsync(); } } 
	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

UniTask.WaitWhile
当达到某种条件才进行等待,条件失败通过

public class No22_UniTask : MonoBehaviour { private bool mValue; async void StartAsync() { Debug.LogFormat("frame start:{0}", Time.frameCount); Observable.TimerFrame(100).Subscribe(_ => mValue = true); // 当达到某种条件才进行等待,条件失败通过 await UniTask.WaitWhile(() => mValue == false); Debug.LogFormat("frame end:{0}", Time.frameCount); } void Start() { StartAsync(); } } 
	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

UniTask.WaitUntilValueChanged
一直等待直到值有变化了之后才之执行后面的代码


UniTask.SwitchToThreadPool
之后的代码运行在线程池中

public class No22_UniTask : MonoBehaviour { private bool mValue; async void StartAsync() { Debug.LogFormat("frame start:{0}", Time.frameCount); Observable.TimerFrame(100).Subscribe(_ => mValue = true); //之后的代码运行中线程池中 await UniTask.SwitchToThreadPool(); // 当达到某种条件才进行等待,条件失败通过 await UniTask.WaitWhile(() => mValue == false); Debug.LogFormat("frame end:{0}", Time.frameCount); } void Start() { StartAsync(); } } 
	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

UniTask.SwitchToTaskPool
之后的代码运行在任务池中


UniTask.SwitchToMainThread
*之后的代码运行在主线程中


UniTask.SwitchToSynchronizationContext
之后的代码运行在同步句柄中


UniTask.Yield
相当于yiled return [operation]

public class No22_UniTask : MonoBehaviour { async void StartAsync() { Debug.LogFormat("frame start:{0}", Time.frameCount); // PlayerLoopTiming.PostLateUpdate  =  WaitForEndOfFrame // yield return null // yield return WaitForFixedUpdate await UniTask.Yield(PlayerLoopTiming.PostLateUpdate); Debug.LogFormat("frame end:{0}", Time.frameCount); } void Start() { StartAsync(); } } 
	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

UniTask.Run
启动一个标准的线程

public class No22_UniTask : MonoBehaviour { async void StartAsync() { Debug.LogFormat("frame start:{0}", Time.frameCount); // 启动一个标准的线程 await UniTask.Run(() => Debug.Log("heavy task heavy cal")); Debug.LogFormat("frame end:{0}", Time.frameCount); } void Start() { StartAsync(); } } 
	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

UniTask.Lazy
启动一个回调线程

public class No22_UniTask : MonoBehaviour { private UniTask<int> mLazy; async void StartAsync() { Debug.LogFormat("frame start:{0}", Time.frameCount); // 启动一个回调线程 await UniTask.Lazy<int>(() => UniTask.DelayFrame(100)); Debug.LogFormat("frame end:{0}", Time.frameCount); } void Start() { StartAsync(); } } 
	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

UniTask.Void
void回调辅助方法

public class No22_UniTask : MonoBehaviour { async void StartAsync() { Debug.LogFormat("frame start:{0}", Time.frameCount); // void回调辅助方法 UniTask.Void(Method); Debug.LogFormat("frame end:{0}", Time.frameCount); } private UniTask Method() { return UniTask.DelayFrame(100); } void Start() { StartAsync(); } } 
	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

UniTask.ConfigureAwait
基于AsyncOperation的拓展配置

public class No22_UniTask : MonoBehaviour { async void StartAsync() { Debug.LogFormat("frame start:{0}", Time.frameCount); // 基于AsyncOperation的拓展配置 Resources.LoadAsync<TextAsset>("1").ConfigureAwait(Progress.Create<float>(p => Debug.LogFormat("p:{0}", p))); Debug.LogFormat("frame end:{0}", Time.frameCount); } private UniTask Method() { return UniTask.DelayFrame(100); } void Start() { StartAsync(); } } 
	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

UniTask.DelayFrame
延时指定的帧数执行下面的代码


UniTask.Delay(…, bool ignoreTimeScale = false, …) parameter
延时指定的时间执行下面的代码


UniTaskTracker 可视化任务
使用UniTask的监视器,可以监视当前执行的哪些任务
在这里插入图片描述
Enable AutoReload:是否允许自动加载task
Enable Tracking: 是否允许跟踪task
Enable StackTrace:是否允许堆栈跟踪
Reload:重新加载task列表
GC.Collect:进行GC回收

评论:

yenhost
2021-06-22 02:17
<a href="https://www.gestiarchivos.com/samsung-s9-initial-case-casec">samsung s9 initial case</a> <a href="https://www.fluffsstuffs.com/givenchy-nano-belt-zak-tassenb">givenchy nano belt zak</a> <a href="https://www.caldreamapp.com/cosmos-modr%C3%BD-iphone-8-plus-pouzdro-pouzdroe">cosmos modr媒 iphone 8 plus pouzdro</a> <a href="https://www.kwlagunabeach.com/nachov%C3%BD-mesh-%C5%A1aty-satyc">nachov媒 mesh 拧aty</a> <a href="https://www.yenhost.com/san-diego-padres-mlb-team-linen-9twenty-berretto-cappelloa">san diego padres mlb team linen 9twenty berretto</a> <a href="https://www.allgoodguide.com/minimalist-shoes-2019-bootsa">minimalist shoes 2019</a>
[url=https://www.yenhost.com/]yenhost[/url]
Tavyfrada
2021-06-18 17:41
<a href=http://vsviagrav.com>generic viagra benefits
Tavyfrada
2021-06-15 10:32
<a href=https://vsviagrav.com>viagra online best price
Tavyfrada
2021-06-14 07:09
<a href=https://ponlinecialisk.com>cialis 20mg for sale
pagealyze
2021-06-11 23:48
<a href="https://www.threedoglight.com/large-duffel-zak-for-travel-tassenb">large duffel zak for travel</a> <a href="https://www.iwebla.com/iphone-xs-personalised-pouzdro-pouzdroe">iphone xs personalised pouzdro</a> <a href="https://www.flamelesswax.com/long-sleeve-bodycon-%C5%A1aty-uk-satyc">long sleeve bodycon 拧aty uk</a> <a href="https://www.peggymyer.com/cincinnati-reds-47-mlb-sure-shot-47-snapback-berretto-cappelloa">cincinnati reds 47 mlb sure shot 47 snapback berretto</a> <a href="https://www.actjuris.com/crocs-mens-modi-sport-flip-flops-bootsa">crocs mens modi sport flip flops</a> <a href="https://www.thealcoveco.com/hausschuhe-25-kinder-stiefeld">hausschuhe 25 kinder</a>
pagealyze https://www.pagealyze.com/
Tavyfrada
2021-06-09 03:10
<a href=https://vslevitrav.com/>levitra 40 mg best price
boomercubclub
2021-05-28 14:14
<a href="https://www.masessamd.com/huawei-tablet-8-inch-hoesje-hoesjea">huawei tablet 8 inch hoesje</a> <a href="https://www.optisaurus.com/mens-nike-dallas-cowboys-31-byron-jones-limited-white-tank-top-suit-nfl-jersey-jerseyc">mens nike dallas cowboys 31 byron jones limited white tank top suit nfl jersey</a> <a href="https://www.skylineblade.com/31-thermal-plecak-torebkid">31 thermal plecak</a> <a href="https://www.xlbutt.com/note-9-case-with-lanyard-casec">note 9 case with lanyard</a> <a href="https://www.mayepmuncua.com/disney-rugzak-handtas-tassenb">disney rugzak handtas</a> <a href="https://www.gototagaytay.com/top-rated-iphone-pouzdro-pouzdroe">top rated iphone pouzdro</a>
boomercubclub https://www.boomercubclub.com/
sensepeanut
2021-05-24 04:37
<a href="http://www.bitdaric.com/rucksack-damen-canvas-tasched">rucksack damen canvas</a> <a href="http://www.ajpaircon.com/felpa-adidas-bambina-nera-tutab">felpa adidas bambina nera</a> <a href="http://www.flcodecamp.com/air-max-95-ultra-kaki-chaussures1">air max 95 ultra kaki</a> <a href="http://www.niubvnp.com/asics-gt-2000-verde-zapatos1">asics gt 2000 verde</a> <a href="http://www.henryglegg.com/vintage-utah-jazz-cappello-cappellod">vintage utah jazz cappello</a> <a href="http://www.frigoarreda.com/asics-gel-kayano-triple-feh%C3%A9r-sneaker5">asics gel kayano triple feh茅r</a>
sensepeanut http://www.sensepeanut.com/
Tavyfrada
2021-05-13 07:36
<a href=https://cialitab.com/>best generic cialis
echouroukplus
2021-05-11 05:26
<a href="http://us.boydakkariyer.net/toys-games-strollers-ame">toys games strollers</a> <a href="http://us.vdxinstitute.net/arts-crafts-sewing-baskets-amc">arts crafts sewing baskets</a> <a href="http://us.dicios.net/industrial-scientific-connectors-amb">industrial scientific connectors</a> <a href="http://us.shoptapp.net/womens-stud-earrings-2-amc">womens stud earrings 2</a> <a href="http://us.diocesemo.net/womens-one-pieces-1-amc">womens one pieces 1</a> <a href="http://us.fairemonchoix.net/tools-home-improvement-floor-cord-covers-2-ama">tools home improvement floor cord covers 2</a>
echouroukplus http://us.echouroukplus.com/

发表评论:

淘气男孩 朱文华 joyimp|@2011-2021 京ICP备16030765号-2