前言

UniTask 是一个轻量级的异步编程库,专门为 Unity 设计,旨在提供比 Unity 自带协程更高效的异步处理方式。它是基于 C# 的 asyncawait 语法实现的,比传统协程在性能上更具优势,尤其是在处理大量异步操作时。

为Unity提供一个高性能,零GC的async/await异步方案。

  • 基于值类型的UniTask和自定义的 AsyncMethodBuilder 来实现0GC
  • 使所有 Unity 的 AsyncOperations 和 Coroutines 可等待
  • 基于 PlayerLoop 的任务( UniTask.Yield, UniTask.Delay, UniTask.DelayFrame, etc…) 可以替换所有协程操作
  • 对MonoBehaviour 消息事件和 uGUI 事件进行 可等待/异步枚举 拓展
  • 完全在 Unity 的 PlayerLoop 上运行,因此不使用Thread,并且同样能在 WebGL、wasm 等平台上运行。
  • 带有 Channel 和 AsyncReactiveProperty的异步 LINQ,
  • 提供一个 TaskTracker EditorWindow 以追踪所有UniTask分配来预防内存泄漏
  • 与原生 Task/ValueTask/IValueTaskSource 高度兼容的行为

github地址

https://github.com/Cysharp/UniTask

GC(Garbage Collection,垃圾回收)

GC是一种自动内存管理机制,主要用于编程语言和运行时环境中,负责自动回收不再使用的内存空间,从而防止内存泄漏和减少程序崩溃的风险。GC 的目标是确保程序能够有效地利用内存资源,同时减少内存管理的复杂性。

GC 的影响

  1. 性能开销:GC 会消耗系统资源,导致程序在进行垃圾回收时出现停顿或性能下降。这种性能开销在处理大量对象或频繁的内存分配时尤为明显。

  2. 内存使用:虽然 GC 可以防止内存泄漏,但在 GC 执行期间,程序可能会占用更多的内存。GC 的存在也要求程序员在设计时要考虑内存使用和回收策略,以避免不必要的内存消耗。

  3. 程序的稳定性:通过自动回收不再使用的内存,GC 可以减少程序因内存泄漏而崩溃的风险,从而提高程序的稳定性和可靠性。

总的来说,GC 是现代编程语言和运行时环境中不可或缺的部分,它大大简化了内存管理的复杂性。然而,理解其工作机制和影响可以帮助开发者优化代码性能,减少 GC 造成的性能开销。

UniTask优缺点

优缺点对比:

  • UniTask 优点:

    1. 性能更好:相比协程,UniTask 减少了GC垃圾回收,因为它避免了频繁的 IEnumerator 对象创建。
    2. 易于使用:与 asyncawait 语法配合,代码更简洁、可读性更高。
    3. 支持更多功能:如超时、任务组合等。
  • UniTask 缺点:

    1. 学习曲线:对于不熟悉异步编程的开发者,可能需要一些学习和适应。
    2. 依赖性:需要引入第三方库,相比 Unity 内置的协程多了一层依赖。

Unity 自带协程的优点:

  1. 易于上手:对大多数开发者来说,协程简单且直接。
  2. 原生支持:无需额外的库和学习成本。

使用案例

  1. 异步加载资源

    async UniTask LoadAssetsAsync()
    {
        var texture = await Addressables.LoadAssetAsync<Texture>("assetKey").ToUniTask();
        // 使用 texture
    }
    
  2. 延迟执行

    async UniTask DelayedAction()
    {
        await UniTask.Delay(1000); // 延迟1秒
        // 执行某些操作
    }
    
  3. 任务组合

    async UniTask CombinedTasks()
    {
        await UniTask.WhenAll(Task1(), Task2()); // 等待所有任务完成
        // 处理任务结果
    }
    

案例

//调用
RunReminderAsync().Forget();

private async UniTaskVoid RunReminderAsync()
{
     await UniTask.Delay(System.TimeSpan.FromSeconds(10f));//等待10秒
     
     // 操作    
}

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!如果你遇到任何问题,也欢迎你评论私信或者加群找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