XNA y C # frente a los 360 en el procesador de pedidos

14

Después de leer esta queja , creo que probablemente tengan razón (ya que Xenon y CELL BE son muy sensibles al código ignorante ramificado y de caché ), pero he oído que la gente también está haciendo juegos bien con C #.

Entonces, ¿es cierto que es imposible hacer algo profesional con XNA, o solo faltaba el póster lo que hace que XNA sea la API asesina para el desarrollo de juegos?

Por profesional, no me refiero en el sentido de que puedes ganar dinero con él, sino más bien en el sentido de que los juegos más profesionales tienen modelos físicos y sistemas de animación que parecen estar fuera del alcance de un idioma con barreras tan definidas para los intrínsecos. . Si quisiera escribir un sistema de colisión o un motor de dinámica de fluidos para mi juego, no creo que C # me ofrezca la oportunidad de hacerlo, ya que el generador de código de tiempo de ejecución y la falta de intrínsecos se interponen en el rendimiento.

Sin embargo, muchas personas parecen estar bien trabajando dentro de estas limitaciones, haciendo sus juegos exitosos pero aparentemente evitando cualquiera de los problemas por omisión. No he notado que ningún juego de XNA haga algo complejo que no sea lo que ya proporcionan las bibliotecas o los sombreadores. ¿Es esto evitar las dinámicas de juego más complejas debido a las limitaciones de C # , o simplemente a las personas que se concentran en hacerlo ?

Honestamente, no puedo creer que la guerra de IA pueda mantener tantas unidades de IA sin algún enfoque orientado a datos, o algunos trucos sucios de C # para que funcione mejor que el enfoque estándar, y supongo que esa es en parte mi pregunta también, cómo ¿la gente ha hackeado C # para que pueda hacer lo que los codificadores de juegos hacen naturalmente con C ++?

Richard Fabian
fuente
Despotricar de hecho. Al no encontrar NINGUNA información sobre el tipo y ver que es (¿es?) Una startup, me gustaría ver algún tipo de información palpable para respaldar esto ...
Jonathan Connell
Por razones que no entiendo completamente, los estudios no parecen admitir el uso de XNA. Sin embargo, hay muchos ejemplos aquí enlace
Tristan Warner-Smith
Bueno, la información obvia para respaldarlo es el hecho de que la CPU es bastante inherentemente mala en el código ramificado, que es C #. Lo que me gustaría saber es, ¿qué están haciendo los usuarios profesionales de XNA que significa que no alcanzan el límite flexible impuesto por C #?
Richard Fabian
3
no puedo entender el voto
negativo
3
Creo que muchas personas están rechazando la pregunta de Richard debido a los (numerosos) errores técnicos en su artículo vinculado, y algunos se burlan de la palabra "profesional" que significa "producción a nivel de Halo" en lugar de "hacer dinero". Esta última es una mala elección, pero no desestimes el voto solo porque no estás de acuerdo con el enlace; en su lugar, desacredítalo respondiendo.

Respuestas:

21

OK, solo para hacer algunos agujeros en esa diatriba que vinculaste:

  • "C # se basa en un intérprete" Just In Time "" - incorrecto - es un compilador JIT . Después de que un método se JIT una vez , el código compilado se reutiliza para cada invocación. El código compilado es casi tan rápido como el código nativo precompilado.
  • "La CPU Xenon es un procesador" en el lugar " : ¿quiere decir" en orden "? - Y: "La CPU Xenon no tiene predicción de rama" . Él implica que esto significa que la compilación JIT produce naturalmente código incorrecto que debe ser reordenado por la CPU y causa muchas ramificaciones, lo cual es una tontería absoluta . El mismo consejo de rendimiento para ejecutar en esta arquitectura de CPU se aplica tanto a C ++ como a C #.
  • "[JIT] requiere un enjuague constante en el 360" : incorrecto, el código compilado se puede guardar en caché como cualquier código compilado normalmente. (Si se refiere al lavado de la tubería, vea el punto anterior).
  • "los genéricos [...] usan la generación de código" : los genéricos son JITted como todo lo demás y, como todo lo demás, el código JITted es rápido. No hay penalización de rendimiento por usar genéricos.
  • "todas las partes sexys del lenguaje [...] requieren una predicción de rama ..." : ¿cómo no se aplica esto también a C ++? - "... o [...] generación de código in situ" - ¿quiere decir JITting? ¿Mencioné que es rápido? (No entraré en todos los lugares donde el CLR de escritorio usa la generación de código real , ¡una función que no es compatible con Xbox 360!)
  • "[C # no tiene] las bibliotecas masivas [de C ++]" , ¿excepto, por ejemplo, XNA? Y muchos más . (Aún así, este es un punto un tanto justo).

