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
Libérer: 2025-01-31 12:01:09
original
158 Les gens l'ont consulté

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>
Copier après la connexion
pour la coroutine:

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

void Rotate()
{
    // 函数代码
}</code>
Copier après la connexion

Initialiser dans :

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

IEnumerator myCoroutine()
{
    // 协程代码
}</code>
Copier après la connexion
Exécutez le code dans :

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

void Rotate()
{
    // 方法代码
}</code>
Copier après la connexion
  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>
Copier après la connexion
et
    .
  1. FixedUpdate Cette solution utilise une seule instance
  2. pour tous les scripts.
<code class="language-csharp">UnityThread.executeInFixedUpdate(() =>
{
    // FixedUpdate 代码
});</code>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal