ユニティコルーチンは、(a)の説明します

コルーチンでUnityは非常に強力な機能であり、その主な機能は、例えば、ゲーム実行のイベントの流れや一連の時間間隔の遅延のための物語の対話を呼び出すことです。簡単にメモリを強化するために設計されたいくつかの共同関連の知識・プロセスの概要、ならびに初心者の疑問。

 

1、コルーチン、プロセスおよびスレッド

これは、頻繁に尋ねたインタビューの質問です:何でコルーチン、プロセスとスレッドの違いは?

  コルーチンを言えば、我々は最初に、次のスレッドを確認し、これら二つの概念を処理します。オペレーティングシステム(OS)レベルでは、そこのプロセス(過程)とスレッド(スレッド)2であるが、我々は、これら二つのものが「パラレル」をシミュレートするために使用されている「もの」の実在を確認し、オペレーティングシステムを書きませんユーザーがへの「一方」、いくつかの異なるものを「と」許可、CPUを割り当て、異なるプロセスおよびスレッドに特定の戦略を使用してリソースを計算する。「単一のCPU上で、プログラマは、コードOSがプロセスに強制されるか、またはスレッドが中断し、計算するために相互に交換するので、実際には、連続であるが、「平行概念」されるマルチコアCPU今、スレッドは「真に平行」であり得ます。

プロセスは、独自の独立したスタックとヒープを持って、ヒープはどちらも共有も共有スタック、オペレーティングシステムのスケジューラによる処理です。

スレッドには、独自の独立したスタックとヒープのシェアを持っているスタックを共有し、スタックは共有しない、オペレーティングシステムのスレッドスケジューリング(標準スレッドはい)から増加しました。

コルーチンは、ヒープを共有し、スレッドのように、プログラマによってスタック、コルーチン表示スケジューリングコルーチンコードを共有していません。

アプリケーションは、一般的にプロセスに対応し、一般的にメインスレッドを持っているプロセス、スレッド間のいくつかの二次スレッドは、スレッドのコルーチンにオンにすることができ、並列に実行されているがあり、特定の時点でプログラムの実行をさせます。

 

差分コルーチンとスレッドは、次のとおりです。パフォーマンスを向上させることができ、無意味なスケジュールを避けるが、プログラマが自分のスケジュールのために責任を取る必要がありますので、同時に、コルーチンは、標準のマルチCPUスレッドを使用する能力を失うコルーチン。

類推システムが他のプログラムを実行する必要はありません、オペレーティング・システム、シングルコアが存在すると仮定され、二つのスレッドAとBがあり、AとBは、そのタスクを完了するために単独で実行するために10秒かかり、そしてタスクが演算され、AB間のデータの競争と共有するのは間違いありません。AB今二つの平行スレッド、オペレーティングシステムは1秒に1回想定される擬似平行効果のスイッチング周波数を達成するために、二つのスレッド間ABスイッチを停止し、0.1秒のスイッチングコスト(主スイッチングスタック)、20 + 19 * 0.1 = 21.9秒の合計。コルーチン方法ならば、あなたはコルーチンAを実行することができ、Aは、コルーチンBの終わりへの道を与え、スイッチングが1回だけ発生、合計時間は、20 + 1 * 0.1 = 20.1秒です。コルーチンのプログラムがまだ20.1秒を必要としながら、システムはデュアルコアで、スレッドは、標準的なスレッドですので、あなたが並列に本当にAB 2つのスレッド、わずか10秒の合計時間ことができます。

 

  実際には、それは、名前に加えて、コルーチン基本である、とスレッドはあまり接点はありません。メインスレッドで実行されているすべてのスクリプトやコードは、コルーチンは例外ではないことを特にユニティ。それだけコルーチンでのスレッドのコルーチンの類似点は、他の機能と並行して行われているように見えます。しかし、本質的に、スレッドが同時にプログラムの実施を通じてである並列を達成するために、複数の子スレッドを開くことができます。そしてコルーチン各フレーム自身と他の機能を切り替える、方法によって検出されます。ユニティで使用されるスタイルを持つこの「前後に実行する」アプローチは、制服を見ていない、実行(スクリプトのライフサイクル)の明確な順序があります。我々は問題を検討コルーチンロックを使用する必要があり、そして他の多くのスレッドないときように、しかし、これは、その強力な場所です。

 2、コルーチンの原則の実装

それは降伏リターンXXX文のメソッドのコルーチン量と一般的なアプローチをされた経験される前に降伏リターンXXXによってコルーチン実行中の団結は、注目のコルーチンはスレッドではない、以下の内容を実行するために、プログラムを一時停止します、次に実行する戻りXXX文を生成するプログラムの同じ、つまり、後に実行プログラムの後StartCoroutine()メソッドであり、又はシングルスレッドモードを取って、収率リターンXXX次の文の内容のみが一時的に中断、実行するために、特定の時間まで待ちます。
だから、monoBehaviorのライフサイクルに依存して、プログラムの実行を、中断したとき。

