以下の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)。性能試験から
:ランダム0-1秒の遅延を用い
効率的。 IEnumerator
は、遅延が大きい場合にはさらに優れたパフォーマンスを示します。
あなたは' ChangeValue'を実行すると、この関数を呼び出す必要があり、その後、関数は秒のカップルが待って、だからここでそれはそれのすべてを呼ぶだろう
注意フレーム? – FCin
エンジンがすべてのフレームで列挙子を呼び出すかどうかわかりません。だから、私が求めているのは、ユニティエンジンがIEnumeratorの実行を一時停止し、「このフレームのために完了しました」と言って、次のフレームで中断した場所をピックアップします(すべての状態情報が前のフレーム) – Antony