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实现. 这里 ...
随机推荐
- 配置数据库,Flask-Alchemy
Flask-Alchemy连接数据库的插件 获取当前项目路径(绝对路径) 来自为知笔记(Wiz)
- Ecstore 会员中心 菜单添加一项
1.会员中心 添加菜单 ecstore_合并支付总结_会员中心添加菜单_20160113 class : b2c_ctl_site_member (图 1) 第一步: (图1) ...
- Canvas:绘制路径
Canvas:绘制路径 绘制路径 图形的基本元素是路径.路径是[通过不同颜色和宽度的线段或曲线相连形成的不同形状的]点的集合.一个路径,甚至一个子路径,都是闭合的. 使用路径绘制图形需要一些额外的步骤 ...
- 【工具】Notepad++ 上,代码格式化工具
一.概述 Windows 自带的记事本功能太过简单,因此我常常使用 Notepad++ 查看文本.Notepad++ 支持插件功能,最近需要使用 Notepad++ 查看 Html 代码,而这些代码多 ...
- iOS XCode工程 警告处理
今天 老板说,群~你的警告⚠️蛮多的...我拍了胸脯,下周项目总结时候一定会完美解决!!! 于是我得把项目中全部警告解决了,加油
- GPL协议本身就是剥削,oracle维权玩的让人恶心
我们先来看一下MySQL的版权问题.当前,MySQL采用双重授权(Dual Licensed),他们是GPL和MySQL AB制定的商业许可协议.如果你在一个遵循GPL的自由(开源)项目中使用MyS ...
- 阿里云服务器: centos7 ftp安装
阿里云服务器: centos7 ftp安装 ftp需要您参考下面链接和附件开放安全组20.21.1024-65535 后查看是否正常. 配置步骤如下, 1, 如果没有安装ftp,需要先安装 yum - ...
- Tomcat 优化相关知识
---------(Tomcat Listener)----------- Tomcat 性能的因素是内存泄露.Server标签中可以配置多个Listener,其中 JreMemoryLeakPrev ...
- jQuery UI 自定义样式的日历控件
在线演示 本地下载
- python图片文字识别笔记
我的环境为python3 坑比较多,在此做记录,以备查阅 命令行安装: pip install PIL pip install pytesseract pip install Pillow 下载tes ...