unity 多线程

简介:
1

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
using  System.Collections;
using  System.Collections.Generic;
using  System.Threading;
using  UnityEngine;
 
public  class  NewBehaviourScript : MonoBehaviour {
 
     public  Thread th;
 
     public  Thread th2;
 
     // Use this for initialization
     void  Start()
     {
 
         th =  new  Thread(revData);
         //th.Priority = System.Threading.ThreadPriority.Normal;
         th.IsBackground =  true ;
         th.Start();
 
         //
         th2 =  new  Thread(revData2);
         //th.Priority = System.Threading.ThreadPriority.Normal;
         th2.IsBackground =  true ;
         th2.Start();
 
 
     }
 
     public  int  count = 0;
 
     private  void  revData()
     {
 
        
         while  (
 
              Thread.CurrentThread.ThreadState != (ThreadState.Background | ThreadState.AbortRequested)
 
 
 
             )
         {
             count++;
 
             Debug.Log( "revData:" ); // + count.ToString());
 
             //Thread.Sleep(1);
             Thread.SpinWait(1);
         }
 
     }
 
     private  void  revData2()
     {
         while  ( true )
         {
             count++;
 
             Debug.Log( "revData2:" ); // + count.ToString());
 
             //Find can only be called from the main thread.
             //GameObject c = GameObject.Find("Cube");
 
             Thread.Sleep(1000);
 
         }
 
     }
 
     // Update is called once per frame
     void  Update () {
         
     }
 
     private  void  OnApplicationPause( bool  pause)
     {
         if  ( null  != th2)
         {
             if (th2.IsAlive)
             {
                 th2.Interrupt();
 
             }
 
         }
     }
 
     private  void  OnApplicationQuit()
     {
   th.Abort();
         th2.Abort();
       
        
     }
}

  


Thread.Sleep虽是静态方法,但指的是当前线程

另外由于线程 睡眠/唤醒 需要时间

Thread.SpinWait反应速度度更快一些

 

我有必要 警告一下: Thread.SpinWait(10); //自旋10毫秒,性能会极差, CPU 会被占满

 

我这边有一个需求,不想使用 内置 Timer —— 所以需要线程休眠。

每隔10毫秒执行一次。

do{

Thread.SpinWait(10);  //自旋10毫秒

Thread.Sleep(10);       //休眠10毫秒

}while(true);

 

结果:Thread.SpinWait(10);  CPU被占满 100% —— “自旋” (这个词的意思 或许就是说:没事做的时候,也要折腾一点事儿出来)。

——————————————————————

当然:

Thread.SpinWait(10);  精度准一点(没有线程的 唤醒时间,休眠10ms,实际休眠 10.001 ms)

Thread.Sleep(10);  精度差一点(有线程的 唤醒时间,休眠10ms,实际休眠 10.1 ms)

 

MSDN解释: SpinWait 方法在实现锁定方面十分有用。.NET Framework 中的类(例如 Monitor 和 ReaderWriterLock)在内部使用此方法。SpinWait 实质上会将处理器置于十分紧密的循环中,其循环计数由 iterations 参数指定。因此,等待的持续时间取决于处理器的速度。 针对这一点,将此方法与 Sleep 方法进行对比。调用 Sleep 的线程会产生其处理器时间当前片断的剩余部分,即使指定的时间间隔为零也不例外。如果为 Sleep 指定非零的时间间隔,则线程计划程序会不考虑该线程,直到该时间间隔结束。

 

值得注意的是SpinWait只有在SMP或多核CPU下才具有使用意义。在单处理器下,旋转非常浪费CPU时间,没有任何意义。

 

为什么调用thread.Abort(),线程不会马上停止

 
下面我们来解释一下Abort()方法是如何工作的。因为公用语言运行时管理了所有的托管的线程,同样它能在每个线程内抛出异常。Abort()方法能在目标线程中抛出一个ThreadAbortException异常从而导致目标线程的终止。不过Abort()方法被调用后,目标线程可能并不是马上就终止了。因为只要目标线程正在调用非托管(托管也是一样)的代码而且还没有返回的话,该线程就不会立即终止。而如果目标线程在调用非托管的代码而且陷入了一个死循环的话,该目标线程就根本不会终止。不过这种情况只是一些特例,更多的情况是目标线程在调用托管的代码,一旦Abort()被调用那么该线程就立即终止了。
本文转自jiahuafu博客园博客,原文链接http://www.cnblogs.com/jiahuafu/p/6773929.html如需转载请自行联系原作者

jiahuafu
相关文章
|
安全 C# 图形学
Unity C#基础之 多线程的前世今生(下) 扩展篇
在前面两篇Unity C#基础之 多线程的前世今生(上) 科普篇和Unity C#基础之 多线程的前世今生(中) 进阶篇中,相信大家对多线程有了一定的了解,这篇再详细的聊一聊在使用多线程中需要注意的地方~ 示例工程下载Unity 2017.
1151 0
|
C# 图形学 API
Unity C#基础之 多线程的前世今生(中) 进阶篇
书接上回Unity C#基础之 多线程的前世今生(上) 科普篇,下面为大家介绍从.NET 1.X到4.X版本中多线程的示例,推荐使用.NET 3.X版本注意:打印提示中信息很重要,反馈出线程ID和顺序,便于理解 欢迎大家留言交流 【2018.
1427 0
|
图形学
unity 多线程
、     using System.Collections; using System.Collections.Generic; using System.Threading; using UnityEngine; public class NewBehaviourS...
|
1天前
|
开发框架 Java C#
【Unity逆向】玩游戏遇到的“飞天锁血”是怎么实现的?
【Unity逆向】玩游戏遇到的“飞天锁血”是怎么实现的?
95 0
|
1天前
|
存储 自然语言处理 监控
【Unity 实用工具篇】| 游戏多语言解决方案,官方插件Localization 实现本地化及多种语言切换
Unity的多语言本地化是一个很实用的功能,它可以帮助游戏支持多种语言,让不同语言的玩家都能够更好地体验游戏。 而实现本地化的方案也有很多种,各个方案之间也各有优劣,后面也会对多个方案进行介绍学习。 本文就来介绍一个专门作用于多语言本地化的Unity官方插件:Localization 。 这个插件方便进行游戏的多语言本地化,让游戏支持多种语言,下面就来看看该插件的使用方法吧!
|
1天前
|
定位技术 C# 图形学
Unity和C#游戏编程入门:创建迷宫小球游戏示例
Unity和C#游戏编程入门:创建迷宫小球游戏示例
79 2
|
9月前
|
开发框架 Java .NET
《unity游戏优化》第8章内存优化
《unity游戏优化》第8章内存优化
|
1天前
|
运维 API C#
【Unity游戏破解】外挂原理分析
【Unity游戏破解】外挂原理分析
172 0
【Unity游戏破解】外挂原理分析