2017-07-14 6 views
0

以下の2つの関数の例があります。 1つはUpdateを使用し、もう1つはIEnumeratorを使用しています。私はUpdate関数がすべてのフレームと呼ばれることを知っています。 私の質問:IEnumeratorとも呼ばれます。'yield WaitForSeconds'を持つすべてのフレームで 'IEnumerator'が呼び出されます

注:yield WaitForSecondsで、yield WaitForEndOfFrameまたはyield nullではありません。

更新機能(例1):

//_ratePerSecond is how often the functions must execute 
void Update() 
{ 
    if ((CurrentPoints >= MinPoints) && Time.time >= _timeToChangeValue) 
    { 
     _timeToChangeValue = Time.time + _ratePerSecond; 
     CurrentPoints += 1 
    } 
} 

のIEnumerator関数(実施例2):

//this is called with StartCoroutine(ChangeValue()); 
IEnumerator ChangeValue() 
{ 
    while (true) 
    { 
     yield return new WaitForSeconds(_ratePerSecond); 

     if (CurrentPoints >= MinPoints) 
     { 
      CurrentPoints += 1; 
     } 
    } 
} 

を更新:以下

行わ性能試験であります試験で10000個のオブジェクトが機能しているple 1 & 2.赤で強調表示されているのはUpdateです(例1)、緑色で強調表示されているのはIEnumeratorです(例2)。性能試験から enter image description here

結論:Update関数が小さい1~2秒のランダム遅延を使用 enter image description here

:ランダム0-1秒の遅延を用い

効率的。 IEnumeratorは、遅延が大きい場合にはさらに優れたパフォーマンスを示します。

+0

あなたは' ChangeValue'を実行すると、この関数を呼び出す必要があり、その後、関数は秒のカップルが待って、だからここでそれはそれのすべてを呼ぶだろう

IEnumerator ChangeValue() { while (true) { if ((CurrentPoints >= MinPoints) && Time.time >= _timeToChangeValue) { _timeToChangeValue = Time.time + _ratePerSecond; CurrentPoints += 1; } //Wait for a frame yield return null; } } 

注意フレーム? – FCin

+0

エンジンがすべてのフレームで列挙子を呼び出すかどうかわかりません。だから、私が求めているのは、ユニティエンジンがIEnumeratorの実行を一時停止し、「このフレームのために完了しました」と言って、次のフレームで中断した場所をピックアップします(すべての状態情報が前のフレーム) – Antony

答えて

1

IEnumeratorはすべてのフレームとも呼ばれますか?

質問のコルーチン関数を使用すると、答えはNoです。

WaitForSeconds機能はISはそれがwhileループ内のコードを実行します指定(_ratePerSecond)秒間待って終了するまで、ChangeValue()機能を一時停止し、再びwhileループの最初に戻ってジャンプし、自分自身を一時停止します再び(_ratePerSecond)秒間。これは、ループがwhileループで呼び出され、StopCoroutine/StopAllCoroutinesまたはyield breakで停止するまで繰り返されます。

以下は、Update機能のコードのコルーチンバージョンです。あなたは `StartCourtine`を使用してStartCoroutine(ChangeValue());ないChangeValue();

+0

'IEnumerator'はもっと使いやすいですか?コンテキスト切り替え( 'スレッド'の停止/開始)とすべてのフレームで実行される 'Update'関数を考慮してください。 – Antony

+0

何かを何か順番にする必要がある場合は、' IEnumerator'を使用します。たとえば、AからBに移動します。3秒間待機します。 BからAへ移動します。そして、すべてのフレームに対して実行される 'Update'関数で行う必要がないので、操作の停止/開始には絶対に使用する必要があります。 – Programmer

関連する問題