Unity协同详解以及与多线程的区别使用

2023-10-31

转载自:http://blog.csdn.net/linuxheik/article/details/45392945

1.什么是协调程序

        unity协程是一个能暂停执行,暂停后立即返回,直到中断指令完成后继续执行的函数。
        它类似一个子线程单独出来处理一些问题,性能开销较小,但是他在一个MonoBehaviour提供的主线程里只能有一个处于运行状态的协程。
2.协同程序的特点
1、协程在中断指令(YieldInstruction)产生时暂停执行
2、协程一暂停执行便立即返回 //中断协程后返回主函数,暂停结束后继续执行协程剩余的函数。
3、中断指令完成后从中断指令的下一行继续执行
        4、同一时刻、一个脚本实例中可以有多个暂停的协程,但只有一个运行着的协程
        5、函数体全部执行完后,协程结束
        6、协程可以很好的控制跨越一定帧数后执行的行为
        7、协程在性能上、相比于一般函数几乎没有更多的开销


3.创建一个协程函数
   IEnumerator methodName(Object parameter1,Object parameter2,...){
// to do something
yield return YieldInstruction/other/null;
// to do something else
}
    注意:
    协同函数的返回值的类型必须是Coroutine,Coroutine继承与Yieldinstruction。
    所以协同程序的返回类型就只能是null,等待的时间,等待的帧数。。由此可见WWW 也是实现了Coroutine的~
4.开始一个协同程序
通过MonoBehaviour提供的StartCoroutine方法来实现启动协同程序。
1、StartCoroutine(IEnumerator routine);
优点:灵活,性能开销小。
缺点:无法单独的停止这个协程,如果需要停止这个协程只能等待协同程序运行完毕或则使用StopAllCoroutine();方法。
2、StartCoroutine (methodName:string, value : object = null);
优点:可以直接通过传入协同程序的方法名来停止这个协程:StopCoroutine(string methodName);
缺点:性能的开销较大,只能传递一个参数。

5.停止协同程序
1、StopCoroutine(string methodName);
2、StopAllCoroutine();
3、设置gameobject的active为false时可以终止协同程序,但是再次设置为true后协程不会再启动。


6.协同程序的执行顺序
开始协同程序 -> 执行协同程序 -> 中断协同程序(中断指令)-> 返回上层继续执行
->中断指令结束后继续执行协同程序剩下的内容
7.协同程序的注意事项
 1、不能再Update或者FixUpdate方法中使用协同程序,否则会报错。
 2、关于中断指令:
中断指令/YieldInstruction,一个协程收到中断指令后暂停执行,返回上层执行同时等待这个指令达成后继续执行。
        
 指令                      描述                          实现


WaitForSeconds          等待指定秒数            yield return new WaitForSeconds(2);          
WaitForFixedUpdate      等待一个固定帧          yield return new WaitForFixedUpdate();   
WaitForEndOfFrame       等待帧结束              yield return new WaitForEndOfFrame();                         
StartCoroutine          等待一个新协程暂停      yield return StartCoroutine(other coroutine);   
WWW                     等待一个加载完成        yield return www;
注意:
1、一个协程A里在中断指令里再启动一个协程B,在yield return StartCoroutine时执行的顺序是:
①:先执行新协程B;
②:新协程B暂停后向上返回协程A,A协程暂停,返回协程A的上层函数;
③:因为决定协程A是否结束的标志是新协程B是否结束,所以当新协程B结束后返回协程A继续执行余下的内容;
④:协程A执行结束。
        2、关于WWW的中断指令可参考API:
You can inspect the isDone property to see if the download has completed or yield the download object to automatically wait until it is (without blocking the rest of the game). 
你可以检查isDone属性来查看是否已经下载完成,或者yield自动等待下载物体,
直到它被下载完成(不会影响游戏的其余部分)。


 3、协同程序的中断返回机制也可用于指定时间间隔执行一个程序:
//每3秒执行一次
while(true){
//to do something
yield return new WaitForSeconds(3);
}
             
