Las GPU son muy buenas para tareas paralelas. Lo cual es genial ... si estás ejecutando tareas paralelas.
Los juegos son sobre el tipo de aplicación menos paralelizable. Piensa en el ciclo principal del juego. La IA (supongamos que el jugador se maneja como un caso especial de la IA) debe responder a las colisiones detectadas por la física. Por lo tanto, debe ejecutarse después. O al menos, la física necesita llamar a las rutinas de IA dentro de los límites del sistema de física (que generalmente no es una buena idea por muchas razones). Los gráficos no pueden ejecutarse hasta que la física se haya ejecutado, porque la física es lo que actualiza la posición de los objetos. Por supuesto, la IA también debe ejecutarse antes de renderizar, ya que la IA puede generar nuevos objetos. Los sonidos deben ejecutarse después de la IA y los controles del jugador
En general, los juegos pueden enhebrarse de muy pocas maneras. Los gráficos se pueden dividir en un hilo; el bucle del juego puede meter un montón de datos en el hilo de gráficos y decir: renderizar esto. Puede hacer una interpolación básica, de modo que el bucle principal del juego no tenga que estar sincronizado con los gráficos. El sonido es otro hilo; el bucle del juego dice "juega esto", y se juega.
Después de eso, todo comienza a ser doloroso. Si tiene algoritmos de ruta complejos (como los de RTS), puede enhebrarlos. Los algoritmos pueden tardar algunos marcos en completarse, pero al menos serán concurrentes. Más allá de eso, es bastante difícil.
Entonces estás viendo 4 hilos: juego, gráficos, sonido y posiblemente procesamiento de IA a largo plazo. Eso no es mucho. Y eso no es suficiente para las GPU, que pueden tener literalmente cientos de hilos en vuelo a la vez. Eso es lo que les da a las GPU su rendimiento: poder utilizar todos esos hilos a la vez. Y los juegos simplemente no pueden hacer eso.
Ahora, tal vez pueda ser "amplio" para algunas operaciones. Las IA, por ejemplo, suelen ser independientes entre sí. Por lo tanto, puede procesar varias docenas de IA a la vez. Justo hasta que realmente necesites hacerlos dependientes el uno del otro. Entonces estás en problemas. Los objetos de física son igualmente independientes ... a menos que haya una restricción entre ellos y / o choquen con algo. Entonces se vuelven muy dependientes.
Además, existe el hecho de que la GPU simplemente no tiene acceso a la entrada del usuario, que, según tengo entendido, es algo importante para los juegos. Entonces eso tendría que ser proporcionado. Tampoco tiene acceso directo a archivos ni ningún método real de hablar con el sistema operativo; así que de nuevo, tendría que haber algún tipo de forma de proporcionar esto. Ah, y todo ese procesamiento de sonido? Las GPU no emiten sonidos. Entonces esos tienen que volver a la CPU y luego al chip de sonido.
Ah, y la codificación de GPU es terrible. Es difícil acertar, y lo que es "correcto" para una arquitectura de GPU puede estar muy, muy mal para otra. Y eso no es solo cambiar de AMD a NVIDIA; eso podría cambiar de una GeForce 250 a una GeForce 450. Eso es un cambio en la arquitectura básica. Y fácilmente podría hacer que su código no se ejecute bien. C ++ e incluso C no están permitidos; lo mejor que obtienes es OpenCL, que es algo así como C pero sin algunas de las sutilezas. Como la recursividad . Así es: no hay recurrencia en las GPU.
Depuración? Oh, espero que no le gusten las funciones de depuración de su IDE, porque ciertamente no estarán disponibles. Incluso si está usando GDB, bese ese adiós. Tendrá que recurrir a la printf
depuración ... espere, no hay printf
GPU. Por lo tanto, tendrá que escribir en las ubicaciones de memoria y hacer que el programa de código auxiliar de su CPU las lea de nuevo.
Así es: depuración manual . Buena suerte con eso.
Además, ¿esas útiles bibliotecas que usa en C / C ++? O tal vez eres más un tipo .NET, usando XNA y demás. O lo que sea. No importa, ya que no puedes usar ninguno de ellos en la GPU. Debe codificar todo desde cero. Y si tiene una base de código ya existente, difícil: es hora de reescribir todo ese código.
Así que sí. Es horrible hacerlo para cualquier tipo de juego complejo. Y ni siquiera funcionaría, porque los juegos simplemente no son lo suficientemente paralelos como para ayudar.