Hace un tiempo alrededor de año y medio tenía la idea de que las #corrutinas era usar otro hilo dentro del procesador para hacer cálculos, hasta que alguien en uno de los grupos de facebook, mostrando pruebas desde su programa de visual studio. En ese momento creí difícil aceptarlo, el caso es que hasta hace poco se presentó una nueva discusión en facebook hace una semana más o menos y descubrí que en general los latinoamericanos aún estamos confundidos con los términos de corrutinas y el uso de #hilos dentro del procesador, así que hay que separar que son estos dos conceptos:
Hilos o Threads.
Los threads o hilos no es un concepto, es un hecho físico, por cada núcleo del procesador hay 2 threads y esto lo único que hace es que uses parte de un núcleo para hacer cálculos independientemente del hilo principal.
No todos los lenguajes están orientados a usar múltiples hilos, este es más bien un enfoque que adoptó los lenguajes .NET, desde el hilo principal donde se despachan las diferentes #tareas a los otros núcleos compartiendo entre ellos variables y espacios de memoria, al final recoger los resultados y sincronizarlos con el hilo principal, esta parte del proceso puede suponer una caída del rendimiento.
Corrutinas
Las corrutinas si es un concepto o paradigma de la concurrencia y el paralelismo, en resumen la concurrencia es la ejecución de una tarea tras otra, pausando de forma intermitente entre una tarea y otra.
El paralelismo, es la ejecución de varias tareas simultáneamente, una corrutina es un conjunto de switches que se activan o se desactivan durante la ejecución de piezas de código en pro de la velocidad de ejecución.
Corrutinas, Hilos y Unity
Sabiendo las diferencias queda preguntarse cuando beneficia el uso de una u otra, un hecho es que unity aún tiene defectos en la ejecución de su API y ellos lo saben, por lo que es natural que se hable poco del tema del uso de hilos en el procesador, pero eso no quiere decir que no sea posible hacer uso de estos, solo que estamos algo limitados, por eso se tiende hacer énfasis en el uso de corrutinas.
Hacer uso de hilos tiene sus pros y sus contras, haciendo que sean un poco más las contras que los programadores no queremos enfrentar, la ventaja evidente es que tienes todo un núcleo entero y libre para hacer tus cálculos sin intervención del sistema operativo pudiendo ejecutar tareas complejas sin que se sienta picos o lag en tu juego.
Los contras vendrían siendo que el uso de hilos requiere más memoria ya que se hacen duplicados de las variables y espacios de memoria en todos los hilos restantes, tienes que hacer una buena gestión del uso de la ram, aparte que cada hilo hace uso de 1 mb mas o menos de memoria destinado para la sincronización que haría el kernel.
La sincronización de los hilos es costosa en rendimiento por lo que generalmente se destinan tareas que corran asincrónicamente, así que los usos más comunes que se le da son los siguientes:
IA
Pathfinding A*
Generación procedural de mallas que se crean en la lejanía
carga de archivos
comunicaciones de red
Creo que la desventaja más grave es que el uso de hilos es peligroso para tu aplicación, porque de ejecutarse mal, te dará crasheos que no te dejarán ni aviso o advertencias que puedas corregir, lo que nos deja a los programadores dándole golpes a una piñata después de haber bebido y haber girado sobre sí mismos unas 3 vueltas, afortunadamente hay algunas librerías que pueden ayudar a minimizar el riesgo.
Hay gente que cree que las corrutinas son poco eficientes, promoviendo una falacia, lo cierto es que si tiene ciertas observaciones antes de pensar en utilizarlas.
Si tienes copado todo el procesamiento del núcleo es obvio que las corrutinas se verán afectadas.
Los cálculos que hagas dentro de una corrutina no pueden ser muy grandes, porque también afectarán todo el rendimiento del núcleo.
La gran ventaja que tiene es que
Tiene soporte por la API de unity.
Tienes advertencias en el compilador.
Tu juego nunca crasheara o cerrará sin aviso.
además puedes hacer entre 50 y 80 corrutinas simultáneas apenas sufriendo algo de sobrecosto.
No genera duplicación de variables o espacios de memoria sobre otros núcleos
tampoco un uso de memoria adicional por núcleo.
La única desventaja es que los cálculos que hagas no deben ser muy grandes y deben ser de forma asincrónica, aquí es el lugar correcto para colocar las actualizaciones de pantalla, puntajes, estadísticas, cargar escenas asincrónicamente, #assetbundles, envíos y recepción de datos del servidor o todo aquello que sea meramente decorativo que no sea crucial para el desempeño del juego.
Conclusión.
Los hilos no son una panacea pero tampoco son el diablo, aún el uso de estas se encuentra cruda en el mundo de los videojuegos.
Las #corrutinas no son lentas ni rápidas, solo es una manera eficiente de distribuir las tareas.
Aquel que se dice ser programador y rechaza la idea del uso de corrutinas es uno mas del montón que repite como loro lo que se va diciendo por ahí.
Comentários