Tienes que pensar, ¿cuáles son los beneficios reales de los hilos? Recuerde que en una máquina de núcleo único, los hilos no permiten la ejecución simultánea, solo la impresión de ello. Detrás de escena, la CPU está cambiando de contexto entre los diferentes hilos, haciendo un poco de trabajo en cada uno cada vez. Por lo tanto, si tengo varias tareas que no implican esperar, ejecutarlas al mismo tiempo (en un solo núcleo) no será más rápido que ejecutarlas de forma lineal. De hecho, será más lento, debido a la sobrecarga adicional de la frecuente conmutación de contexto.
Si ese es el caso, entonces, ¿por qué utilizar hilos en una sola máquina central? Bueno, en primer lugar, porque a veces las tareas pueden implicar largos períodos de espera en algún recurso externo, como un disco u otro dispositivo de hardware, para estar disponibles. Mientras que la tarea está en una etapa de espera, el enhebrado permite que otras tareas continúen, utilizando así el tiempo de la CPU más eficiente.
En segundo lugar, las tareas pueden tener un plazo de algún tipo para completar, especialmente si responden a un evento. El ejemplo clásico es la interfaz de usuario de una aplicación. La computadora debe responder a los eventos de acción del usuario lo más rápido posible, incluso si está ocupado realizando alguna otra tarea de larga ejecución, de lo contrario, el usuario se agitará y puede creer que la aplicación se ha bloqueado. Enhebrar permite que esto suceda.
En cuanto a los juegos, no soy un programador de juegos, pero mi comprensión de la situación es la siguiente: los juegos en 3D crean un modelo programático del mundo del juego; jugadores, enemigos, objetos, terreno, etc. Este mundo del juego se actualiza en pasos discretos, según la cantidad de tiempo transcurrida desde la actualización anterior. Entonces, si 1ms ha pasado desde la última vez en el ciclo del juego, la posición de un objeto se actualiza usando su velocidad y el tiempo transcurrido para determinar el delta (obviamente la física es un poco más complicada que eso, pero obtienes la idea). Otros factores como la IA y las claves de entrada también pueden contribuir a la actualización. Cuando todo está terminado, el mundo del juego actualizado se representa como un nuevo marco y el proceso comienza de nuevo. Este proceso generalmente ocurre muchas veces por segundo.
Cuando pensamos en el ciclo del juego de esta manera, podemos ver que el motor está logrando un objetivo muy similar al del enhebrado. Tiene una serie de tareas de larga ejecución (actualización de la física mundial, manejo de la entrada del usuario, etc.), y da la impresión de que están sucediendo al mismo tiempo dividiéndolas en pequeños pedazos de trabajo e intercalando estas piezas, pero en lugar de confiar en la CPU o el sistema operativo para administrar el tiempo dedicado a cada uno, lo está haciendo él mismo. Esto significa que puede mantener todas las diferentes tareas sincronizadas correctamente y evitar las complejidades que conlleva el enhebrado real: bloqueos, prioridad, reentrada, etc. No hay implicancia en el rendimiento de este enfoque tampoco, porque como dijimos La máquina de un solo núcleo realmente solo puede ejecutar código linealmente de todos modos.
Las cosas cambian cuando tienen un sistema multi-core. Ahora, las tareas pueden ejecutarse de manera genuina concurrente y puede haber un beneficio en el uso del subprocesamiento para manejar diferentes partes de las actualizaciones del mundo del juego, siempre que podamos sincronizar los resultados para generar marcos consistentes. Por lo tanto, esperaríamos que con el advenimiento de los sistemas multi-core, los desarrolladores de motores de juegos estarían trabajando en esto. Y así resulta, lo son. Valve, los creadores de Half Life, han introducido recientemente el soporte de múltiples procesadores en su Source Engine, y me imagino que muchos otros desarrolladores de motores están siguiendo su ejemplo.
Bueno, eso resultó un poco más de lo que esperaba. No soy un experto en juegos de rosca o juegos, pero espero no haber cometido ningún error especialmente evidente.Si lo tengo, estoy seguro de que la gente me va a corregir :)
Paralelismo es difícil. No solo "wow, esto es complicado", sino "teóricamente, muchos problemas no son paralelizables". –