1、一个应用程序一般对应一个进程,一个进程一般有一个主线程,还有若干个辅助线程,线程之间是平行运行的,在线程里面可以开启协程,让程序在特定的时间内运行。
2协程和线程的区别是:协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力。
什么是协程
答:协程是一段在主线程中执行的代码逻辑(代码块)协程不是多线程,本质依然是从上到下依次执行。
Unity协程的执行原理(执行过程)是什么?(15分,每条5分)
答:(1)unity中协程执行过程中,通过yield return XXX,将程序挂起,去执行接下来的内容。
(2)注意协程不是线程,在为遇到yield return XXX语句之前,协程的方法和一般的方法是相同的,也就是程序在执行到yield return XXX语句之后,接着才会执行的是 StartCoroutine()方法之后的程序。
(3)协程走的还是单线程模式,仅仅是将yield return XXX语句之后的内容暂时挂起,等到特定的时间才执行。
unity中协程执行过程中,通过yield return XXX,将程序挂起,去执行接下来的内容,注意协程不是线程,在为遇到yield return XXX语句之前,协程的方法和一般的方法是相同的,也就是程序在执行到yield return XXX语句之后,接着才会执行的是 StartCoroutine()方法之后的程序,走的还是单线程模式,仅仅是将yield return XXX语句之后的内容暂时挂起,等到特定的时间才执行。

//协程的返回值
/*
* 1.协程和普通方法一样,可以被多次调用
* 2.协程一旦被开启后,总是试图将方法内所有的代码执行完毕,之后停止
* 3.在协程内如果遇到yield return null,0,1,2... 表示将之后的代码放到"下一帧"继续执行
* 4.在协程内,遇到yield return new WaitForSeconds (n) 表示将剩余代码放到n秒后执行
* 5.在协程内,遇到yield return StartCoroutine(),表示剩余代将在子协程执行完毕后执行
* 6.在协程内,遇到yield return WaitForEndOfFrame(),表示剩余代码将在OnGUI()执行完成后继续执行
* 7.在协程内,遇到yield return WaitForEndOfUpdate(),表示剩余代码将在FixedUpdate执行后继续执行
* 8.在协程内,遇到yield return www,表示剩余代码将在www下载文件结束后继续执行
* 9.在协程内,遇到yield return obj,表示剩余代码将在obj不为空时,继续执行(一般用于创建一个比较大的预设体时使用)
* 10.想方法可以当做普通方法在两个脚本之间自由调用
* 11.生命周期的回调方法,也可以改成协程方法(将void改为IEnumerator)
*/

协程使用时的注意事项:
在使用协程的时候,一个协程内必须要有返回值
在开启协程的时候使用StartCoroutine()方法开启,里面开启的协程,可以洗洗车方法,也可以写与协程名字相同的字符串.
如果要使用StopCoroutine(),停止协程,则该协程的开启和停止都要使用字符串

使用www类下载图片,并赋值给RawImage
IEnumerator LoadImg()
{
创建www对象 传入图片链接
WWW www = new WWW ("图片链接");
判断是否下载图片完成
yield return www;
将下载的图片的Texture赋值给RawImg的Texture
RawImg.texture=www.texture;
}

使用www类下载视频,并播放视频(在此过程中,显现出加载进度条)
创建www对象,传入视频链接
WWW www = new WWW ("视频链接");
在加载过程中,将加载的进度赋值给UI控件Scrollbar的size或者slider的Value
while (www.isDone == false) {
//将进度条设置为一直显示在所有的UI控件的最前面
m_loadLine.transform.SetAsLastSibling ();
m_loadLine.size = www.progress;
yield return null;
}
将下载下来的视频材质赋值给创建的MovieTexture对象
movieTexture = www.GetMovieTexture ();
将创建的MovieTexture对象赋值给RawImg的Texture
m_rawImg.texture = movieTexture;
设置视频的循环播放
movieTexture.loop = true;
得到视频的声音
m_aud.clip = movieTexture.audioClip;
设置声音循环
m_aud.loop = true;
播放视频,音频
movieTexture.Play ();
m_aud.Play ();
在视频下载完成后,movieTexture的duration属性可以得到视频的总时长,可用于制作播放进度条.//判断是否开始播放,在视频开始播放时赋值为true
bool isPlay = false;
//计时器
float timer = 0;
void Update ()
{
if (isPlay) {
timer += Time.deltaTime;
m_loadLine.size = timer / movieTexture.duration;
if (timer >= movieTexture.duration) {
timer = 0;
}
}
}

  1. 下载视频到存储到本地,下一次播放时,可以不用下载
  2. IEnumerator DownloadVideo ()
  3. {
  4. WWW downloadwww = new WWW (m_url);
  5. while (downloadwww.isDone == false) {
  6. //进度条展示
  7. m_downloadProgress.size = downloadwww.progress;
  8. //禁用掉播放按钮
  9. m_playBtn.interactable = false;
  10. yield return null;
  11. }
  12. //已经下载完成
  13. m_downloadProgress.size = 1.0f;
  14. try {
  15. //将内存中下载的视频资源写在文件中,存在本地
  16. File.WriteAllBytes (m_filePath, downloadwww.bytes);
  17. } catch (System.Exception ex) {
  18. Debug.Log (ex.Message);
  19. }
  20. //如果文件存在
  21. while (!IsExitsFilePath (m_filePath)) {
  22. yield return null;
  23. }
  24. m_playBtn.interactable = true;
  25. //调用播放视频的协程方法
  26. StartCoroutine ("PlayingMovie");
  27. }
  28.  
  29. //播放本地视频
  30. IEnumerator PlayingMovie ()
  31. {
  32. //从本地路径中加载视频文件
  33. WWW www = new WWW ("file:///" + m_filePath);
  34. yield return www;
  35. m_movieTexture = www.GetMovieTexture ();
  36. m_rawImg.texture = m_movieTexture;
  37. m_aud.clip = m_movieTexture.audioClip;
  38. m_movieTexture.loop = true;
  39. m_aud.loop = true;
  40. m_movieTexture.Play ();
  41. m_aud.Play ();
  42. isPlay = true;
  43. }
  44. 判断本地是否存有相对应的视频文件
  45. //给按钮添加事件,播放或下载的事件
  46. m_playBtn.onClick.RemoveAllListeners ();
  47. m_playBtn.onClick.AddListener (OnPlayOrDownloadAction);ss
  48. 可添加到按钮点击响应事件上
  49. void OnPlayOrDownloadAction ()
  50. {
  51. //判断本地是否有要播放的路径
  52. if (IsExitsFilePath (m_filePath)) {
  53. StartCoroutine (PlayingMovie ());
  54. } else {
  55. //通过协程下载
  56. StartCoroutine (DownloadVideo ());
  57. }
  58. }
  59.  
  60. 可更改UI控件的宽和高
  61. rectTransform.sizeDelta = new Vector2( yourWidth, yourHeight);
  62. 在一个圆形范围内随机生成一个Vector2类型的点
  63. Vector2 Pos = Random.insideUnitCircle * radius;
  64. radius为生成随机点的圆形范围的半径

