Le défi:
La manipulation directe de l'API d'Unity (comme la mise à jour des éléments d'interface utilisateur) à partir d'un thread d'arrière-plan entraîne souvent des erreurs, telles que "GetComponentFastPath ne peut être appelé qu'à partir du fil principal". Cet article décrit une solution d'exécution en toute sécurité sur un thread secondaire tout en mettant à jour les composants d'unité.
La solution: file d'attente de filetage
L'API d'Unity n'est pas un thread-safe. Pour éviter les accidents, utilisez une file d'attente pour rassembler les opérations vers le thread principal.
La file d'attente: Créez une file d'attente en filetage (par exemple, A Queue<Action>
) pour stocker les actions destinées au thread principal. Action
Les délégués représentent le code à exécuter.
ENQUEIE DU FIL-FREE CONDUITE: À partir de votre thread secondaire, ajoutez des actions à la file d'attente. Utilisez une instruction lock
pour protéger la file d'attente des conditions de course.
Traitement de la file d'attente sur le thread principal: dans la méthode Update
de votre thread principal
C # CODE Exemple:
// Thread-safe queue private readonly Queue<Action> _actionQueue = new Queue<Action>(); // In your secondary thread: lock (_actionQueue) { _actionQueue.Enqueue(() => { // Code to update Unity API (e.g., textComponent.text = "Updated Text"); }); } // In your main thread's Update method: while (_actionQueue.Count > 0) { Action action; lock (_actionQueue) { action = _actionQueue.Dequeue(); } action.Invoke(); }
meilleures pratiques:
try-catch
Enveloppez vos actions dans Update
Pour les performances plus lisses, pensez à utiliser une coroutine pour traiter la file d'attente au lieu de tout faire dans En utilisant ce mécanisme de mise en file d'attente, vous pouvez effectuer efficacement les tâches d'arrière-plan et mettre à jour en toute sécurité l'interface utilisateur d'Unity et d'autres composants sans rencontrer de problèmes de sécurité threads.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!