En promedio, ¿con qué frecuencia se usa el ensamblaje en el código del juego moderno?
Específicamente en plataformas que ya tienen buenos compiladores de C ++, como x86, PPC o ARM, porque supongo que los juegos en sistemas integrados hacen un uso extensivo del ensamblaje.
Respuestas:
La respuesta depende un poco de lo que quiere decir con "juego" y de "usado". Asumiré que "usado" significa "escrito durante el curso del proyecto de juego específico".
En mi experiencia y datos anecdóticos de personas con las que he hablado:
El conocimiento del lenguaje ensamblador no se espera para el trabajo en la industria de los juegos, pero dependiendo del tipo de juegos que realice, puede ser ventajoso.
Solía haber un argumento de que el compilador hace un mejor trabajo para optimizar el código C que un humano con un ensamblaje escrito a mano. Por lo general, eso es cierto, a veces es falso. Pero en estos días, una combinación de la creciente complejidad de la CPU y la necesidad de escalar gradualmente (es decir, separar los procesadores) significa que los esfuerzos de optimización generalmente se gastan en otros lugares.
En los últimos años, la única vez que he visto el ensamblaje en el código del juego fue en
__asm int 3
declaraciones para forzar puntos de interrupción, y mi único uso personal del ensamblaje fue mirar el desmontaje de una función para diagnosticar errores de bloqueo inusuales.fuente
La mayor parte del código de alto rendimiento en los juegos de consola modernos se escribe utilizando una especie de punto medio entre el ensamblaje y C ++: intrínsecos del compilador . Estas construcciones se ven y analizan como funciones de C ++, pero en realidad se traducen en instrucciones de máquina única . Entonces, por ejemplo, mi "sujetar cada valor del vector V para que sea> = a y <= b" se ve como
En funciones como estas, sigo pensando en términos de las instrucciones específicas de la máquina. , pero tengo la conveniencia de escribirlas en C para no tener que preocuparme por registrar el color y la programación, cargar operaciones y otros detalles aburridos.
Todavía necesita saber qué instrucciones admite la CPU, especialmente porque los compiladores modernos son terribles para vectorizar código, en comparación con lo bien que un humano inteligente puede hacer el trabajo. También, a veces, los detalles sutiles de cómo organizar su código pueden tener enormes implicaciones para el rendimiento que no son obvias sin comprender lo que está haciendo la máquina.
Aunque es posible que no codifiquemos en el ensamblaje, todavía depuramos mucho en el ensamblado. La optimización de los compiladores reorganiza agresivamente el código de manera que los depuradores no puedan seguir el ritmo, por lo que a menudo, al depurar un "modo de lanzamiento", lo mejor es abrir el desensamblador y rastrear el código de esa manera. Esta charla de GDC sobre "Depuración forense" de bloqueos ilustra muchos de los por qué y cómo de la depuración a ese nivel.
fuente
Los problemas que solían requerir un ensamblaje laminado a mano son cada vez menos numerosos. Lo que "podría" ganar en velocidad lo pierde en legibilidad y la capacidad de depurar. También debe hacerse solo como uno de los últimos pasos de optimización en secciones de código, ya que en la mayoría de los casos los problemas de velocidad no son algo que no pueda mejorarse con el ensamblaje. En estos días, las CPU se han vuelto mucho más rápidas que las velocidades de memoria, a menudo es más importante controlar cómo fluyen los datos a través de la CPU que cualquier otra cosa.
Con los compiladores modernos también les resulta difícil optimizar el código de ensamblaje, ya que tienen que lidiar con los registros que haya tocado y, por lo general, no pueden volver a ordenar las instrucciones en su código creado a mano. Para reducir la necesidad de ensamblaje, ahora también hay intrínsecos que ayudan a obtener acceso a conceptos de bajo nivel, pero de una manera que es fácil de compilar y les permite trabajar con usted en lugar de en contra.
Dicho esto, la SPU en la PS3 es un área donde las personas todavía tienen que usar el ensamblaje para aprovechar al máximo el procesador, con instrucciones manuales, por ejemplo, como se explica aquí .
fuente
El hecho es que vivimos en un mundo multiplataforma, y algunas partes de nuestro código de juego deben adaptarse a la plataforma local; bueno, no es necesario, ¡pero hay beneficios si aprovechamos el hardware local!
No se trata de juegos o lógica de juegos, se trata de la ubicación del hardware para un rendimiento óptimo del código sobre el que depende la lógica del juego, de hecho podemos envolver secciones de código, por ejemplo, usando macros, de modo que haya un código fuente, que se ejecute bien en el plataforma contra la que fue construida.
fuente