WaitForSeconds 和 WaitForSecondsRealtime 一探究竟

2023-11-01 09:40

本文主要是介绍WaitForSeconds 和 WaitForSecondsRealtime 一探究竟,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

WaitForSeconds 和 WaitForSecondsRealtime 一探究竟

一:相同点

等待xx时间后进行后续操作

二:不同点

  1. 受时间因子影响 WaitForSecondsRealtime 这个不会受到Time.Scale的影响,而WaitForSeconds会受到影响
  2. 记时方式不同
    WaitForSeconds 对于同一个对象而言,无论多少次通过Corotuine调用都会同一时间结束,也就是并行的效果
    WaitForSecondsRealtime 对于同一个对象而言,会以串行的方式结束时间等待。
    举个例子:两个同时等待3s的操作,如果使用WaitForSeconds 那么两个请求都会在3s后结束;如果使用是WaitWaitForSecondsRealtime 那么将会在第6s进行结束
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Test : MonoBehaviour
{void Start(){list1.Add("WaitForSeconds", new WaitForSeconds(3f));list2.Add("WaitForSecondsRealtime", new WaitForSecondsRealtime(3f));StartCoroutine(WaitSeconds("WaitForSeconds1"));StartCoroutine(WaitSeconds("WaitForSeconds2"));StartCoroutine(WaitRealSeconds("WaitRealSeconds1"));StartCoroutine(WaitRealSeconds("WaitRealSeconds2"));}IEnumerator WaitSeconds(string key){WaitForSeconds obj = list1["WaitForSeconds"];Debug.Log(key + ">> begin:" + Time.time);yield return obj;Debug.Log(key + ">> end:" + Time.time);}IEnumerator WaitRealSeconds(string key){WaitForSecondsRealtime obj = list2["WaitForSecondsRealtime"];Debug.Log(key + ">> begin:" + Time.time);yield return obj;Debug.Log(key + ">> end:" + Time.time);}private void Update(){list2["WaitForSecondsRealtime"].Reset();}Dictionary<string, WaitForSeconds> list1 = new Dictionary<string, WaitForSeconds>();Dictionary<string, WaitForSecondsRealtime> list2 = new Dictionary<string, WaitForSecondsRealtime>();
}

打印日志如下,两个红色的使用了WaitForSecondsRealTime会在第6s结束
在这里插入图片描述

三:探秘

WaitForSecondsRealtime 我们通过IL反编译是可以获取到源码的,通过源码我们可以看到每次进行下一次记时操作都是采用了(当前时间)Time.realtimeSinceStartup + (等待时间)waitTime作为延迟时间,所以也就不难理解两次等待的时间最后一次是6s了,内部其实是通过可一个叫KeepWaitting进行控制当有一个在进行等待的时候,第二个记时开始必须等到第一个记时结束。感兴趣的朋友可以去尝试着把这个变量进行修改,看会发生生么现象。
源码如下:

namespace UnityEngine
{/// <summary>///   <para>Suspends the coroutine execution for the given amount of seconds using unscaled time.</para>/// </summary>public class WaitForSecondsRealtime : CustomYieldInstruction{private float m_WaitUntilTime = -1f;/// <summary>///   <para>The given amount of seconds that the yield instruction will wait for.</para>/// </summary>public float waitTime{get;set;}public override bool keepWaiting{get{bool flag = this.m_WaitUntilTime < 0f;if (flag){this.m_WaitUntilTime = Time.realtimeSinceStartup + this.waitTime;}bool flag2 = Time.realtimeSinceStartup < this.m_WaitUntilTime;bool flag3 = !flag2;if (flag3){this.m_WaitUntilTime = -1f;}return flag2;}}/// <summary>///   <para>Creates a yield instruction to wait for a given number of seconds using unscaled time.</para>/// </summary>/// <param name="time"></param>public WaitForSecondsRealtime(float time){this.waitTime = time;}}
}

WaitForSeconds 的源码我们无从获得,底层通过了C++代码编写,所以只能猜测内部是使用了一个new的操作或者使用了几个类似集合的封装达到了同一个对象时间不受影响的效果,如果有能看到内部原理的朋友可以在这里给我留言。

这篇关于WaitForSeconds 和 WaitForSecondsRealtime 一探究竟的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/322117

相关文章

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

算法备案究竟难在哪里?

