关于Unity中协程、多线程、www网络类的使用

协程

我们要下载一张图片,加载一个资源,这个时候一定不是一下子就加载好的,或者说我们不一定要等它下载好了才进行其他操作,如果那样的话我就就卡在了下载图片那个地方,傻住了。我们希望我们只要一启动加载的命令,回来的时候主线程能够继续进行下去。

我们可以启动一个协程去下载,主进程依然在运行。有点类似多线程,不同的是,实际上它还是在一个线程里面,所以我们是在主线程中开启一段逻辑来进行处理,来协同当前程序的执行,还是在主线程里面。

1:在主进程中开启另外一段逻辑处理,来协同当前程序的执行,但与多线程不同都是在主线程里面执行的,而且原来的进程依然进行下去,

2:通过StartCoroutine方法来启动一个协程,StartCoroutine是MonoBehaviour的一个方法,该方法可以启动一个协程,每个协程都有一个入口函数,协程必须要是一个IEnumerator 作为返回值的方法(入口函数);

3:协同程序可以使用yield 关键字来中断协同程序;

4:协程也可以启动一个协程;

5:WaitForSeconds(): 等待多长时间后中断协程;

协程实例

1.创建Unity项目和文件目录,保存场景

2.创建一个空节点game,再创建一个脚本game挂载在gamej节点下

 打开game脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class game : MonoBehaviour {

    private int level=3;
    // Use this for initialization
    void Start () {
        //启动一个协程,必须是继承自MonoBehaviour才能使用
        this.StartCoroutine(this.con_entry());

        //主线程依然在执行
        //...
    }

    //协程和主线程是在同一个线程里面的,不会有什么线程切换
    //协程的入口函数
    IEnumerator con_entry(){
        //协程的代码
        Debug.Log("con_entry run!!");
        Debug.Log("level:" + this.level);//也能够拿到this的变量
        this.StartCoroutine(this.con_other());//再开启一个协程con_other
        //end

        //使用yield中断协程程序,就是让它停下来
        yield return null;

        //协程结束以后的代码,比如去网上捞一个什么东西,下载图片之类的,捞完之后的操作
        //end
    }

    IEnumerator con_other()
    {
        Debug.Log("con_other");
        this.StartCoroutine(this.con_entry_params(3));//再开启一个协程con_entry_params,且传递参数

        yield return null;
    }

    IEnumerator con_entry_params(int a)
    {
        Debug.Log("con_entry_params: " + a);

        yield return new WaitForSeconds(3);//设置3秒中之后才中断协程

        Debug.Log("after WaitForSeconds send");// 处理协程结束的逻辑
    }

    // Update is called once per frame
    void Update () {

    }
}

多线程

1: using System.Thread;

2: 创建一个线程: Thread r = new Thread(callback);  r.start(); 启动运行线程;

3: 线程回掉函数 void run() {}

4: 多个线程访问同一个数据的时候,会发生”冲突”,需要线程安全的方式来访问;

5: 线程锁是在访问公共数据的时候,先去获得这个锁,没有获得锁的线程将会被挂起,指导这个锁被释放。

6: public static Object  o = new Object(); lock(o) {线程安全的执行代码};

7: 线程休眠: Thread.Sleep(单位为ms);

8: 多线程之间要避免死锁;

时间: 2024-08-03 09:32:15

关于Unity中协程、多线程、www网络类的使用的相关文章

深入理解Python中协程的应用机制: 使用纯Python来实现一个操作系统吧!!

本文参考:http://www.dabeaz.com/coroutines/   作者:David Beazley 缘起: 本人最近在学习python的协程.偶然发现了David Beazley的coroutine课程,花了几天时间读完后,为了加深理解就把其中个人认为最为精华的部分摘下来并加上个人理解写了本篇博客. 扯一些淡: 既然要搞一个操作系统,那我们就先来设一个目标吧!就像找女朋友,我们不可能随随便便的是个女的就上,肯定要对女方有一定的要求,比如肤白貌美气质佳…… 所以,我们对这个' 姑娘

