2015-10-22 4 views
1

Я сравниваю StartCoroutine и Invoke в методе, который должен выполняться в определенное время. Насколько я понимаю, эти две функции должны занимать одно и то же время (1 сек). Вызов первого метода с вызовом завершается примерно за 1 сек., Используя сопрограмму занимает почти 2 секунды! Как это может быть?Накладные расходы StartCoroutine vs Invoke (Unity3D)

private void iincrease_arrow_invoked(){ 
    if (arrow.transform.localScale.x <= 1f) { 
     arrow.transform.localScale = new Vector3 (arrow.transform.localScale.x + 0.01f, arrow.transform.localScale.y, arrow.transform.localScale.z); 
     Invoke ("iincrease_arrow_invoked", 0.01f); 
    } 

} 

IEnumerator increase_arrow_coroutine(){ 

    yield return new WaitForSeconds (0.01f); 
    if (arrow.transform.localScale.x <= 1f) { 
     arrow.transform.localScale = new Vector3 (arrow.transform.localScale.x + 0.01f, arrow.transform.localScale.y, arrow.transform.localScale.z); 
     StartCoroutine (increase_arrow_coroutine()); 
    } 

} 
+1

Вы пытались использовать, например, цикл while вместо рекурсии в сопрограмме? –

+0

Не должен ли 'yield возвращать новые WaitForSeconds (0.01f);' строка находится в конце сопрограммы? Я не знаю, будет ли это иметь значение –

+1

с использованием цикла while для меня требуется 2 секунды. , уступая в конце, продолжает вызывать сопрограмму, а затем ждет, так что в основном он мгновенно выполняет масштабирование. – Johannes

ответ

1

The IEnumerator, скорее всего, работает более чем один раз, в то время как вызывается функция работает только один раз. В вашем коде вы можете запускать IEnumerator несколько раз, также вызывая StartCoroutine внутри IEnumerator.

Сравнивая InvokeRepeating с существующим IEnumerator, было бы более чистое сравнение.

+0

Я все же считаю странным, что использование второго метода использует гораздо больше времени и даже использование цикла while со вторым методом занимает намного больше времени. – Johannes

+0

Это характер сопрограммы в Единстве; его внутренняя обработка и накладные расходы неизвестны, но есть дополнительные накладные расходы. – user3071284

0

Ну, технически это совсем другое, так как вы ждёте полную секунду, прежде чем что-либо делать в сопрограмме, а затем вы это сделаете, и когда она снова выполняет себя там, вы ждете еще одну секунду. Вызов Invoke выполняется сразу же после того, как вы не поместили задержку на то, что в сопрограмме, а затем попросите его подождать 1 секунду и повторить. Если вы хотите, чтобы coroutine вел себя одинаково, тогда пропишите его то же самое и положите задержку в конце.

Диаграмма поможет: StartCoroutine - >>> wait 1 second - >>> do work - >>> wait 1 second, если повторить.

То, что вы хотите это: StartCoroutine - >>> сделать работу - >>> ждать 1 второе - >>> сделать работу при повторении

Это только появляется, чтобы принимать 2 секунд так, как у вас есть.

Это больше, чем это должно выглядеть еще до начала их сравнить:

WaitForSeconds delay = new WaitForSeconds(0.01f); 

IEnumerator increase_arrow_coroutine() { 
    if(arrow.transform.localScale.x <= 1.0f) { 
     arrow.transform.localScale = new Vector3(
      arrow.transform.localScale.x + 0.01f, 
      arrow.transform.localScale.y, 
      arrow.transform.localScale.z); 
    } 

    yield return delay; 

    StartCoroutine(increase_arrow_coroutine()); 
} 

Для меня это до сих пор не имеет особого смысла, что он принимает, что долго для вас, если у вас нет других задержек в другом месте , Это займет всего 0,01 секунды, но это уже другая история.

 Смежные вопросы

  • Нет связанных вопросов^_^