メインプログラムは、lateUpdate()メソッドの呼び出しの前に、我々はそれを理解するために、小さな例を渡し、update()メソッドの後に調整されています。

使用してUnityEngineを。
使用にSystem.Collectionsを。
使用してSystem.Threadingを。
パブリック クラステスト:MonoBehaviour 
{ 

    ボイド開始()
    { 
        StartCoroutine(TT())。// 开启协程
        のためのINT i = 0 ; iは< 200 ; I ++)    // 循环A 
        { 
            DEBUG.LOG(" ********************** *** " + I)。
            Thread.sleep(10 )。
        } 
    } 

    のIEnumerator TT()
    {
        以下のためにint型 i = 0 ; iは< 100 iは++); // 循环B 
        { 
            (DEBUG.LOGを" ------------------- " + I)。
        } 

        収率 返す 新しい WaitForSeconds(1)。// 协程1 

        のためのint型 i = 0 ; iは< 100 ; I ++)// 循环C 
        { 
            DEBUG.LOG(" >>>>>>>>>>>>>>>>>>>> " + 私);
              NULL ; // コルーチン1 
        } 
    } 

    // 更新データが
    無効)(更新
    { 
        DEBUG.LOG(" 更新を" ); 
    } 

    // 更新後の
    ボイドLateUpdate()
    { 
        DEBUG.LOG(" ------ LateUpdate " ); 
    } 

}

プログラムの動作結果は以下のとおりです。

方法B、最初の実行サイクル、実行サイクルA、及び更新を行う()とlateUpdate()、および1S待った後、ループCは、UPDAT()()とlateupda間の出力で行われます。

 

リターン収率復帰3、異なったタイプ

  時間の降伏リターンを使用すると、私は新しいと分割することを考える初心者のための新しい行せずに返すことができるタイプの長いリストがあります。

  まず、新しいバンドを言います。通常、ネストされた収率はコルーチンを返すヌル、数値、文字列、ブールさえ式、関数、などがあるかもしれません。

  以在Start()中开启当前协程为例,如果是不带new的返回类型,执行时间都是一样的。即在第一时间执行协程中的代码 到第一个yield return当行为止,然后在下一帧的Update之后,LateUpdate之前执行yield return后面的代码。

  另外需要注意的是,yield return后面可以是一个函数调用,赋值表达式,嵌套的其它协程等。以赋值的表达式num=10为例;它会在当行yield return执行的时候就执行,函数调用和其它协程也是一样。也就是说,此时yield return的函数调用就相当于直接调用了这个函数,并且是当时就执行的。 而其它return 类型 如null,字符串,数字等一般只用作延迟一帧来用,其它作用,待我后期再研究下。

  下面说带new的,也是通常我们重点使用的协程功能。

   这里列举几个:

  (1)new  WaitUntil(Func<bool>)  参数是一个布尔返回类型的委托,作用是,知道这个返回的布尔值为true时,协程才会继续执行当行yield return 后面的代码。       

  (2) new WaitForSeconds(float)参数是float类型的数字,表示秒,也是协程最常用的功能之一。 作用是,在N秒后才会继续执行当行yield return 后面的代码。 

由于yield return可以在一个协程中任意位置写多个,配合这个可以实现很多时间细化可视化的功能。

  (3)new WaitForEndOfFrame()作用是,在结束当前帧 摄像机和GUI被渲染以及其它函数完成后才会继续执行当行yield return 后面的代码。 这个我只验证了在LateUpdate执行完之后执行,具体在整个脚本周期中哪个函数执行完之后开始执行还未详细验证。

  (4)new  WaitForFixedUpdate()  作用是,直到当行代码之后第一个FixedUpdate执行之后才会继续执行当行yield return 后面的代码。也就是说,如果是在start里面开启协程的话,第一次执行FixedUpdate之后就会继续执行return后面的代码。

  后面还有许多类型的 返回,没有一一验证,不过作用应该大同小异,即在执行第一个该类型动作之后才会继续执行当行yield return 后面的代码。

  值得一提的是,协程的延迟调用和非阻塞式挂起是用于网络请求等高级结构很好的工具,非常值得花一些时间去仔细研究。

4、停止协程

  协程内停止 可以用yield return break;

  协程外停止 使用 StopCoroutine(string  methodname);

  另外需要注意的是,设置当前协程所在脚本enable为false并不能停止当前协程的执行,只有设置当前脚本挂载gameobject.SetActive(false) 才可以。

 

おすすめ

転載: www.cnblogs.com/unity3ds/p/10993374.html