博客
关于我
神马都是浮云,unity中自己写Coroutine协程源码
阅读量:264 次
发布时间:2019-03-01

本文共 2215 字,大约阅读时间需要 7 分钟。

最近在学习Unity协程调度器

最近在学习Unity协程调度器,发现了一篇非常有趣的文章。通过阅读相关资料,我对协程的运行机制有了更深入的理解。协程调度器是一个非常强大的工具,能够帮助开发者更好地管理和协调多个协程的执行。

协程调度器的基本功能

协程调度器允许开发者完全控制一套协同程序的执行机制。通过阅读代码,我了解到协程调度器如何在幕后工作。例如,协程可以通过yield;等待下一次更新,或者通过yield anInt;等待指定数量的更新。还可以通过yield aFloat;等待给定的秒数,或者通过yield scheduler.StartCoroutine(Coroutine());等待另一个协程完成。

一个简单的协同调度程序

我找到了一个简单的协同调度程序代码。这个代码允许开发者完全控制协同程序的执行机制。通过阅读代码,我了解到协同程序如何构建.Net发电机的基础上构建,并将协同支持添加到非Unity的项目中。

代码示例

using UnityEngine;using System.Collections;public class testAPI : MonoBehaviour{    CoroutineScheduler scheduler;    CoroutineScheduler m_scheduler2;    string requestURL = "http://www.my-server.com/cgi-bin/screenshot.pl";    void Start()    {        scheduler = new CoroutineScheduler();        scheduler.StartCoroutine(MyCoroutine());        m_scheduler2 = new CoroutineScheduler();        m_scheduler2.StartCoroutine(test());    }    IEnumerator MyCoroutine()    {        Debug.Log("MyCoroutine: Begin");        yield return 0;        Debug.Log("MyCoroutine: next update;" + Time.time);        yield return 2;        Debug.Log("MyCoroutine: After yield 2;" + Time.time);        yield return 3.5f;        Debug.Log("MyCoroutine: After 3.5 seconds;" + Time.time);        yield return scheduler.StartCoroutine(WaitForMe());        Debug.Log("MyCoroutine: After WaitForMe() finished;" + Time.time);    }    IEnumerator WaitForMe()    {        yield return 7.8f;    }    void Update()    {        scheduler.UpdateAllCoroutines(Time.frameCount, Time.time);    }    IEnumerator test()    {        // ...设置请求        var www = new UnityEngine.WWW(requestURL);        yield return new UnityWWWYieldWrapper(www);        // ...加载完成后执行操作    }}

项目地址

通过阅读代码,我了解到协同程序如何在不同的调度程序实例下运行。这个调度程序支持多个实例,并且可以在不同的时间点启动协程。这种设计使得协程能够在不同的调度程序实例下运行,非常有用。

协同程序的运行机制

在Unity中,协同程序的运行机制与自定义调度程序略有不同。例如,Unity会在协同程序的第一次yield时立即运行,而自定义调度程序会在下一次UpdateAllCoroutines调用时才运行。这种设计允许开发者在任何时候启动协程,并确保协程只能在特定的时间运行。

注意事项

在使用同一个更新调度程序运行多个协程时,不能依赖更新的顺序。例如,StartCoroutine(A)、StartCoroutine(B)、StartCoroutine(C),其中A、B、C都在循环中不断调用print(A|B|C); yield;,不要假设输出顺序会是ABC或CBA等。

总结

通过学习和实践,我对Unity协程调度器有了更深入的理解。协程调度器是一个非常强大的工具,能够帮助开发者更好地管理和协调多个协程的执行。通过阅读代码和实际使用,我学会了如何在非Unity项目中集成协同支持。

通过这次学习,我对协程调度器的实现和使用有了更全面的认识。未来,我希望能够进一步探索协程调度器的更多功能,并在实际项目中应用这些知识。

转载地址:http://reoa.baihongyu.com/

你可能感兴趣的文章
Python 并发编程
查看>>
python 序列化操作
查看>>
Python 开发者,这 7 个 VS Code 插件极力推荐
查看>>
python手把手视频_硬货 | 手把手带你构建视频分类模型(附Python演练))
查看>>
python 录音左右声道_Python分离立体声wav压缩文件的左右声道
查看>>
Python 循环异或对文件进行加解密
查看>>
Python开发环境搭建(附VMware安装包及虚拟机环境)
查看>>
python 微信扫码登录_python实现微信第三方网站扫码登录(Django)
查看>>
Python 快速下载依赖
查看>>
python实现非参数统计的Cochran检验 (附完整源码)
查看>>
Python 手写数字识别-3-sklearn中的几种算法
查看>>
Python 打开文件注意事项
查看>>
python 批量修改文件名_python windows下批量修改文件名
查看>>
Python 抓取网页乱码问题 以及EXCEL乱码
查看>>
python 抓取网页内容
查看>>
python 按照当前日期创建文件
查看>>
Python 接口并发测试详解
查看>>
Python 接口自动化 —— requests框架
查看>>
python 接口自动化数据结构(如列表、字典、元组)
查看>>
Python 接口自动化测试中的深拷贝与浅拷贝~
查看>>