ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Unity-进程/线程/协程

2022-08-17 13:30:19  阅读:182  来源: 互联网

标签:return 一帧 yield Unity 线程 new 协程


进程
进程是计算机中的程序关于某数据集合上的一次运动活动,是系统进行资源分配和调度的基本单元,是操作系统结构的基础。

// 打开指定程序
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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有