XNA en Xbox 360 se ejecuta en una versión modificada de .NET Compact Framework CLR. No tengo dudas de que no está a la altura de la versión de escritorio. El JITter probablemente no sea tan bueno, pero tampoco creo que sea malo . Me sorprende que no haya mencionado el recolector de basura que es terrible en comparación con el CLR de escritorio.

(Por supuesto , de todos modos no deberías golpear al recolector de basura en un juego desarrollado profesionalmente , así como debes tener cuidado con las asignaciones en cualquier juego de nivel profesional).

(Para una discusión técnica real de .NET Compact Framework, quizás comience con esta serie de artículos: Descripción general , Compilador JIT y GC y montón ).

La forma en que es completamente inespecífico sobre su terminología hace que sea difícil incluso entender lo que quiere decir. O está en modo de despotricar o no sabe de qué está hablando.


Ahora que lo hemos eliminado, aquí hay algunas cosas que puede hacer. se pierda en mediante el uso de XNA en el 360, en lugar de convertirse en nativo :

  • Acceso a la unidad SIMD / Vector para realizar cálculos de punto flotante de CPU muy, muy rápidos
  • Posibilidad de usar código de idioma nativo que probablemente sea un poco más rápido que C #
  • Habilidad para ser un poco más vago con la forma de asignar memoria
  • Los juegos XBLIG tienen acceso a solo 4 de los 6 núcleos (pero todavía obtenemos las 3 CPU, y tampoco son núcleos completos, por lo que no nos perdemos mucho), no estoy seguro de si esto se aplica a XNA no XBLIG juegos
  • Acceso completo a DirectX para hacer trucos gráficos realmente oscuros

También vale la pena señalar que estas son solo restricciones del lado de la CPU. Todavía tienes acceso completamente gratuito ejecutándose en la GPU.

Describí estas cosas en esta respuesta a lo que efectivamente es la misma pregunta que esta. Como mencioné en esa respuesta, XNA es absolutamente adecuado para el desarrollo "profesional" .

La única razón por la que evitaría es porque no puede contratar talento C #, licenciar motores C # y reutilizar el código C # existente de la misma manera que lo hace con la base existente de conocimiento de C ++. O porque también podría estar apuntando a una plataforma que no admite C #.

Por supuesto, para muchos de nosotros que no somos desarrolladores "profesionales", XNA es nuestra única opción para ingresar a Xbox 360, lo que hace que el punto sea discutible.


Para responder a sus otras preguntas:

Nada en C # le impide utilizar enfoques orientados a datos en esencia exactamente la misma forma en que se utilicen en C ++.

C # carece de la capacidad de alinear automáticamente el código en tiempo de compilación, y (sin ir a comprobarlo) estoy bastante seguro de que el JITter de CLR compacto no puede incluir métodos en línea (el CLR de escritorio sí puede). Entonces, para el código crítico para el rendimiento, es posible que tenga que insertarlo manualmente en C #, donde C ++ proporciona alguna ayuda.

Probablemente, una razón más importante por la que a menudo no se ven cosas intensivas en matemáticas de CPU como la detección de colisiones y las simulaciones de fluidos en C # es la falta de acceso a la unidad de vectores (como se mencionó anteriormente).

Andrew Russell
fuente
No me recuerdo, pero ¿C # no te impide iterar a través de matrices simples? Recuerdo algo acerca de cómo encajonó tipos de primera clase como int, float, char, y debido a eso, algunos enfoques orientados a datos no funcionan tan rápido como podrían. ¿Está bien? ¿Qué estoy recordando?
Richard Fabian
2
C # encuadrará los tipos de valor (no solo intrínsecos: puede crear sus propios tipos de valor) si los asigna a un objecttipo. Y en la versión 1 (antes de los genéricos) no podría colocarlos en un contenedor sin matriz sin encajonarlos. Pero en estos días es extremadamente fácil escribir código sin recuadro. Y el CLR Profiler le permite detectar cualquier lugar donde pueda estar boxeando.
Andrew Russell
¿Es posible tener un intérprete JIT? Suena paradójico.
El pato comunista
He visto algunas técnicas de código roscado que clasificaría como interpretación JIT. Definitivamente es un caso marginal.
1
@Roy T. La " Biblioteca matemática XNA " (parte de DirectX) y el " Marco XNA " son dos cosas completamente diferentes con una colisión de nombres muy desafortunada. La documentación que vinculó no se aplica a XNA Framework. Los tipos matemáticos de XNA Framework no utilizan la unidad SIMD / Vector .
Andrew Russell
5