8.例子
lg1、举例说明协同程序的执行流程
using UnityEngine;
using System.Collections;


public class SimpleCoroutine : MonoBehaviour {
/// <summary>
/// Start, 协程的执行流程
/// Start函数运行,输出“1”,然后开始协程Do;
/// Do输出“2”,然后开始协程newDo;
/// newDo输出“3”,产生中断指令后暂停,立即返回Do;
/// Do产生中断指令后暂停,Do暂停并立即返回Start函数;
/// Start执行StartCoroutine的下一条语句:输出“4”;
/// 2秒后,newDo的中断指令完成并继续执行,输出“5”,协程newDo结束;
/// Do的中断指令因为协程newDo的结束而完成并继续执行,输出“6”,协程Do结束。
/// </summary>
void Start () {
Debug.Log("1");
StartCoroutine(Do());
Debug.Log("4");
}
IEnumerator Do() {
Debug.Log("2");
yield return StartCoroutine(newDo());//WaitForSeconds(5);
Debug.Log("6");
}
IEnumerator newDo() {
Debug.Log("3");
yield return new WaitForSeconds(2);
Debug.Log("5");
}
}
//输出结果顺序是,1,2,3,4,5,6


lg2、加载指令(通过WWW加载本地文件)
private string path = "file://F:/Resource/Dragon.unity3d";
void OnGUI(){
if(GUI.Button(new Rect(200,200,150,30),"点击进入协同程序")){
Debug.Log("1");
StartCoroutine(loadLocalBundle(path));
Debug.Log("3");
}
}
private IEnumerator loadLocalBundle(string url){
Debug.Log("2");
using(WWW www = new WWW(url)){
yield return www;
Debug.Log("4");
if(www.error != null){
var bytes = www.bytes;
}
AssetBundle ab = www.assetBundle;
GameObject gameObject = ab.mainAsset as GameObject;
Instantiate(gameObject);
Debug.Log("5");
Debug.Log("load local assetBundle finished..."+gameObject);
}
}
注意:
//大概执行流程,点击按钮后开始执行协同程序,WWW按照提供的url进行加载,完毕后 yield return www;中断指令跳转到主线程。
//主线程继续执行其他内容,www在加载完成后跳出中断继续执行余下内容。

//加载完毕,实例化加载内容。




1、 协程 不是 线程, 协同程序是 不同步 的 一个线程在程序中和其他线程是异步运行的,在多处理器机器中一个线程可以同时与所有其他线程的实时运行其代码,这使得线程编程能够解

1.协程 不是 线程,协同程序是 不同步 

      一个线程在程序中和其他线程是异步运行的,在多处理器机器中一个线程可以同时与所有其他线程的实时运行其代码,这使得线程编程能够解决很复杂的事情,因为可能在相同的时间里一个线程在改变它而另一个线程正在读取它,这意味着另一个线程实际上可以改变的东西在游戏中处理的中间似乎是你的源代码一行。这是因为你写的代码是由机器变成汇编语言,更是更复杂。正因为如此,你必须通过锁,以确保这种情况不会由任何确保没有共享内存发生。或者通过锁定其他线程使用同一块内存,当他们在读取或更改时。

2、什么是协程?

      协同程序绝对不是一个线程。这意味着在同一时间只有一个协同程序在执行,它会被执行在游戏的主线程上,所以实际上在同一时间游戏的核心只有一个协同程序在运行[这段翻译的不太好]

     你永远不需要担心同步或锁定一个值当你正在编写一个协同程序。你有完全的控制权,直到你的代码执行到 yiedld

  因此总结一下协程的定义

    协程只是部分执行,并假定在适当的条件得到满足,在未来的某一时刻将被恢复,直到它的工作完成

Unity processes coroutines every frame of the game for every object that has one or more running.  The processing occurs after Update and before LateUpdate for most yield statements, but there are special cases:

Unity的流程协同程序在游戏的每一帧每个对象为具有一个或多个正在运行的。Update() 之后,LateUpdate()之前 ,发生的 yield 语句的处理