python中协程

协程是python中除了进程和线程之外又一种能够实现多任务的方式,又称为微线程,纤程,它相比于线程需要的资源更少. 在python种协程是通过generator实现的.通过yield保存当前运行的状态然后切换到另一个协程执行.普通的生产者-消费这模式是一个线程写消息,一个线程才能读取消息,因此需要控制队列的写入与读取数据.而改用协程可以在生产者生产消息后直接通过yield跳转到消费者开始执行,执行完毕后在切换到生产者,如此反复,效率极高. 在图中,我们可以看出通过next的方法使得生成器中的任务

unity3D中协程和线程混合

这是我google unity3D一个问题偶然发现的在stackflow上非常有趣的帖子: 大意是 要在unity3D上从server下载一个zip,并解压到持久化地址.并将其载入到内存中.以下展示了这样的使用方法: IEnumerator LongCoroutine() { yield return StartCoroutine(DownloadZip()); ExtractZip(); yield return StartCoroutine(LoadZipContent()); } 可是Ex

基于协程的Python网络库gevent

import gevent def test1(): print 12 gevent.sleep(0) print 34 def test2(): print 56 gevent.sleep(0) print 78 gevent.joinall([ gevent.spawn(test1), gevent.spawn(test2), ]) 解释下,"gevent.spawn()"方法会创建一个新的greenlet协程对象,并运行它."gevent.joinall()"

Lua中协程的使用

平常访问网络都会使用回调的方式,现在通过协程改变这种回调的模式,让异步方法按同步的方法来使用 -- co.lua yield = coroutine.yield co = function(func, cb) local cor = coroutine.create(func) local next = coroutine.resume local hasNext; hasNext = function(status, func, ...) -- suspended if not status

Python中协程的实现

通过关键字yield,可以从生成器中产生值,并返回.我们可以将生成器作为一个生产者来使用. 在协程中,通过使用关键字yield,还可以让具有yield的程序接收值.此时函数作为消费者,消费我们传入(send)的值. 在协程中,可以把yield作为右值来用.在foo函数中,我们这样写: n = yield 可以通过send方法来向foo函数发送值,这时,发送的值被foo接收,并存到n里. n中的值可以在foo函数中使用 这样,yield作为右值来使用,就使得foo函数变成了一个消费者. 我们知道,

Unity在协程内部停止协程自身后代码执行问题

当在协程内部停止自身后,后面的代码块还会继续执行,直到遇到yield语句才会终止. 经测试:停止协程,意味着就是停止yield,所以在停止协程后,yield之后的语句也就不会执行了. 代码如下: 1 using UnityEngine; 2 using System.Collections; 3 4 public class Test : MonoBehaviour { 5 6 void Start () { 7 StartCoroutine("Method"); 8 } 9 10 I

Coroutine协程库:网络性能完爆Asio异步模型

在purecpp社区的github组织中有一个协程库:https://github.com/topcpporg/cpp_features 近日有用户找到我,想要了解一下coroutine库在网络方面的性能,于是选取已入选标准库的boost.asio网络库的异步模型做了一次对比测试,结果完爆asio异步模型,coroutine库网络性能是asio异步模型的2-14倍,使用8线程处理小包时,QPS可达670万/秒. 简要介绍一下测试流程: 1.TCP协议,C/S是同一台物理机的两个进程,建立1000

COROUTINE协程库:网络性能完爆ASIO异步模型(-O3测试)

在purecpp社区的github组织中有一个协程库:https://github.com/topcpporg/cpp_features 近日有用户找到我,想要了解一下coroutine库在网络方面的性能,于是选取已入选标准库的boost.asio网络库的异步模型做横向对比. 在小包和利用多核方面,coroutine库的网络性能完爆asio异步模型,8线程处理小包时差距可达十几倍. 在大包+单线程的情况,coroutine库的网络比asio异步模型高的不是很多,在一些性能比较差的PC机上,甚至出