Tendría que definir 'profesional'. ¿Podrías hacer Angry Birds, Plants vs Zombies, etc.? Absolutamente. ¿Podrías hacer Crysis 2, COD, Halo? Lo dudo. El uso de C # solo afectará los juegos que requieren mucha CPU y también necesitan exprimir hasta el último byte de memoria (se pierde en la recolección de basura), por lo que todavía hay muchas cosas que puedes hacer.

Como herramienta de aprendizaje para las personas que están comenzando, herramienta de creación de prototipos, plataforma para escribir juegos que pueden lidiar con el intercambio, etc., es fantástico y tiene mucho poder y simplicidad, simplemente no está diseñado para hacer lo que necesariamente llama a los juegos 'AAA'. También elimina gran parte del dolor y el sufrimiento de los que las personas tienen que preocuparse con la compatibilidad y la portabilidad multiplataforma.

Si se te ocurre un juego increíble y te topas con las limitaciones de lo que puedes hacer con XNA, te sugiero que te pongas en contacto directamente con MS, si la idea es lo suficientemente buena, podrían permitirte tener un desarrollo completo. equipo.

Roger Perkins
fuente
¿Podrías hacer una secuela de Duke Nukem? ;)
Jonathan Connell
1
La mayoría de los puntos de referencia encuentran que el código C # se ejecuta entre un 30% y un 70% más lento que el código C equivalente (en PC). Cuando considera que la mayoría de los juegos no están vinculados a la CPU, y también que las partes críticas del código C # se pueden escribir utilizando un código inseguro que puede ejecutarse casi tan rápido o más rápido que el código C equivalente (más rápido porque el JIT tiene mucha más información disponible para que un compilador, por lo que puede tomar mejores decisiones de optimización) , verá que C # es perfectamente capaz para juegos AAA.
BlueRaja - Danny Pflughoeft
@BlueRaja: el código inseguro no es una opción para la mayoría del desarrollo de XNA en Xbox 360.
1
@BlueRaja: Vale la pena señalar que el unsafecódigo suele ser más lento que el equivalente seguro, porque reduce la cantidad de optimizaciones que puede hacer el CLR. Tienes que medirlo.
Andrew Russell
2
@Blueraja "Cuando consideras que la mayoría de los juegos no están vinculados a la CPU", ¿necesitas mucho la cita? No he trabajado en un juego desarrollado profesionalmente que no esté vinculado en todos los ejes. ¡Si no fuera así, encontraríamos alguna forma de transferir la carga a esa parte de la máquina!
Richard Fabian
3

El simple hecho es que no necesita un alto recuento de polígonos, iluminación HDR completa o la física más interesante del mundo para hacer un juego interesante, y si su plan de juego no incluye ninguno de ellos, entonces ¿por qué no ir más rápido? solución de tiempo de desarrollo?

Más juegos profesionales tienen modelos físicos y sistemas de animación.

Eso está mal. Los juegos profesionales tienen lo que necesitan para implementar su juego y lograr su aspecto artístico, y nada más y nada menos. Un juego no es más profesional porque parece más realista o tiene una física más detallada. Un juego profesional logra su juego y objetivos visuales, a tiempo, dentro del presupuesto, etc., y se envía y obtiene ganancias.

DeadMG
fuente
1
Un alto recuento de polígonos y HDR caerían en la tarjeta gráfica, ¿no? Por lo tanto, debe esperar exactamente el mismo rendimiento en C # y C ++.
BlueRaja - Danny Pflughoeft
@BlueRaja: También hay un costo de CPU para ellos, y memoria, especialmente en el 360.
DeadMG
Más o menos, hay un poco más de sobrecarga en las llamadas de lib de gráficos que lo que habría en el código nativo. Por otro lado, las bibliotecas de gráficos modernos se esfuerzan MUCHO por reducir la cantidad de llamadas al controlador por cuadro, ya que es uno de los principales cuellos de botella.
drxzcl