当前位置:网站首页>unity update 协程_Unity 协程的原理
unity update 协程_Unity 协程的原理
2022-07-04 13:54:00 【全栈程序员站长】
大家好,又见面了,我是你们的朋友全栈君。
Unity 协程的原理
发布时间:2019-06-13 18:45,
协程不是多线程,协程还是在主线程里面(注:在Unity中非主线程是不可以访问Unity资源的)
1、线程、进程和协程的区别
进程有自己独立的堆和栈,即不共享堆也不共享栈,进程由操作系统调度
线程拥有自己独立的栈和共享的堆,共享堆不共享栈,线程亦有操作系统调度(标准线程是这样的)
协程和线程一样共享堆不共享栈,协程由程序员在协程的代码里面显示调度
一个应用程序一般对应一个进程,一个进程一般有一个主线程,还有若干个辅助线程,线程之间是平行的,在线程里面可以开启协程,让程序在特定的时间内运行。
协程和线程的区别是:协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任,同时,协程也失了标准线程使用多CPU的能力。
2、Unity中协程执行的原理
先贴上一张unity主线的框架运行图:
在Unity运行时,调用协程就是开启了一个IEnumerator(迭代器),协程开始执行,在执行到yield
return之前和其他的正常的程序没有差别,但是当遇到yield
return之后会立刻返回,并将该函数暂时挂起。在下一帧遇到FixedUpdate或者Update之后判断yield return
后边的条件是否满足,如果满足向下执行。
根据unity主线的框架运行图我们知道,协同程序主要是在update()方法之后,lateUpdate()方法之前调用。
Unity生命周期对协程的影响:
通过设置MonoBehaviour脚本的enabled对协程是没有影响的,但如果gameObject.SetActive(false)
则已经启动的协程则完全停止了,即使在Inspector把gameObject
激活还是没有继续执行。也就说协程虽然是在MonoBehvaviour启动的(StartCoroutine)但是协程函数的地位完全是跟MonoBehaviour是一个层次的,不受MonoBehaviour的状态影响,但跟MonoBehaviour脚本一样受gameObject
控制,也应该是和MonoBehaviour脚本一样每帧“轮询” yield 的条件是否满足。
注:WaitForSends()受Time.timeScale影响,当Time.timeScale = 0f时,yieldreturn new
WaitForSecond(X)将不会满足。
3、协程的主要应用
协程不是只能做一些简单的延迟,如果只是单纯的暂停几秒然后在执行就完全没有必要开启一个线程。
协程的真正作用是分步做一些比较耗时的事情,比如加载游戏里的资源
using System.Collections; using System.Collections.Generic; using
System.Threading; using UnityEngine; public class Test : MonoBehaviour {
private int num = 0; void Start() { StartCoroutine(Test1()); } IEnumerator
Test1() { while (num < 30) { num++; Debug.Log(num); yield return null;
Debug.Log(“————-” + num); } } void Update() { Debug.Log(“update” +
num); } void LateUpdate() { Debug.Log(“lateUpdate!” + num); } }
上面的例子很简单就是加载30个对象,如果一次性加载会有卡顿现象,影响游戏体验。这是我们就可以使用协程了,协程是每帧LateUpdate之前执行yield
return 之前的代码,LateUpdate之后执行yield return
之后的代码(可以用过上面的小例子看出)。这样我们就可以每帧加载一个直到加载完毕,不会出现卡顿的现象。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/149432.html原文链接:https://javaforall.cn
边栏推荐
- Summary of common problems in development
- C language course design questions
- Yyds dry goods inventory # solve the real problem of famous enterprises: continuous maximum sum
- Luo Gu - some interesting questions
- es6模块化
- 为什么国产手机用户换下一部手机时,都选择了iPhone?
- 毕业季-个人总结
- 5G电视难成竞争优势,视频资源成中国广电最后武器
- 炒股网上开户安全吗?会不会被骗。
- selenium 元素交互
猜你喜欢
Opencv learning notes - linear filtering: box filtering, mean filtering, Gaussian filtering
Details of FPGA underlying resources
LVGL 8.2 Draw label with gradient color
Weibo and Huya advance into interest communities: different paths for peers
MySQL组合索引(多列索引)使用与优化案例详解
深度学习 神经网络的优化方法
函数计算异步任务能力介绍 - 任务触发去重
A keepalived high availability accident made me learn it again
暑期复习,一定要避免踩这些坑!
Kubernets pod exists finalizers are always in terminating state
随机推荐
LVGL 8.2 text shadow
Width and alignment
ES6 modularization
Redis的4种缓存模式分享
Analysis of nearly 100 million dollars stolen and horizon cross chain bridge attacked
They are all talking about Devops. Do you really understand it?
十六进制
深度学习 网络正则化
LVGL 8.2 Draw label with gradient color
The performance of major mainstream programming languages is PK, and the results are unexpected
openresty 限流
对话龙智高级咨询顾问、Atlassian认证专家叶燕秀:Atlassian产品进入后Server时代,中国用户应当何去何从?
[C language] Pointer written test questions
Is BigDecimal safe to calculate the amount? Look at these five pits~~
Programmer turns direction
曝光一下阿里的工资待遇和职位级别
Free, easy-to-use, powerful lightweight note taking software evaluation: drafts, apple memo, flomo, keep, flowus, agenda, sidenote, workflow
Summer Review, we must avoid stepping on these holes!
Five minutes per day machine learning: use gradient descent to complete the fitting of multi feature linear regression model
PLC模拟量输入 模拟量转换FC S_ITR (CODESYS平台)