¿Qué inconvenientes encontraste al escribir juegos para PC con un lenguaje administrado como C # y cómo los resolviste?
¿Qué inconvenientes encontraste al escribir juegos para PC con un lenguaje administrado como C # y cómo los resolviste?
Respuestas:
No sé mucho sobre Java, así que esto es desde el punto de vista de un desarrollador .net.
El más grande con diferencia es la basura. El recolector de basura .NET en Windows hace un trabajo fantástico, y puedes escaparte sin cuidarlo en su mayor parte. En Xbox / Windows Phone 7 eso es diferente. Si obtiene puestos cada pocos cuadros, la recolección de basura puede estar causándole problemas. Por el momento, se dispara después de cada asignación de 1 MB.
Aquí hay algunos consejos para lidiar con la basura. No debería tener que preocuparse por la mayoría de estos en realidad, pero pueden ser útiles algún día.
GC.GetTotalMemory()
a la pantalla. Esto te da una aproximación de la cantidad de bytes asignados que usa tu juego. Si apenas se mueve, lo estás haciendo bien. Si está subiendo rápido, tienes problemas.GC.Collect()
. Si sabe que la mayoría de sus grandes asignaciones están fuera del camino, solo es bueno informarle al sistema.GC.Collect()
cada cuadro. Puede parecer una buena idea mantenerse al tanto de su basura y todo eso, pero recuerde que lo único peor que una recolección de basura es la recolección de basura.StringBuilder
(¡cuidado, StringBuilder
no es una bala mágica y aún puede causar asignaciones! Esto significa que operaciones simples como agregar un número al final de una cadena pueden crear cantidades sorprendentes de basura) o El uso de foreach
bucles sobre colecciones que usan la IEnumerable
interfaz también puede crear basura sin que usted lo sepa (por ejemplo, foreach (EffectPass pass in effect.CurrentTechnique.Passes)
es común)IDisposable
en clases que contengan recursos no administrados. Puede usarlos para limpiar la memoria que el GC no puede liberar.La otra cosa a tener en cuenta es el rendimiento de coma flotante. Si bien .NET JITer realiza una buena cantidad de optimizaciones específicas del procesador, no puede usar SSE ni ningún otro conjunto de instrucciones SIMD para acelerar sus cálculos de coma flotante. Esto puede causar una gran diferencia de velocidad entre C ++ y C # para los juegos. Si usa mono, tienen algunas bibliotecas especiales de matemáticas SIMD que puede aprovechar.
Un error de rendimiento típico es no considerar al recolector de basura en el diseño / desarrollo del juego. Producir demasiada basura puede conducir a "hipo" en el juego, lo que ocurre cuando el GC funciona durante un tiempo considerable.
Para C #, el uso de objetos de valor y la declaración "using" pueden aliviar la presión del GC.
using
declaración no tiene nada que ver con la recolección de basura! Es para IDisposable
objetos, que son para liberar recursos no administrados (es decir, aquellos que no son manejados por el recolector de basura ).
Diría que los mayores problemas que he encontrado al escribir juegos en C # ha sido la falta de bibliotecas decentes. La mayoría de los que he encontrado son puertos directos, pero incompletos, o contenedores sobre una biblioteca de C ++ que incurren en una penalización de alto rendimiento por la clasificación. (Estoy hablando específicamente sobre MOgre y Axiom para la biblioteca OGRE, y BulletSharp para la biblioteca de física Bullet)
Los lenguajes administrados (a diferencia de Interpretado, ya que Java o C # ya no se interpretan realmente) pueden ser tan rápidos como los lenguajes nativos si tienes un buen conocimiento de lo que realmente los hace lentos (clasificación, recolección de basura). Creo que el verdadero problema es que los desarrolladores de bibliotecas aún no se han dado cuenta de eso.
Como otros han dicho, las pausas de recolección de GC son el mayor problema. El uso de agrupaciones de objetos es una solución típica.
C # y Java no se interpretan. Se compilan en un bytecode intermedio que, después de JIT , se vuelve tan rápido como el código nativo (o lo suficientemente cerca como para ser insignificante)
El mayor obstáculo que he encontrado es liberar recursos que afectan directamente la experiencia del usuario. Estos lenguajes no admiten automáticamente la finalización determinista como lo hace C ++, lo que, si no espera, puede dar lugar a cosas como mallas flotando sobre la escena después de pensar que fueron destruidas. (C # logra la finalización determinista a través de IDisposable , no estoy seguro de lo que hace Java).
Aparte de eso, los lenguajes administrados son realmente mucho más capaces de manejar el tipo de rendimiento que requieren los juegos de lo que obtienen crédito. El código administrado bien escrito es mucho más rápido que el código nativo mal escrito.
IDisposable
permite la limpieza determinista de recursos críticos y no administrados, pero no afecta directamente la finalización o el recolector de basura.
Ni Java ni C # se interpretan. Ambos se compilan en código máquina nativo.
El mayor problema con ambos y con los juegos es tener que codificar de tal manera que nunca se acumulen basura durante el juego. El número de aros por los que tienes que saltar para lograr eso casi supera los beneficios de usarlos en primer lugar. La mayoría de las funciones que hacen que esos lenguajes sean divertidos para la aplicación o la programación del servidor deben evitarse para la programación del juego; de lo contrario, obtendrá largas pausas durante el juego a medida que se disparan y se recolecta basura.
Un gran obstáculo que veo al hacer juegos con lenguajes como estos (o al usar herramientas como XNA, TorqueX engine, etc.) es que será difícil encontrar un equipo de buenas personas con la experiencia necesaria para crear un juego equivalente a lo que sería bastante fácil encontrar personas en C ++ y OpenGL / DirectX.
La industria de desarrollo de juegos todavía está muy inmersa en C ++, ya que la mayoría de las herramientas y canalizaciones que se utilizan para impulsar juegos pequeños grandes o bien pulidos se escribieron en C ++, y hasta donde yo sé TODOS los kits de desarrollo oficiales que pueda get para XBox, PS3 y Wii se lanzan solo con compatibilidad para C ++ (el conjunto de herramientas XBox puede administrarse más hoy en día, ¿alguien sabe más?)
Si quieres desarrollar juegos para consolas en este momento, obtienes XNA y C # en XBox y luego solo en una parte lateral de la biblioteca de juegos llamada XBox Live Indie Games. Algunos de los que ganan concursos, etc., son elegidos para portar su juego al XBox Live Arcade real. Aparte de eso, planea hacer un juego para PC.