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

Unity协程那些事(五)

[复制链接]
发表于 2021-3-8 18:10 | 显示全部楼层 |阅读模式
版权申明:

    本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明更多学习资源请加QQ:1517069595获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)
协程的缺点



这里我们列出了常见的三个缺点。我们知道Unity给我们提供的MonoBehavior这样一个脚本的基类,而在实际的商业项目开发中,我们很有可能不从MonoBehavior继承。而从Unity的帮助文档中可以看出


所有从MonoBehavior继承的类才可以使用StartCoroutine。而实际开发中,举例我们使用MVC框架,只有V是跟MonoBehavior打交道的,剩下的M/C都跟它没有关系。当我们想在M/C这两种类使用协程的时候,由于并不是由MonoBehavior继承的,所以无法使用,这就是一个非常大的缺陷。
   协程的第二个缺点是不能有返回值。我们知道协程的返回值统一都是IEnumerator。
   当我们的程序规模越来越大的时候,回调地狱的问题会越来越明显。回调地狱是由于我们的代码层数多了以后,造成的一个代码维护上的问题。
   设想一个情况,当我们要下载X,Y,Z三张图片,假设每张图片下载需要1s,我们需要按顺序下载。此时为了避免程序空转,我们就需要开一个协程来去进行程序的图片下载,而在协程启动的时候,我们的主协程也在运转,来做一些其他的事情。
   右边的图片下载组件代码中,通过GET方法指定传入一个图片下载网址,以及下载成功以后的回调函数。首先构造一个WWW对象,启动一个下载的协程,在这协程里我们通过yield去等待我们第一个传入的参数,当下载完毕后,会接着执行下面onFinish函数。
   左边的表达式中可以看出,当我们通过网址构造WWW对象,启动协程,然后等待下载完毕,执行我们传入的onFinish函数。当我们下载完第一张X后,会在回调函数里接着执行下载Y,然后执行下载Z,一层一层下来。
这样的代码风格非常糟糕,会让程序非常难以维护。
那么接下来就来说下怎么解决这几个问题。
商业项目的解决方案

避免依赖:自定义调度器

首先是如何避免对MonoBehavior的依赖。我们可以自定义一个叫调度器或者是叫定时器的东西。通过定时器的对象,我们可以实现延时规划一些工作。这样可以完全避开对MonoBehavior的依赖。
避免回调地狱

左边是我们有回调地狱的代码。在我们的皇室战争的项目里,我们就会使用右边这种异步调用的语法,左边一层套一层的代码就变成了三句话。底层原理的分析后面会单独开课详细分析。
点赞、分享加关注可获得教程配套视频 更多学习资源请加QQ:1517069595获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-15 17:59 , Processed in 0.090800 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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