unity3d的线程_unity3d 线程 - CSDN
  • http://www.manew.com/thread-98363-1-1.html
    展开全文
  • Unity3d线程

    2016-04-29 07:40:02
    (一)多线程的创建 Thread t = new Thread(new ThreadStart(Go));  Thread t1 = new Thread(Go); 两种创建方式没有区别; (二)多线程的状态控制和优先级 多线程有4种状态:Start()开始;Abort()终止;Join()...

    (一)多线程的创建

    Thread t = new Thread(new ThreadStart(Go)); 

    Thread t1 = new Thread(Go);

    两种创建方式没有区别;

    (二)多线程的状态控制和优先级

    多线程有4种状态:Start()开始;Abort()终止;Join()阻塞;Sleep()休眠;

    有5种优先级:从高到底依次为:Highest,AboveNormal ,Normal ,BelowNormal ,Lowest;

    线程的默认优先级为Normal;


    多线程实例

    /*
     * 
     * 游戏多线程
     * */
    using UnityEngine;
    using System.Threading;
    
    
    public class BaseThread{
    	
    	private static BaseThread instance;
    
        object obj = new object();
        int num = 0;
        private BaseThread()
    	{
    
            /*测试线程优先级 
            /*/
            Thread th1 = new Thread(Th_test1);              //创建一个线程
            Thread th2 = new Thread(Th_test2);
            Thread th3 = new Thread(Th_test3);
            th1.Start();
            th2.Start();
            th3.Start();
            //学习优先级
            th1.Priority = System.Threading.ThreadPriority.Highest;         //优先级最高
            th2.Priority = System.Threading.ThreadPriority.Normal;
            th3.Priority = System.Threading.ThreadPriority.Lowest;
            //**/
    
    
            ///*测试线程锁
            
            /*/
    
            Thread th1 = new Thread(new ThreadStart(Th_lockTest));
            th1.Name = "test1";
            th1.Start();
    
            Thread th2 = new Thread(new ThreadStart(Th_lockTest));
            th2.Name = "test2";
            th2.Start();
    
    		//*/
    
    
    
    
        }
    
    
        public static BaseThread GetInstance()  
    	{
    		if (instance == null)  
    		{
                instance = new BaseThread();  
    		}  
    		return instance; 
    	}
    	
    
        //测试多线程锁
        public void Th_lockTest()
        {
            
            Debug.Log("测试多线程");
            while (true)
            {
                lock (obj)
                {                                //线程“锁”         
                    num++;
                    Debug.Log(Thread.CurrentThread.Name + "测试多线程" + num);
                }
                Thread.Sleep(100);
                if (num > 300)
                {
                    Thread.CurrentThread.Abort();
                }
            }
        }
    
        //测试多线程优先级
        public void Th_test1()
        {
            for (int i = 0; i < 500; i++)
            {
               
                Debug.Log("测试多线程1执行的次数:" + i);
                if(i >200)
                {
                    Thread.CurrentThread.Abort();
                }
            }
        }
        public void Th_test2()
        {
            for (int i = 0; i < 500; i++)
            {
             
                Debug.Log("测试多线程2执行的次数:" + i);
                if (i > 300)
                {
                    Thread.CurrentThread.Abort();
                }
            }
        }
        public void Th_test3()
        {
            for (int i = 0; i < 500; i++)
            {
          
                Debug.Log("测试多线程3执行的次数:" + i);
                if (i > 400)
                {
                    Thread.CurrentThread.Abort();
                }
            }
        }
    
    }



    注意:

    1,当多个线程同时访问同一数据时要加线程锁lock。

     Object n=new Object();
        long shu = 0;  
    	// Use this for initialization
    	void Start () {
            
    	}
    	
    	// Update is called once per frame
    	void Update () 
        {
            lock (n)
            {
                xian = 1;
            }
    	}


    展开全文
  • Unity3D游戏开发之多线程及使用多线程   Unity3D中的多线程线程是一个相当复杂的话题,但如果掌握了它,就可以从容的使用多个硬件处理器或处理很难划分管理数据块。   如在场景中用A*算法进行大量的数据计算,...


    Unity3D中的多线程。线程是一个相当复杂的话题,但如果掌握了它,就可以从容的使用多个硬件处理器或处理很难划分管理数据块。

     

    如在场景中用A*算法进行大量的数据计算,变形网格中操作大量的顶点,持续的要运行上传数据到服务器,二维码识别等图像处理,如果同时你要处理很多事情或者与Unity的对象互动小可以用thread,否则使用coroutine。

     

    线程是在程序中与其他线程同时运行的进行。在多处理器的计算机上可以做到多个线程的真正的同步,更多的线程取决于有多个处理核心。

     

    编程时,总有个主线程执行你的代码,也可以创建额外的线程和主线程同时运行。而Unity中,你仅能从主线程中访问的组件,对象和Unity3D系统调用。任何企图访问这些项目的第二个线程都将失败并引发错误,这是一个要重视的一个限制。

     

    所以当你写代码时,你认为一个函数开始并达到它执行的点后返回,同样你做的东西又在另外一个函数中执行,但又没有发生相应的变化。操作系统决定你代码的执行,任何时候,你的代码只能暂时”休眠”掉,然后让另外的代码开始运行。

     

     

     

    多线程及使用多线程

     

    在这个例子中,在第一个线程将A的值加载到CPU寄存器中准备+1后被中断,第二个线程来读取A的值,并减去1000,这时A应该是-950,现在第一个线程重新开始,它在寄存器中的50+1的结果存储于A,A变成了51,而-950已经丢掉了。

     

    从根本上说,要在用多个线程在同时对变量或内存访问时,要采取很多预防措施来确保不会发生这样的事。所以Unity决定从另外线程访问这些变量或者内存是无效的,只是为了避免所有系统和框架对象出现问题。所以要确保一次只有一个线程来修改变量,这不意味着你不能用多线程工作,你可以用”排序”来解决这个问题。

     

    C#中有lock这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象,这里说对象是因为法锁定一个类型值(value type)或原型(primitive)。

     

    1. int a = 50;

    2. 

    3. object guard = new object();

    4. 

    5. void ThreadOneCode()

    6. {

    7. //一些代码在这

    8. 

    9. lock(guard)

    10. {

    11. a = a + 1;

    12. }

    13. 

    14. //其余一些代码在这

    15. 

    16. }

    17. 

    18. void ThreadTwoCode()

    19. {

    20. //一些代码在这

    21. 

    22. lock(guard)

    23. {

    24. a = a - 1000;

    25. }

    复制代码

     

    所有都锁定在guard内,保证同一个时间只有一个线程通过guard访问它,你可以使用任何合适的对象。现在你可能会有各种各样的问题,比如你要锁定的不止一件事,可能是互相嵌套的。那我们该怎么办呢?

     

    我们这个类叫Loom,让你可以轻松在另一个线程运行代码,这里有两个要注意的功能:

     

    RunAsync(Action)-在另一个线程上运行的一组代码.

     

    QueueOnMainThread(Action,[可选]float time)-运行在主线程的语句(可选延迟).

     

    用Loom.Current访问Loom-创建一个看不见的GameObject用来处理游戏主线程的互动,下面这个例子用Loom来更新一个网格所有的顶点乘的结果。

     

     

    展开全文
  • Unity线程访问类实现 unity中子线程无法使用unity中的方法,但很多时候我们需要在子线程中调用unity的方法(比如网络游戏),为了解决这个问题,我们就必须将需要在子线程调用的unity方法的代码,在主线程中执行...

    #Unity跨线程访问类实现 #

    unity中子线程无法使用unity中的方法,但很多时候我们需要在子线程中调用unity的方法(比如网络游戏),为了解决这个问题,我们就必须将需要在子线程调用的unity方法的代码,在主线程中执行。可是,如何能实现呢?既然是方法的传递,很容易想到 委托,为了在子线程能轻松将执行unity方法的代码放在主线程执行,可以将具体实现放在一个单例类中,即跨线程访问类。

    具体代码实现:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    //跨线程访问类,继承自单例类
    public class AccrossThreadHelper : MonoSingleton<AccrossThreadHelper>
    {
    	//定义个无参数无返回值的委托类型(可根据需求改进)
        public delegate void AccrossThreadFunc();
    	//一个委托集合
        private List<AccrossThreadFunc> delegateList;
        private void Start()
        {
    	    //初始化委托集合,并开启协程(Update替代协程也可以)
            delegateList = new List<AccrossThreadFunc>();
            StartCoroutine(Done());
        }
    	
    	//协程具体实现
        IEnumerator Done()
        {
            while(true)
            {
                if (delegateList.Count > 0)
                {
    	            //遍历委托链,依次执行
                    foreach (AccrossThreadFunc item in delegateList)
                    {
                        item();
                    }
                    //执行过的委托代码,清空
                    delegateList.Clear();
                }
                yield return new WaitForSeconds(0.1f);
            }
        }
    	//公开的添加委托方法
        public void AddDelegate(AccrossThreadFunc func)
        {
            delegateList.Add(func);
        }
    }
    
    
    

    调用格式:

    AccrossThreadHelper.Instance.AddDelegate(() => { ...});
    

    最后注意:

    跨线程访问类的初始化,要在主线程进行(⊙o⊙)。
    

    更多个人原创博客,可关注公众号SFGame
    在这里插入图片描述

    展开全文
  • unity3d 线程安全问题

    2019-06-15 16:37:27
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • Unity异步线程调用主线程脚本程序,在Unity中异步线程调用主线程会报错,所以编写了一个Loom
  • 前几天做的热力图中, foreach (var pos in PositionList) { PosArrayAdd(posArray, pos,size); } void PosArrayAdd(float[,] posArray, Position pos,INT size) ...
  • unity3d做网游的同学应该不少,其中一个很蛋疼的问题就是主线程中尤其是UI部分很多实例都是不允许子线程修改的,那么我们就只有想办法把这些子线程里的数据缓存起来,让主线程自己拿着这些数据该干嘛干嘛去。...
  • Unity3D 协程与线程

    2017-08-30 22:47:12
    1 线程、进程、协程的区别 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。 协程和线程...
  • Unity3D协程-基础篇

    2019-07-18 10:45:05
    本课程为Unity3D协程技术精讲中的基础部分,协程是UnityEngine技术里面为常用且设计为精髓的技术;基础部分主要讲解协成的前世今生,其中包括设计模式、实现模式、验证模式的递进式推进过程让同学们掌握协程原理与...
  • 熟悉Unity的developer都知道在Unity中的线程不能使用Unity的对象,但可以使用Unity的值类型变量,如Vector3等。这样就使得线程Unity中显的很鸡肋和蹩脚,因为很多函数很都是UnityEngine类或函数的调用的,对于哪些...
  • 一个新建项目,做了两个多月才发现忘记写多线程获取数据导致卡顿,然后尝试去改动,但是不想把主动被动的部分的结构打乱,使用了Loom解决子线程完成后向主线程广播。 Messenger本身用在子线程会出现 get_isActiveAnd...
  • Unity线程Loom类

    2018-12-06 18:05:29
    using UnityEngine; using System.Collections; using System.Collections.Generic; using System; using System.Threading; using System.Linq;...public class Loom : MonoBehaviour ... public static int maxT...
  • Unity3D线程写法

    2014-08-13 08:21:59
    unity3D更多资源教程免费下载,群193521697 邀请...Unity3D的多线程写法如下: usingUnityEngine; using System.Collections; usingSystem.Threading; publicclass MyThread { publicint count; s
  • unity3d线程处理

    2013-08-26 11:28:52
    这就是我要做的是在一个Unity3D组件安全。当它是安全的时候,读取或更改其他组件的变量。例如,如果你试图修改或查询物理组件,你会遇到问题,同时一FixedUpdate发生了!这个组件使用互斥锁,让线程知道什么时候可以...
  • C#多线程的使用Unity支持多线程Unity支持多线程Unity支持多线程,重要三遍。 当大家使用到Unity读取外界数据或者操作网格的时候,多线程会非常的好用,因为操作可能比较昂贵,多开辟一个线程充分利用多核CPU的...
  • 笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。 CSDN视频网址...
  • Unity 引擎的游戏逻辑和渲染,都是在主线程中进行的,和大多数其他游戏引擎一样,Unity 也是一个单线程的引擎。这与常规开发的思路可能不太一样,通常认为多线程能够很大程度上提升程序的性能效率,何况是游戏这种...
  • 引言:之前写过一个 demo 案例大致讲解了 Socket 通信的过程,并和自建的服务器完成连接和简单的数据通信,详细的内容可以查看 Unity3D —— Socket通信(C#)。但是在实际项目应用的过程中,这个 demo 的实现方式显得...
1 2 3 4 5 ... 20
收藏数 5,266
精华内容 2,106
关键字:

unity3d的线程