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_day16【Django_ORM、模板】
一.ORM 1.MySQL配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'books', #你 ...
- blogCMS中出现的错误整理
1.在写日期归档的时候,出现如下错误: not enough values to unpack (expected 2, got 1) 出现这个错误是因为:字符串需要能够split成2份才能赋值给2个 ...
- redis.conf配置项说明
#是否以后台进程运行,默认为no,如果需要以后台进程运行则改为yes daemonize no #如果以后台进程运行的话,就需要指定pid,你可以在此自定义redis.pid文件的位置. pidfil ...
- r.js打包注意事项 r.js打包 这个是配合require.js打包的
这个./代表的是当前文件的父目录....打包的资源一定要在这个父目录中下面才行,,,,一定一定,要放在这个目录一下才能被正确找到. 不然只是copy了一份一模一样的文件夹和文件过去,并不会处理压缩啥的 ...
- Dispose 与 close 方法 的区别
Dispose : 释放 托管 与 非托管资源. Finalize : 释放 非托管资源. Close: 关闭资源后,可以再次使用资源.
- CSS3鼠标悬停边框线条动画按钮
在线演示 本地下载
- React Native常用组件之TabBarIOS、TabBarIOS.Item组件、Navigator组件、NavigatorIOS组件、React Navigation第三方
以下内容为老版本React Native,faceBook已经有了新的导航组件,请移步其他博客参考>>[我是传送门] 参考资料:React Navigation react-native ...
- Linux服务器配置秘钥对连接
[root@check2 ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to sa ...
- Metasploit 内网渗透篇
0x01 reverse the shell File 通常做法是使用msfpayload生成一个backdoor.exe然后上传到目标机器执行.本地监听即可获得meterpreter shell. ...
- Axis2创建WebService实例
一.Axis2的下载和安装 1.可从http://ws.apache.org/axis2/ 下载Axis2的最新版本: 可以下载如下两个zip包: axis2-1.5.4-bi ...