Unity,WWW加载,本地储存,协同程序,Coroutine2014-02-28

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity协同详解以及与多线程的区别使用 的相关文章

  • jquery 购物车飞入特效--全网最简单

    有个插件 jquery fly js 可以搞定 好象特点之一是有抛物线效果 如果要求不高 可以看看我这个 其实也是在网上看到的 作了些改进 三个元素 被点击的div 飞翔的小红点 装小红点的div 购物车 div 被点击的 div div
  • (一)@Input属性讨论

    Input Declares a data bound input property Angular automatically updates data bound properties during change detection 大
  • PAT C入门题目-7-111 输出学生成绩 (20 分)(动态内存分配)

    7 111 输出学生成绩 20 分 本题要求编写程序 根据输入学生的成绩 统计并输出学生的平均成绩 最高成绩和最低成绩 建议使用动态内存分配来实现 输入格式 输入第一行首先给出一个正整数N 表示学生的个数 接下来一行给出N个学生的成绩 数字
  • vue3+uniapp+TS+Vite+uView-plus(uniapp-nutui)微信小程序模板搭建

    官网下载目录结构 DCloud uni preset vue 码云 开源中国 gitee com 下载zip压缩包即可 目录 一 依赖下载 二 运行 三 vite config json文件修改 四 uView plus组件库加载 1 安装
  • Android Studio之BuildConfig类

    转自 http blog csdn net lvxiangan article details 71601451 Android Studio开发中 把一个module输出打包为jar文件 我们会发现里面多了一个BuildConfig类 但
  • vue中慎用style的scoped属性

    在vue组件中 在style标签上添加scoped属性 以表示它的样式作用于当下的模块 很好的实现了样式私有化的目的 这是一个非常好的机制 但是为什么要慎用呢 在实际业务中我们往往会对公共组件样式做细微的调整 如果添加了scoped属性 那

