Maison >développement back-end >C++ >Comment appeler en toute sécurité les fonctions de l'API Unity à partir de threads non principaux?

Comment appeler en toute sécurité les fonctions de l'API Unity à partir de threads non principaux?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-31 12:01:09160parcourir

How to Safely Call Unity API Functions from Non-Main Threads?

Utilisez une API Unity à partir d'autres threads ou des fonctions d'appel dans le thread principal

Question

Dans un thread séparé, l'utilisation de l'API de socket d'Unity peut entraîner des erreurs, en particulier lors de la mise à jour de l'élément d'interface utilisateur du sous-thread. En raison de problèmes de sécurité des threads, les appels de l'API Unity effectués à partir de threads non principaux déclencheront des anomalies.

Solution

Appelez l'unité API

Implémentez les étapes suivantes:

Créez un statique

appelé

pour stocker l'opération qui doit être effectuée dans le thread principal.
  1. Copier à la liste locale (actionQueuesUpdateFunc) et effectuer ces opérations. List<Action>
  2. Créez une valeur booléenne de perte -loss (
  3. ) pour indiquer lorsque la fonction est utilisée pour s'exécuter lorsque la fonction est opérée. actionQueuesUpdateFunc actionCopiedQueueUpdateFunc
  4. Appelez la fonction du thread principal
  5. noActionQueueToExecuteUpdateFunc Update La fonction pour appeler la fonction à partir d'un thread séparé:

ou, passez la fonction comme un paramètre:

Corporation opérationnelle dans le thread principal

<code class="language-csharp">UnityThread.executeInUpdate(() =>
{
    // 在主线程中执行的代码
});</code>
pour la coroutine:

comment utiliser
<code class="language-csharp">Action rot = Rotate;
UnityThread.executeInUpdate(rot);

void Rotate()
{
    // 函数代码
}</code>

Initialiser dans :

<code class="language-csharp">UnityThread.executeCoroutine(myCoroutine());

IEnumerator myCoroutine()
{
    // 协程代码
}</code>
Exécutez le code dans :

  1. Awake() Effectuer dans : UnityThread
<code class="language-csharp">UnityThread.initUnityThread();</code>
    Exécutez le code dans :
  1. Update
<code class="language-csharp">UnityThread.executeInUpdate(() =>
{
    // Update 代码
});</code>
Exécutez le code dans :
  1. Update
Démarrer la coroutine:
<code class="language-csharp">Action rot = Rotate;
UnityThread.executeInUpdate(rot);

void Rotate()
{
    // 方法代码
}</code>
  1. LateUpdate Description supplémentaire
Afin d'améliorer les performances, si ce n'est pas nécessaire, veuillez commenter
<code class="language-csharp">UnityThread.executeInLateUpdate(() =>
{
    // LateUpdate 代码
});</code>
et
    .
  1. FixedUpdate Cette solution utilise une seule instance
  2. pour tous les scripts.
<code class="language-csharp">UnityThread.executeInFixedUpdate(() =>
{
    // FixedUpdate 代码
});</code>

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn