Unity在协程(Coroutines)内开启线程(Threading )
孙广东 2017.6.13
http://blog.csdn.NET/u010019717
主要是因为创建线程是一个开销比较大的操作。
更重要的是线程是危险的,所以必须非常小心同步的东西! 您还需要记住,Unity API本身就不是线程安全的,因此所有调用Unity API都应该从主线程完成。
当你计算一些高开销的或长期的操作,线程仍然可以是首选。 这方面的例子有:
- 人工智能
- 寻路
- 网络通信
- 文件操作
usingSystem.Collectons;usingUnityEngine;
class TestScript : MonoBehaviour
{class Config
{publicstring Version;publicstring AssetsUrl;}
void Start(){
StartCoroutine(LoadConfig());}
IEnumerator LoadConfig(){// 第一帧加载配置string json = File.ReadAllText("/path/to/config.json");
// 等待直到第二帧yieldreturnnull;
// 在第二帧解析配置
Config config = JsonUtility.FromJson<Config>(json);
// 等待直到第三帧yieldreturnnull;
// 在第三帧使用配置
Debug.Log("Version: "+ config.Version+"\nAssets URL: "+ config.AssetsUrl);}}
|
usingSystem.Collections;usingSystem.IO;usingSystem.Text;usingUnityEngine;
publicclass TestScript : MonoBehaviour
{class Config
{publicstring Version;publicstring AssetsUrl;}
void Start(){
StartCoroutine(LoadConfig());}
IEnumerator LoadConfig(){// 每帧加载1 Kb 大小,直到加载完成。
MemoryStream jsonStream , buffer){break;}
jsonStream, numBytesRead);yieldreturnnull;}}
// 等到下一帧解析字符串yieldreturnnull;string json = Encoding.UTF8.GetString(jsonStream.ToArray());
// 等到下一帧 转成 Config 对象yieldreturnnull;
Config config = JsonUtility.FromJson<Config>(json);
// 等到下一帧 使用配置yieldreturnnull;
Debug.Log("Version: "+ config.Version+"\nAssets URL: "+ config.AssetsUrl);}}
|
usingSystem.Collections;usingSystem.IO;usingSystem.Threading;usingUnityEngine;
publicclass TestScript : MonoBehaviour
{class Config
{publicstring Version;publicstring AssetsUrl;}
void Start(){
StartCoroutine(LoadConfig());}
IEnumerator LoadConfig(){// 第一帧开启线程
Config config =null;bool done =false;new Thread(()=>{// 加载和解析Json, 跟Unity的帧无关。string json = File.ReadAllText("/path/to/config.json");
config = JsonUtility.FromJson<Config>(json);
done =true;}).Start();
// 每帧都检查线程是否完成while(!done){yieldreturnnull;}
// 线程完成 后的第一帧 使用配置
Debug.Log("Version: "+ config.Version+"\nAssets URL: "+ config.AssetsUrl);}}
|
using System;
using System.Threading;
/// <summary>
/// A CustomYieldInstruction that executes a task on a new thread and keeps waiting until it's done.
/// http://JacksonDunstan.com/articles/3746
/// </summary>
class WaitForThreadedTask : UnityEngine.CustomYieldInstruction
{
/// <summary>
/// If the thread is still running
/// </summary>
private bool isRunning;
/// <summary>
/// Start the task by starting a thread with the given priority. It immediately executes the
/// given task. When the given task finishes, <see cref="keepWaiting"/> returns true.
/// </summary>
/// <param name="task">Task to execute in the thread</param>
/// <param name="priority">Priority of the thread to execute the task in</param>
public WaitForThreadedTask(
Action task,
ThreadPriority priority = ThreadPriority.Normal
)
{
isRunning = true;
new Thread(() => { task(); isRunning = false; }).Start(priority);
}
/// <summary>
/// If the coroutine should keep waiting
/// </summary>
/// <value>If the thread is still running</value>
public override bool keepWaiting { get { return isRunning; } }
}
usingSystem.Collections;usingSystem.IO;usingUnityEngine;
publicclass TestScript : MonoBehaviour
{class Config
{publicstring Version;publicstring AssetsUrl;}
void Start(){
StartCoroutine(LoadConfig());}
IEnumerator LoadConfig(){
Config config =null;yieldreturnnew WaitForThreadedTask(()=>{string json = File.ReadAllText("/path/to/config.json");
config = JsonUtility.FromJson<Config>(json);});
Debug.Log("Version: "+ config.Version+"\nAssets URL: "+ config.AssetsUrl);}}
|
Unity在协程(Coroutines)内开启线程(Threading )的更多相关文章
- 关于Unity中协程、多线程、线程锁、www网络类的使用
协程 我们要下载一张图片,加载一个资源,这个时候一定不是一下子就加载好的,或者说我们不一定要等它下载好了才进行其他操作,如果那样的话我就就卡在了下载图片那个地方,傻住了.我们希望我们只要一启动加载的命 ...
- [Unity菜鸟] 协程Coroutine
1.协程,即协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态. unity中StartCoroutine()就是协程,协程实际上是在一个线程中, ...
- Python 协程 - Coroutines
协程 - Coroutines Awaitable Objects, Awaitable Objects 通常由 __await__() 生成, 而 Coroutine objects 是由 asyn ...
- UNITY所谓的异步加载几乎全部是协程,不是线程;MAP3加载时解压非常慢
实践证明,以下东西都是协程,并非线程(thread): 1,WWW 2,AssetBundle.LoadFromFileAsync 3,LoadSceneAsync 其它未经测试 此问题的提出是由于一 ...
- Java的虚拟线程(协程)特性开启预览阶段,多线程开发的难度将大大降低
高并发.多线程一直是Java编程中的难点,也是面试题中的要点.Java开发者也一直在尝试使用多线程来解决应用服务器的并发问题.但是多线程并不容易,为此一个新的技术出现了,这就是虚拟线程. 传统多线程的 ...
- Unity3D之协程(Coroutines & Yield )
在Unity中StartCoroutine/yield return这个模式到底是怎么应用的? 比如你要一个方法进行一个比较耗时的复杂运算~同时又想让脚本流畅的进行其他操作而不是卡在那里等该方法执行完 ...
- 关于Unity的协程
协程 认识协程 //协程不是多线程:是一段在主程序之外执行的代码 //协程不受生命周影响 //作用:能够口直代码在特定的时间执行. //1,延时操作 //2,等待某代码执行结束之后执行 /* 特点:1 ...
- C#神器 委托 + Unity神器 协程
作为源生的C#程序员,可能已经非常了解委托(delegate).行动(Action)以及C#的事件了,不过作为一个半道转C#的程序员而言,这些东西可能还是有些陌生的,虽然委托并非是C#独创,亦非是首创 ...
- 关于Spring事务的原理,以及在事务内开启线程,连接池耗尽问题.
主要以结果为导向解释Spring 事务原理,连接池的消耗,以及事务内开启事务线程要注意的问题. Spring 事务原理这里不多说,网上一搜一大堆,也就是基于AOP配合ThreadLocal实现. 这里 ...
随机推荐
- python16_day08【异常、多线程】
一.反射及相关 1.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() isinstance(ob ...
- java队列的实现
队列也可以通过数组和链表两种方式来实现. 1.链表方式实现 class Node{ Node next = null; int data; public Node(int data){this.dat ...
- Python 实习遇见的各种面试题
Python 语法 说说你平时 Python 都用哪些库 == 和 is 区别. == 是比较两对象的值,is 是比较在内存中的地址(id), is 相当于 id(objx) == id(objy). ...
- 大数据生态,哪些框架需要全部启动,哪些只启动master,仅为汇总
主从,只需要在master节点启动 hadoop hbase 单机启动 hive 其他,需要启动每个节点 zookeeper kafka flume presto
- 利用C#查看特定服务是否安装
需求:想通过C#代码来查看IIS服务或者MSMQ是否已经安装 分析:IIS服务和MSMQ安装完成后都会创建windows服务,所以我们只需要查看对应的服务是否存在即可. 准备工作: IIS服务名称:W ...
- 重置root密码后仍然不能登陆
一.忘记密码:二.输入正确用户名和密码时依旧无法登录. 一.忘记密码 进入单用户模式重置密码: 开机启动时,按‘E’键(倒计时结束前)进入界面 选择第二项,按‘E’键再次进入 在最后一行添加‘ 1’( ...
- 一种BIM缺失多态性介导的酪氨酸激酶抑制剂的耐药性
论文名称:A common BIM deletion polymorphism mediates intrinsic resistance and inferior responses to tyro ...
- 智能指针 auto_ptr、scoped_ptr、shared_ptr、weak_ptr
什么是RAII? RAII是Resource Acquisition Is Initialization的简称,是C++语言的一种管理资源.避免泄漏的惯用法. RAII又叫做资源分配即初始化,即:定义 ...
- openstack认证实践
环境: 客户端:负责发送请求, 服务器:负责接受请求: 认证服务器keystone:负责认证 具体认证步骤: 1.客户端首先进行签名计算,将得到的签名字符串作为authorization发给keyst ...
- mysql 进阶查询(学习笔记)
学习笔记,来源:实验楼 ,链接: https://www.shiyanlou.com/courses/9 一.日期计算: 1.要想确定每个宠物有多大,可以使用函数TIMESTAMPDIFF()计算 ...