算法备案究竟难在哪里? 在当今数字化社会中,算法备案已成为人工智能技术应用中的一个关键环节。然而,对于初学者和企业来说,这一过程充满了挑战和复杂性。本文将深入探讨算法备案的难度和应对策略。 算法备案的挑战 首先,算法备案要求申请者具备深厚的专业知识。要成功通过备案,不仅需要了解AI技术的细节,还必须熟悉相关的法律法规。例如,《互联网信息服务算法推荐管理规定》和《互联网信息服务深度合成管

谈一谈一条SQL查询语句究竟是如何执行的?

这里写目录标题 理解执行流程衍生知识最后 本篇文章是基于《MySQL45讲》来写的个人理解与感悟。 理解 先看下图: 大体来说,MySQL可以分为Server层和存储引擎层两部分。就是对应着图中的两个圈。 server层包含查询缓存、分析器、优化器、执行器等,以及及所有的内置函数(如日期、时间…)所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。 存

苹果录屏功能究竟何在?深入探寻苹果设备上的录屏功能:简便、高效、一键达成

在当下这一数字化的时代,不论是教学演示,还是游戏分享,抑或是工作汇报,录屏软件皆已成为我们日常生活中不可或缺之工具。苹果设备以其出类拔萃的用户体验而声名远播,而其内置的录屏功能更是将便捷性与功能性精妙融合。今日,就让我们共同深入探究如何于苹果设备上轻松启用并运用录屏功能,使您的记录过程变得殊为简便。 苹果设备上的录屏功能极为直观且易于操作,以下为在不同苹果设备上启用和使用录屏功能的基本步

15年期权停交易的时候究竟发生了什么?期权零门槛开户怎么做?

今天带你了解15年期权停交易的时候究竟发生了什么事情?!加入50ETF期权市场的投资者们,都应该听过15年8月50ETF期权停交易事件,那么这一天究竟是怎么了呢?发生了什么呢? 15年8月50ETF期权停交易 8月7日上午,上证50ETF期权合约交易因技术原因出现涨跌停价格异常。上交所再上午9:56暂时停止了上证50ETF期权合约的交易。随后,上交所进行了紧急处置,排除了异常因素,下午14:0

cv.VideoCapture()的摄像头ID究竟是如何编码的?为什么有的是从700开始编码??彻底读懂它!

背景         最近在进行开发的时候,针对摄像头ID的问题总是让人恼火至极,有时候直接cv.VideoCapture(0)、cv.VideoCapture(1)就可以调用摄像头,有时候却需要cv.VideoCapture(700)或者cv.VideoCapture(701)才能调用摄像头。这给平台化开发带来了困难。 简述         在使用OpenCV的cv.VideoCaptur

插座也有显示屏?快来一探究竟!

关键词:显示屏插座’显示屏智能插座'边缘无线协同感知'低功耗物联网(LPIOT)'无线混合组网'用电监测'用电计量'计量插座'无线场景感知,场景能耗计算  在数字化和智能化日益加速的今天,物联网技术正逐渐成为连接现实世界与数字世界的重要桥梁。我们的生活和工作被各种智能设备所环绕,而其中一个看似普通却蕴含巨大能量的创新产品 —— 显示屏智能插座,正悄然改变着我们的用电方式。想象一下,一个小小的插座

抖音的服务器究竟有多大?

点击上方“朱小厮的博客”,选择“设为星标” 后台回复"书",获取 后台回复“k8s”,可领取k8s资料 最近看到一个有意思的提问:抖音服务器带宽有多大,为什么能够供那么多人同时刷? 今天来给大家科普一下。 图片来自 Pexels 抖音,百度,阿里云,腾讯都是自建的数据中心,都是 T 级别出口带宽(总出口带宽),也就是达到 1T=1024G/s 的出口带宽,服务器总署基本都在 20 万台以上,

计算机网络、因特网、互联网、万维网究竟有啥是个啥??

1. 计算机网络 (Computer Network) 计算机网络是指由多个计算设备(如计算机、服务器、路由器等)通过通信设备和通信协议互联起来的系统。计算机网络的目的是为了实现数据的共享和传输。    范围:可以是局域网(LAN)、城域网(MAN)、广域网(WAN)等。  例子:家庭或办公室中的局域网就是一个计算机网络。  2. 因特网 (Internet) 因特网是全球范围内的计算