Est coroutine un nouveau thread dans Unity3D?
Je suis confus et curieux de savoir comment coroutines (dans Unity3D et peut-être d'autres endroits). Est coroutine un nouveau thread? L'unité de la documentation ils ont dit:
Une coroutine est une fonction qui permet de suspendre son exécution (le rendement) jusqu'à ce que le YieldInstruction finitions.
Et ils ont C# exemples ici:
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void Start() {
print("Starting " + Time.time);
StartCoroutine(WaitAndPrint(2.0F));
print("Before WaitAndPrint Finishes " + Time.time);
}
IEnumerator WaitAndPrint(float waitTime) {
yield return new WaitForSeconds(waitTime);
print("WaitAndPrint " + Time.time);
}
}
J'ai beaucoup de questions à propos de cet exemple:
-
Dans l'exemple ci-dessus, qui est la coroutine? Est
WaitAndPrint()
une coroutine? EstWaitForSeconds()
une coroutine? -
Dans cette ligne:
yield return new WaitForSeconds(waitTime);
, pourquoi les deuxyield
etreturn
sont présents? J'ai lu dans L'unité de documentation que "L'instruction rendement est un type spécial de retour, qui assure que la fonction va continuer à partir de la ligne après l'instruction rendement prochaine fois qu'il est appelé." Siyield
est un spécialreturn
, qu'est-ce quereturn
fais ici? -
Pourquoi devons-nous retourner un
IEnumerator
? -
Ne
StartCoroutine
démarrer un nouveau thread? -
Combien de fois a
WaitAndPrint()
été appelé dans l'exemple ci-dessus? Neyield return new WaitForSeconds(waitTime);
vraiment de retour? Si oui, alors je suppose queWaitAndPrint()
a été appelé à deux reprises dans le code ci-dessus. Et je suppose queStartCoroutine()
appelaitWaitAndPrint()
plusieurs fois. Cependant, j'ai vu une autre Unité de la documentation qui dit: "L'exécution d'une coroutine peut être interrompue à tout moment à l'aide de l'instruction rendement. Le rendement de la valeur de retour indique quand la coroutine est la reprise." Ces mots me font sentir queWaitAndPrint()
en réalité n'a pas retourné; il s'agissait simplement d'une pause; il a été en attente pourWaitForSeconds()
de retour. Si c'est le cas, dans le code ci-dessusWaitAndPrint()
a été appelé qu'une seule fois, etStartCoroutine
était seulement responsable pour le démarrage de la fonction, non pas de l'appeler plusieurs fois.
Je tombe sur ce tuto unitygeek.com/coroutines-in-unity3d/,It explique très bien au sujet de l'utilisation de coroutines dans unity3d
OriginalL'auteur CherryQu | 2013-06-06
Vous devez vous connecter pour publier un commentaire.
Coroutines sont une technique extrêmement puissante utilisé pour émuler les types de fonctionnalités prises en charge par l'async/await .net4.5, mais dans les versions antérieures ( c# >= v2.0 ) .
Microsoft CCR (lire) emploie également (salariés?) cette approche.
Nous allons faire une chose hors de la voie.
yield
seul n'est pas valide et est toujours suivi parreturn
oubreak
.Penser à une norme IEnumerator (qui ne donne pas de flux de messages de contrôle).
Maintenant:
Quel est le résultat?
Notez comment, la deuxième fois que nous avons appelé
MoveNext
, avant de l'agent Recenseur a donné "le monde" du code a couru à l'intérieur de l'agent Recenseur. Ce que cela signifie est que, dans l'Énumérateur, nous pouvons écrire le code qui s'exécute jusqu'à ce qu'il frappe uneyield return
déclaration, puis il suffit de s'interrompt jusqu'à ce que quelqu'un appelleMoveNext
(idéalement avec tous les/les variables parfaitement capturé, afin que nous puissions reprendre là où nous nous sommes quittés). Après unMoveNext
appel, le bit suivant de code après leyield return
instruction peut courir jusqu'à l'autreyield return
est atteint. Nous pouvons donc contrôler l'exécution du code entre lesyield return
déclarations avec lesMoveNext
appel à l'agent Recenseur.Maintenant, dire au lieu de céder à cordes, notre agent Recenseur donnent un message qui dit à l'appelant de
MoveNext
, "s'il vous plaît traîner pour x (waitTime) secondes avant d'appelerMoveNext
nouveau". L'appelant est écrit à "comprendre" une variété de messages. Ces messages seront toujours le long de la lignes de "s'il vous plaît attendre pour tels et tels pour arriver avant l'appel deMoveNext
nouveau".Maintenant, nous avons un puissant moyen d'arrêter et de redémarrer le code qui exige d'autres conditions à remplir avant de procéder, sans avoir à écrire cette fonctionnalité dans une autre méthode, comme faire async des trucs sans coroutines. Sans coroutines, vous êtes forces de passer autour d'un horrible état asynchrone objets que vous devrez assembler manuellement à l'état de capture entre la fin d'une méthode et le départ de l'autre après quelques async genre de trucs). Coroutines éliminer ce parce que la portée est préservée (par le compilateur de la magie), de sorte que vos variables locales persistent plus longtemps vécu async choses.
StartCoroutine
commence simplement l'ensemble du processus. Il appelleMoveNext
sur l'Énumérateur... un peu de code s'exécute dans l'Énumérateur... L'agent recenseur donne un message de contrôle, qui en informe le code dansStartCoroutine
quand appelerMoveNext
de nouveau. Cela ne doit pas arriver dans un nouveau Thread, mais peut être pratique dans multithread scénarios parce que nous pouvons appelerMoveNext
de différents threads et de contrôle où est effectué le travail.OriginalL'auteur spender