找回密码
 立即注册
查看: 163|回复: 0

关于UniTask的一些笔记

[复制链接]
发表于 2024-7-15 18:15 | 显示全部楼层 |阅读模式
Unity 的 UniTask 是一种用于异步编程的 C# 库,它扩展了 .NET 中的 Task 和 await/async 模式。
    1. 与传统的 Task 和 async/await 模式对比,UniTask 更加轻量级,因为它不需要像 Task 一样创建和打点线程池。
    2. UniTask 具有更高的性能,因为它使用了更少的内存和 CPU 资源。
    3. UniTask 还提供了更多的功能,如打消和超时等功能,这些功能在传统的 Task 中并不容易实现。

Unitask 的常见用法:
异步等待:使用 await 关键字,可以等待一个异步操作完成,这样就不需要手动措置回调或使用协程。

延迟执行:使用 UniTask.Delay 方式可以在指定的时间后执行一个操作,而不需要使用协程或计时器。

同步化操作:使用 UniTask.SwitchToMainThread 方式可以在主线程上执行一个操作,这对于访谒 Unity 的组件或 API 非常有用。

迭代器:使用 UniTask.ToCoroutine 方式可以将一个 UniTask 对象转换为 IEnumerator,从而可以在协程中使用。

任务链:使用 UniTask.WhenAll 或 UniTask.WhenAny 方式可以创建一个任务链,等待多个异步操作完成后执行下一步操作。

打消任务:使用 UniTaskCancellationToken 类可以打消异步操作,这对于长时间运行的操作非常有用。

UniTask的特点
1.UniTask是一种基于C#布局体的异步操作库,可以在Unity中使用,UniTask使用了自定义的AsyncMethodBuilder来实现零GC的方针,这使得所有Unity的异步操作和协程可以使用await语法。
3.unitask可以为 Unity 提供有效的无GC async/await集成。
4.UniTask 还提供了异步 LINQ、Channel 和 AsyncReactiveProperty 功能。
5.UniTask 提供了 TaskTracker(Task 追踪器)窗口,用于辅佐开发者在运行时监视和诊断 UniTask 的内存泄漏问题。
6.UniTask 提供了对 MonoBehaviour 动静事件和 uGUI 事件的 Await/AsyncEnumerable 撑持。
7.UniTask 与 .NET 尺度库中的 Task、ValueTask 和 IValueTaskSource 接口具有高度的行为兼容性。

unitask为什么可以为 Unity 提供有效的无GC async/await集成。
1.Unitask 基于 C# Task 进行开发
2.是因为Unitask 通过优化 Task 的创建和销毁过程,尽可能地减少了 Task 的 Allocation,从而减少了 GC 压力。
3.Unitask 提供了自定义的任务调剂器,通过调剂器的设置,可以控制任务的执行挨次、优先级和并发度等,从而更好地控制游戏的性能。
4.Unitask 针对 Unity 游戏开发场景进行了优化,比如撑持 Unity 主线程的同法式用、撑持 Unity 协程的嵌套和调用、撑持对 Unity 对象的操作和回收等。

    • UniTask.OnAnimatorIKAsync(int layerIndex): 当 Animator 执行 IK 动画时调用。
    • UniTask.OnAnimatorMoveAsync(): 当 Animator 更新物体的 transform 时调用。
    • UniTask.OnApplicationFocusAsync(bool hasFocus): 当应用法式获得或掉去焦点时调用。
    • UniTask.OnApplicationPauseAsync(bool pauseStatus): 当应用法式暂停或恢复时调用。
    • UniTask.OnApplicationQuitAsync(): 当应用法式退出时调用。
    • UniTask.OnAudioFilterReadAsync(float[] data, int channels): 当 AudioSource 读取音频数据时调用。
    • UniTask.OnBecameInvisibleAsync(): 当该对象从相机视野中消掉时调用。
    • UniTask.OnBecameVisibleAsync(): 当该对象进入相机视野时调用。
    • UniTask.OnCollisionEnterAsync(Collision collision): 当该对象与另一个对象发生碰撞时调用。
    • UniTask.OnCollisionExitAsync(Collision collision): 当该对象与另一个对象碰撞结束时调用。
    • UniTask.OnCollisionStayAsync(Collision collision): 当该对象与另一个对象持续碰撞时调用。
    • UniTask.OnControllerColliderHitAsync(ControllerColliderHit hit): 当该对象与控制器发生碰撞时调用。
    • UniTask.OnDisableAsync(): 当对象被禁用时调用。
    • UniTask.OnEnableAsync(): 当对象被启用时调用。
    • UniTask.OnJointBreakAsync(float breakForce): 当该对象的关节断裂时调用。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-12-4 01:55 , Processed in 0.097948 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表