随机推荐

  • 前后端通过局域网对接

    因为前后端分离写项目 后端同学在隔壁宿舍 我们通过连他的热点来进行前后端的对接 第一步 关闭防火墙 第二部 找到自己ip地址 无线局域网Ipv4地址 然后前后端在 cmd中 通过 ping 加上地址可以连接成功 然后就可以访问后端的接口了
  • Linux与Windows:操作系统之争及个人体验比较

    在当今数码化的世界中 操作系统扮演着关键的角色 Linux和Windows作为最受欢迎和广泛使用的操作系统之一 具有不同的特点和优势 作为一个AI模型 我虽然没有真正的使用经验 但我可以就这两个操作系统进行比较 并提供一些观点供您参考 Li
  • 利用注册表修改3389端口

    步骤 打开 开始 运行 输入 regedit 打开注册表 进入以下路径 HKEY LOCAL MACHINE SYSTEM CurrentControlSet Control Terminal Server Wds rdpwd Tds tc
  • 1060- 礼物的最大价值

    题目如下 在一个 m n 的棋盘的每一格都放有一个礼物 每个礼物都有一定的价值 价值大于 0 你可以从棋盘的左上角开始拿格子里的礼物 并每次向右或者向下移动一格 直到到达棋盘的右下角 给定一个棋盘及其上面的礼物的价值 请计算你最多能拿到多少
  • VMware 搭建私有云

    我们的目的是在VMware workstation 上安装Centos 7系统 并配置用远程桌面访问虚拟机 在虚拟机上安装Centos 7 首先按照老师给出的博客 VirtualBox 安装 Centos 7 笔记 进行安装 博主使用的是v
  • MPU6050 加速度计和陀螺仪传感器与 Arduino 连接

    MPU6050 加速度计和陀螺仪传感器与 Arduino 连接 前言 MPU6050 模块引脚 MPU6050 模块组成 MPU6050陀螺仪传感器模块电路图 MPU6050模块如何工作 MEMS加速度计如何工作 MEMS陀螺仪如何工作 常
  • 刷题day67:零钱兑换II(完全背包开始)

    题意描述 给你一个整数数组 coins 表示不同面额的硬币 另给一个整数 amount 表示总金额 请你计算并返回可以凑成总金额的硬币组合数 如果任何硬币组合都无法凑出总金额 返回 0 假设每一种面额的硬币有无限个 题目数据保证结果符合 3
  • 杭电OJ——1007 Quoit Design(最近点对问题)

    Quoit Design Problem Description Have you ever played quoit in a playground Quoit is a game in which flat rings are pitc
  • DOT:视觉SLAM的动态目标物跟踪

    点云PCL免费知识星球 点云论文速读 文章 DOT Dynamic Object Tracking for Visual SLAM 作者 Irene Ballester Alejandro Fontan Javier Civera 翻译 分
  • winServer服务器搭建nginx配置https问题及流程:

    问题 1 配置切记要仔细 每个配置项最后都应以 结尾 报错如下 2022 07 11 12 51 29 emerg 3284 4856 worker processes directive is not allowed here in F
  • PML之平均 、中值 、众数、标准偏差、方差

    NumPy模块为此提供了一种方法 可以计算平均 中值和众数 1 平均值 import numpy as np value 2 4 6 14 34 88 98 17 47 计算平均值 mean np mean value print mean
  • 深度学习模型系列一——多分类模型——Softmax 回归

    Softmax 回归 1 概述 2 Softmax回归模型 3 Softmax函数 4 Softmax回归的决策函数 5 参数估计 5 1 损失函数 5 2 梯度估计 5 2 1 Softmax函数的导数 5 2 2 梯度 6 模型预测与评
  • JavaWeb——动态 web 资源开发

    目录 Servlet 01 系统架构 1 1 系统架构包括什么形式 1 2 C S架构 1 3 B S架构 1 4 C S和B S结构的系统如何选择 1 5 开发一个WEB系统需要哪些技术 1 6 Java EE是什么 02 B S结构的系
  • VScode在开发vue时常用的插件,干就完了

    Auto Rename Tag 自动成对修改标签名 ESLint HTML Snippets Chinese Simplified Language Pack for Visual Studio Code 汉化vscode Live Ser
  • 安装nrm包时控制台报错

    安装nrm包时控制台报错 C Users 11359 AppData Roaming npm node modules nrm cli js 9 const open require open Error ERR REQUIRE ESM r
  • Floating UI 使用经验分享 - Dialog

    上文 Floating UI 使用经验分享 Popover 在本文中 我将分享如何使用 Floating UI 来创建另一种常见的浮动 UI 组件 Dialog 对话框 Dialog 是一个浮动元素 显示需要立即关注的信息 他会出现在页面内
  • 宝塔7.9最新企业版免授权无后门

    宝塔面板大家应该都知道吧 今天带来的是宝塔面板企业版免授权 无需绑定账号版本 用ssh链接上我们的服务器输入下列命令回车 然后过一会会让输入一个东西 输y即可 与正版宝塔安装步骤一致 yum install y wget wget O in
  • mysql干货——数据库字符集和校对规则详解

    一 什么是字符集 字符是多个文字和符号的总称 包括各个国家的文字 标点符号 图形符号 数字等 字符集多个字符的集合 字符集合种类较多 每个字符集包含的字符的个数不同 对于字符集不支持的字符 则以乱码显示 常见的字符集有ASCII字符集 GB
  • 2、matlab 图像分割(1)

    目的 利用图像的坐标点 判断出想要分割出的部分 利用 matlab 语法实现分割 1 基本语法 1 1 定义矩阵 var 1 2 3 4 5 6 定义一个 2 3 的矩阵 该变量会出现在工作区 可以在命令行用变量输出该矩阵 1 2 find
  • Unity协同详解以及与多线程的区别使用

    转载自 http blog csdn net linuxheik article details 45392945 1 什么是协调程序 unity协程是一个能暂停执行 暂停后立即返回 直到中断指令完成后继续执行的函数 它类似一个子线程单独出