Unity-进程/线程/协程
作者:互联网
进程
进程是计算机中的程序关于某数据集合上的一次运动活动,是系统进行资源分配和调度的基本单元,是操作系统结构的基础。
// 打开指定程序
Process p = Process.Start(@"C:\Program Files\Google\Chrome\Application\chrome.exe");
// 杀死携程
p.Kill();
// 获得当前运行的全部进程
Process[] list = Process.GetProcesses();
for (int i = 0; i < list.Length; i++) {
var name = list[i].ProcessName;
if (name.Contains("QQ")) {
// 可以根据进程的名称对其进行操作
Console.WriteLine(name);
}
}
Debug模式:运行程序是脚本所在文件夹下的bin文件夹下的Debug文件夹下找到一个.exe文件这个就是这个程序的启动项。但不能发布给别人使用。
Release模式:先运行程序,在运行脚本下的bin文件夹下的Release文件夹下找到一个.exe文件,这个就是打包出来的程序。可以将这个发给朋友运行测试。
线程
线程是程序中一个单一的顺序控制流程,进程内一个相对独立的,可调度的执行单元,是系统独立调度和分配CPU的基本单元,值运行中的程序的调度单元。
一个程序中至少有一个进程,一个进程中至少有一个线程(主线程)
真正工作的是线程而不是进程
using System;
using System.Threading;
namespace BigTalk {
class Program {
static void Main(string[] args) {
Shop shop = new Shop();
Thread thread1 = new Thread(shop.Sell);
Thread thread2 = new Thread(shop.Sell);
// 线程开启
thread1.Start();
thread2.Start();
// 线程关闭
thread1.Abort();
}
}
class Shop {
public static int Number;
public Shop() {
Number = 1;
}
// 售卖
public void Sell() {
// 线程锁
lock (this)
if (Number > 0) {
// 延迟执行,毫秒
Thread.Sleep(1000);
Console.WriteLine("售卖成功,剩余数量为" + --Number);
}
}
}
}
多线程若是执行不同的任务的时候,可以做到并行处理任务大大的加快了任务的进度,但若时多线成执行一个任务的时候,就会争夺同一个任务,这个时候可能会产生报错,这里可以引入lock防止多个线程抢夺一个资源。
lock 最多个线程调用一个任务的时候虽然起到安全作用,但是,前一个线程没有执行完毕,其他的线程就会在原地空转,性能将会大大的折扣,这时便引入了协程这个概念
协程
用单线程表示多线程的概念,便是协程。
Unity中的一帧最相较于CPU处时间还是比较充裕的,在Unity执行一帧的时间内,实际上执行了(主线程,线程一,线程二),但Unity还是单线程,故不会出现多线程中的资源抢夺的问题。
void Start() {
// 开启协程
StartCoroutine(enumerator());
// 关闭协程
StopCoroutine(co);
}
// 协程
IEnumerator enumerator() {
// 延迟一秒执行
yield return new WaitForSeconds(1);
// 延迟一帧
yield return new WaitForEndOfFrame();
// 延迟一帧
yield return null;
// 延迟一帧
yield return 0;
// 延迟一帧
yield return 100;
}
若是在协程中出现死循环,主线程不受影响。
协程:主要处理延迟逻辑。
加载资源若是放到主线程中会导致在下载资源的时候程序不能做其他的事,故像资源加载等可以将其放到携程中进行
下载网络图片
public string url;
public Image image;
void Start()
{
// 开启携程,因为图片加载没有固定时间
StartCoroutine(DownImage(url));
}
IEnumerator DownImage(string url) {
// 通过WWW对显示的图片进行加载
WWW www = new WWW(url);
// 等待图片加载完毕
yield return www;
// 创建对应包围盒
Rect rect = new Rect(Vector2.zero, new Vector2(www.texture.width, www.texture.height));
// 将前面加载的图片格式转换成精灵体模式
Sprite sprite = Sprite.Create(www.texture, rect, Vector3.zero);
// 将转换成的精灵体模式的图片给到Image
image.sprite = sprite;
// 设置Image大小为图片原大小
image.SetNativeSize();
}
标签:return,一帧,yield,Unity,线程,new,协程 来源: https://www.cnblogs.com/wuzhongke/p/16588484.html