yield return的作用
测试1:
using UnityEngine;
using System.Collections; public class test1 : MonoBehaviour { // Use this for initialization
void Start ()
{
Debug.Log("in start " + Time.time.ToString());
StartCoroutine(callYieldFunction()); //必须要用StartCoroutine
Debug.Log("in start 2 " + Time.time.ToString());
} // Update is called once per frame
void Update () { } IEnumerator callYieldFunction()
{
Debug.Log("callYieldFunction " + Time.time.ToString());
//yield return StartCoroutine(callYieldFunction1());
StartCoroutine(callYieldFunction1());
yield return new WaitForSeconds();
Debug.Log("callYieldFunction print after 2 seconds " + Time.time.ToString());
} IEnumerator callYieldFunction1()
{
Debug.Log("callYieldFunction1 " + Time.time.ToString());
yield return new WaitForSeconds();
Debug.Log("callYieldFunction print after 4 seconds " + Time.time.ToString());
}
}
运行结果为
in start 0
callYieldFunction 0
callYieldFunction1 0
in start 2 0
callYieldFunction print after 4 seconds 2.004971
callYieldFunction print after 2 seconds 2.004971
测试2:
using UnityEngine;
using System.Collections; public class test1 : MonoBehaviour { // Use this for initialization
void Start ()
{
Debug.Log("in start " + Time.time.ToString());
StartCoroutine(callYieldFunction()); //必须要用StartCoroutine
Debug.Log("in start 2 " + Time.time.ToString());
} // Update is called once per frame
void Update () { } IEnumerator callYieldFunction()
{
Debug.Log("callYieldFunction " + Time.time.ToString());
yield return StartCoroutine(callYieldFunction1());
//StartCoroutine(callYieldFunction1());
yield return new WaitForSeconds();
Debug.Log("callYieldFunction print after 2 seconds " + Time.time.ToString());
} IEnumerator callYieldFunction1()
{
Debug.Log("callYieldFunction1 " + Time.time.ToString());
yield return new WaitForSeconds();
Debug.Log("callYieldFunction print after 4 seconds " + Time.time.ToString());
}
}
运行结果为:
in start 0
callYieldFunction 0
callYieldFunction1 0
in start 2 0
callYieldFunction print after 4 seconds 2.002947
callYieldFunction print after 2 seconds 4.007511
结果:
需要注意的是StartCoroutine(callYieldFunction());这句必须要加StartCoroutine,不然callYieldFunction()里面根本不会运行。
1:StartCoroutine里面的函数是个闭包,主线程运行这个闭包,直到yield return,闭包中剩下的代码不运行,跳出闭包,运行主线程别的代码;
2:主线程在下一帧运行yield return后面的函数(估计是把所有闭包放在一个list里面,每帧的一个特点时间执行list里面的闭包)。
3:整个闭包应该保存了堆栈信息
yield return的作用的更多相关文章
- 可惜Java中没有yield return
项目中一个消息推送需求,推送的用户数几百万,用户清单很简单就是一个txt文件,是由hadoop计算出来的.格式大概如下: uid caller 123456 12345678901 789101 12 ...
- C#中的using和yield return混合使用
最近写代码为了为了省事儿用了几个yield return,因为我不想New一个List<T>或者T[]对象再往里放元素,就直接返回IEnumerable<T>了.我的代码里还有 ...
- C#中的yield return与Unity中的Coroutine(协程)(上)
C#中的yield return C#语法中有个特别的关键字yield, 它是干什么用的呢? 来看看专业的解释: yield 是在迭代器块中用于向枚举数对象提供值或发出迭代结束信号.它的形式为下列之一 ...
- using和yield return
C#中的using和yield return混合使用 最近写代码为了为了省事儿用了几个yield return,因为我不想New一个List<T>或者T[]对象再往里放元素,就直接返回IE ...
- yield return的用法简介
使用yield return 语句可一次返回一个元素. 迭代器的声明必须满足以下要求: 返回类型必须为 IEnumerable.IEnumerable<T>.IEnumerator 或 I ...
- yield学习续:yield return迭代块在Unity3D中的应用——协程
必读好文推荐: Unity协程(Coroutine)原理深入剖析 Unity协程(Coroutine)原理深入剖析再续 上面的文章说得太透彻,所以这里就记一下自己的学习笔记了. 首先要说明的是,协程并 ...
- C#中yield return用法分析
这篇文章主要介绍了C#中yield return用法,对比使用yield return与不使用yield return的流程,更直观的分析了yield return的用法,需要的朋友可以参考下. 本文 ...
- C#中的yield return与Unity中的Coroutine(协程)(下)
Unity中的Coroutine(协程) 估计熟悉Unity的人看过或者用过StartCoroutine() 假设我们在场景中有一个UGUI组件, Image: 将以下代码绑定到Image using ...
- 12.C#yield return和yield break及实际应用小例(六章6.2-6.4)
晚上好,各位.今天结合书中所讲和MSDN所查,聊下yield关键字,它是我们简化迭代器的关键. 如果你在语句中使用了yield关键字,则意味着它在其中出现的方法.运算符或get访问器是迭代器,通过使用 ...
随机推荐
- Big Chocolate
Big Chocolate 题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=19127 Big Chocolat ...
- power 做表
drop table "USER" cascade constraints; /*================================================= ...
- Centos Odoo Service Config
#!/bin/sh ### BEGIN INIT INFO # Provides: openerp-server # Required-Start: $remote_fs $syslog # Requ ...
- 状态压缩DP
K - Necklace Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:327680KB ...
- ASM文件系统
1.确认数据库版本 2.个人理解的存储解决方案的发展趋势 2.1图示说明 2.2图示描述 如上图我们描述了在不同时期的IT行业(数据库)出现的存储文件系统,下面我们将分别说明: ü 裸设备:所谓裸设 ...
- 三层架构dal 层基本代码 非查询/查询
DAL 数据链路层 非查询/查询 using System;using System.Collections.Generic;using System.Linq;using System.Text;u ...
- php发送邮件处理功能页面去除重复的邮箱地址
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- ASP.NET中如何读取和写入注册表
直接给源码: 读取注册表内容: RegistryKey regkey=Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Window ...
- 【iCore3 双核心板_ uC/OS-III】例程四:时间管理
实验指导书及代码包下载: http://pan.baidu.com/s/1pKWKuBT iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- HDU 1264 Counting Squares(线段树求面积的并)
Counting Squares Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...