Cómo volver rápidamente al hilo principal para ejecutar un método

Previamente en el proyecto Unity, Loom se usó como una herramienta para volver al hilo principal.

El principio de Loom es realmente muy inteligente, que consiste en utilizar el método de actualización de Unity para ejecutar el delegado que debe llamarse en el hilo principal.

¿Por qué necesita operar en Update? Porque Update se inicia con el hilo principal de Unity Call, por lo que la comisión ejecutada en Update también debe ejecutarse en el hilo principal, pero debe bloquear _queue antes de ejecutarse para evitar que otros hilos accedan.

Pero debido a que se ejecuta en Update, cuando se ejecuta el método RunOnMainThread de Loom, todavía hay un cierto retraso (aunque se puede ignorar), entonces, ¿hay una forma más directa?

Vi SynchronizationContext en otros blogs antes, es decir, contexto de subprocesos, que permite insertar un método en un subproceso específico para ejecutarlo inmediatamente en el subproceso especificado.

Entonces, si el subproceso especificado es el subproceso principal, ¿se puede insertar un método directamente en el subproceso principal para ejecutarlo? Ahora que tienes una idea, puedes hacerlo. Primero nombre esta herramienta, llamada temporalmente MainThreadManager. Necesitamos asegurarnos de que el contexto del subproceso obtenido debe ser el subproceso principal. Generalmente, cuando se crea el administrador central en Unity, MainThreadManager se puede inicializar para obtener el contexto del subproceso principal.

public class MainThreadManager
{
    // 单例模式
    public static MainThreadManager Instance
    {
        get
        {
            return _instance;
        }
    }

    private static MainThreadManager _instance;

    static MainThreadManager()
    {
        _instance = new MainThreadManager();
    }

    // 指定线程的上下文,目前用于主线程
    private SynchronizationContext m_mainThreadContext = null;

    // 初始化这个管理器,使其获得当前线程的上下文
    public void Init()
    {
        m_mainThreadContext = SynchronizationContext.Current;
    }

    // 在主线程中插入一个方法
    public void RunOnMainThread(Action runOnMain)
    {
        m_mainThreadContext.Send(new SendOrPostCallback((needless)=>
        {
            runOnMain?.Invoke();
        }), null);
    }
}

En este punto, el prototipo está completo. Entonces podemos practicarlo.

Este es un script de prueba, si modificamos directamente el sprite de la Imagen en el hilo hijo, se debe lanzar una excepción.

Luego, si usa este administrador para ejecutar, es decir, la parte comentada para cambiar el hilo principal, el sprite de la Imagen se reemplazará normalmente.

Esto es solo una idea, y se pueden hacer más expansiones basadas en esta herramienta para lograr más efectos. En la actualidad, es resumir las habilidades aprendidas primero y luego aprender más sobre el aprendizaje más tarde.

===========Advertencia=============

Recientemente, se ha encontrado que este método de acceso iterativo traerá ciertos problemas de rendimiento, por lo que puede ser necesario estudiarlo más a fondo.

Supongo que te gusta

Origin blog.csdn.net/DoyoFish/article/details/106123689
Recomendado
Clasificación