找回密码
 立即注册
查看: 568|回复: 8

Unity3d的Task存在的坑

[复制链接]
发表于 2021-11-15 11:52 | 显示全部楼层 |阅读模式
Unity3d的Task存在的坑
发表于 2021-11-15 11:57 | 显示全部楼层
老古董表示现在还在new thread有时候甚至还用C++的库。。
发表于 2021-11-15 12:01 | 显示全部楼层
觉得C# Async不好用,涉及多线程及传染性太强,所以实际项目中一直都在使用Promise作为替代方案。
发表于 2021-11-15 12:10 | 显示全部楼层
黑猫白猫,适合解决当前季几遇到的问题的都是好喵[赞][赞][赞]。
发表于 2021-11-15 12:17 | 显示全部楼层
嗯,C# Async的传染性强估计是作者有意为之,作者好像也提倡 async all。对于我们,还是得像你一样,结合生产实际来选型,并没有最好的方案,只有最适合当前的方案,o(* ̄︶ ̄*)o
发表于 2021-11-15 12:23 | 显示全部楼层
每个人遇到的要解决的问题的量级不同,所以写代码没有万金油。也庆幸没有万金油,不然我们的乐趣要少好多[捂嘴]。大佬不可妄自菲薄自己是老古董。
发表于 2021-11-15 12:31 | 显示全部楼层
目前task的主要问题还是取消不方便,不能像协程那样在内部不做处理的情况下直接从外部取消。之前我有写(抄)过一个东西让task协程化(后来又在rpgmaker里写了个promise版),实际用起来尤其是做动画的时候,取消动画变得繁琐了,就束之高阁了。
发表于 2021-11-15 12:32 | 显示全部楼层
这个确实是个比较大的问题,取消起来不方便,感谢补充指正
发表于 2021-11-15 12:32 | 显示全部楼层
应用需求场景不同,async/await请在计算密集型/IO密集型需求下使用,因为这个是真的可以拿来写多线程并发优化。Unity本质还是个单线程,而且相关的协程还是其引擎层进行调度,和async这类更底层的异步编程还是有一定的区别。同时也因为Unity的单线程导致相关的API设计上不是线程安全的,所以即便Task.Run了一个跑在别的线程的任务也没法去用Unity的API。综上也就是:如果觉得unity的一些IO操作效率不喜/存在有类似复杂的寻路算法运算/自实现的ECS数据逻辑剥离解耦[只涉及到纯数据而无需直接和UI交互]的时候建议使用async/Task去实现来达成真正的并发优化,其他时候还是安心使用Unity本家的协程去做更合适。
顺带一提这也是Task不提供Abort的缘故,任务本身是个抽象概念,可以同步可以异步可以单线程也可以多线程,在多线程情况下一个线程不可能直接去强制终止另一个线程的运行---因为你们两同处一个层面;在单线程情况下你也不能终止自身,因此对于Task你需要准备一个CancellationToken 用作取消令牌并将其在启动相关任务的时候丢过去,然针对这个令牌执行取消【请求】,然后等那个Task的函数正常走完相关流程。协程那边本质上还是unity自己调度的一个周期性循环调用而且还是单线程,自然可以终止一个协程[放弃之后循环中执行]
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-15 19:42 , Processed in 0.098274 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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