Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Unitysocketio necesita utilizar subprocesos múltiples en unity3d?

¿Unitysocketio necesita utilizar subprocesos múltiples en unity3d?

Multiproceso en Unity3D. El subprocesamiento es un tema bastante complejo, pero si lo domina, puede trabajar fácilmente con múltiples procesadores de hardware o trabajar con fragmentos de datos que son difíciles de dividir y administrar.

Por ejemplo, cuando se utiliza el algoritmo A* en la escena para realizar cálculos de datos a gran escala, realizar operaciones de vértices a gran escala en mallas deformadas, ejecutar continuamente para cargar datos al servidor, realizar reconocimiento de códigos QR y otro procesamiento de imágenes, si desea hacer muchas cosas al mismo tiempo o interactuar con los objetos pequeños de Unity, puede usar subprocesos; de lo contrario, debe usar rutinas.

Los subprocesos se ejecutan simultáneamente con otros subprocesos cuando el programa se está ejecutando. La verdadera sincronización de múltiples subprocesos es posible en una computadora multiprocesador, y más subprocesos dependen de tener múltiples núcleos de procesamiento.

Al programar Unity3D, siempre hay un hilo principal ejecutando su código, y también puede crear hilos adicionales para ejecutar simultáneamente con el hilo principal. En Unity, por otro lado, solo puede acceder a los componentes, objetos y llamadas al sistema de Unity3D desde el hilo principal. Cualquier segundo hilo que intente acceder a estos elementos generará un error, lo cual es una limitación que vale la pena tomar en serio.

Entonces cuando escribes código piensas que una función comienza y llega al punto de ejecutarse y regresar y lo mismo que haces se ejecuta en otra función sin el cambio correspondiente. El sistema operativo determina la ejecución de su código y, en un momento dado, su código sólo puede "dormir" durante un cierto período de tiempo antes de que comience a ejecutarse otro código.

Subprocesos múltiples y uso de subprocesos múltiples en Unity3D

En este ejemplo, después de que el primer subproceso carga el valor de A en el registro de la CPU y prepara 1, se interrumpe y Los dos subprocesos entran y leen el valor de A, luego le restan 1000, por lo que A debería ser -950. Ahora, el primer hilo se reinicia y almacena el resultado de 50 1 en su registro en A, que se convierte en 51, -950. A se convierte en 51 y se elimina -950.

Básicamente, cuando se utilizan varios subprocesos para acceder a variables o memoria simultáneamente, se deben tomar muchas precauciones para garantizar que esto no suceda. Por lo tanto, para evitar problemas con todos los objetos del sistema y del marco, Unity ha decidido que no es válido acceder a estas variables o memoria desde otro hilo. Así que asegúrese de que solo un hilo modifique la variable a la vez, pero eso no significa que no pueda usar varios hilos, puede usar "ordenar" para resolver este problema.

C# tiene una palabra clave lock que garantiza que solo un hilo pueda acceder a un objeto específico en un momento específico, y aquí estamos hablando de objetos porque. Esta regla se dirige a valores de tipo (tipos de valor) o prototipos (primitivos).

int a = 50

protección de objeto = nuevo objeto();

void ThreadOneCode()

{

//algo de código aquí

bloqueo(guardia)

{

a = a 1;

}

// Parte del resto del código está aquí

}

void ThreadTwoCode()

{

/ / Parte del código está aquí This

lock(guard)

{

a = a - 1000;

}

Copiar código

Todo está bloqueado dentro de la guardia, lo que garantiza que solo un hilo pueda acceder a él a través de la guardia a la vez, y que usted pueda usar cualquier objeto apropiado. Ahora, puede encontrar varios problemas, como que necesita bloquear más de un objeto y es posible que estén anidados entre sí.

Entonces, ¿qué debemos hacer?

Nuestra clase llamada Loom le permite ejecutar código fácilmente en otro hilo. Aquí hay dos funciones a tener en cuenta:

RunAsync(Acción): un conjunto de código que se ejecuta en otro hilo.

QueueOnMainThread(Acción, [opcional] tiempo de flotación): declaración que se ejecutará en el hilo principal (retraso opcional).

Utilice Loom.Current para acceder a Loom: cree un GameObject invisible para manejar las interacciones en el hilo principal del juego. El siguiente ejemplo utiliza Loom para actualizar el resultado de la multiplicación de todos los vértices de la malla.

// Escalar la grilla en el segundo hilo

Copiar código