16 协程和www的更多相关文章

  1. 【流畅的python】16 - 协程

    yield 产生是产生值给调用方 让步是暂停生成器,同时让步也可以作为流程控制手段 yield item 上面这行代码会产出一个值.提供给next(...)的调用方.此外还会做出让步,暂停执行生成器, ...

  2. vs2019 16.8更新之后的 C++20 协程co_yield用法

    由于搜索出来的帖子,都是老版本的实验协程,很多老的代码已经失去参考性,并且很复杂,所以就自己研究了一下. 1 #include <iostream> 2 #include <coro ...

  3. python基础(16)-进程&线程&协程

    进程之multiprocessing模块 Process(进程) Process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建. 介绍 初始化参数 Process([group [, t ...

  4. Python自动化运维之16、线程、进程、协程、queue队列

    一.线程 1.什么是线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位. 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行 ...

  5. 【流畅的python】16.1 - 生成器如何进化成协程

    在生成器中加入yield关键字后,生成器调用方可以向生成器传入值,只需要使用.send(...)方法就可以传送数据.发送的数据会成为生成器函数中yield表达式的值.所以生成器可以作为协程使用. 协程 ...

  6. 多任务-python实现-进程,协程,线程总结(2.1.16)

    @ 目录 1.类比 2.总结 关于作者 1.类比 一个生产玩具的工厂: 一个生产线成为一个进程,一个生产线有多个工人,所以工人为线程 单进程-多线程:一条生产线,多个工人 多进程-多线程:多条生产线, ...

  7. Python 【第五章】:线程、进程和协程

    Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import t ...

  8. 【Unity3D基础教程】给初学者看的Unity教程(五):详解Unity3D中的协程(Coroutine)

    作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 为什么需要协程 在游戏中有许多过程(Proc ...

  9. [转载]协程-cooperative multitasking

    [转载]协程三讲 http://ravenw.com/blog/2011/08/24/coroutine-part-1-defination-and-classification-of-corouti ...

随机推荐

  1. CXL联盟正式成立:成员均是行业巨头

    导读 今天,阿里巴巴.思科.戴尔EMC.Facebook.Google.HPE.华为.Intel.微软(按英文首字母排序)联合宣布,CXL联盟(Compute Express Link Consort ...

  2. 可以看一下我学习linux的过程

    学习Linux的最佳方法是将它用于日常工作. 阅读Linux书籍,观看Linux视频不仅仅是足够的. 学习Linux没有捷径可走. 你不可能在一夜之间在Linux中掌握. 这需要时间和持久性. 刚刚潜 ...

  3. 「CF1C Ancient Berland Circus」

    CF第一场比赛的最后一题居然是计算几何. 这道题的考点也是比较多,所以来写一篇题解. 前置芝士 平面直角坐标系中两点距离公式:\(l=\sqrt{(X_1-X_2)^2+(Y_1-Y_2)^2}\) ...

  4. GSON使用笔记(3) -- 如何反序列化出List

    GSON使用笔记(3) -- 如何反序列化出List 时间 2014-06-26 17:57:06  CSDN博客原文  http://blog.csdn.net/zxhoo/article/deta ...

  5. Lesson 6 The sporting spirit

    How does the writer describe sport at the international level? I am always amazed when I hear people ...

  6. 了解AOP以及实现方式

    AOP是什么? 面向切面编程,把那些与业务无关,却为业务模块所共同调用的逻辑封装成一个可重的模块,即切面 使用"横切"技术,AOP把软件系统分为两个部分:核心关注点和横切关注点.业 ...

  7. mysql 单表索引优化

    建表语句 CREATE TABLE IF NOT EXISTS `article` ( `id` INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMEN ...

  8. Hive的原生部署方式

    一.Hive的部署 1.官方文档 https://cwiki.apache.org/confluence/display/Hive/GettingStarted 2.前提条件 需要安装JDK1.7之上 ...

  9. 吴裕雄--天生自然JAVAIO操作学习笔记:System类对IO的支持和BuffereRead

    import java.io.OutputStream ; import java.io.IOException ; public class SystemDemo01{ public static ...

  10. Tomcat源码导入celipse

    1.eclipse 源码下载地址 http://svn.apache.org/repos/asf/tomcat/tc7.0.x/tags/ 2.由于tomcat是ant管理构建的,故要先安装ant 构 ...