Pregunta

Resumen:

  

¿Puedo programar un " grueso   cliente " Juego en C sin reinventar.   ruedas , o debería simplemente morder el   ¿Usar viñetas y usar alguna librería o SDK?   Soy un programador moderado de C y no soy   miedo de trabajar con punteros, datos   estructuras, ubicaciones de memoria, etc. si   me dará el control que necesito   hacer un gran "cliente grueso" juego.   Sin embargo, estoy pensando en eludir   lenguajes de alto nivel y amp; marcos para   por el poder y el control, no   facilidad de uso.

Estoy interesado en jugar con un juego de lucha / plataformas en 2D como un proyecto paralelo en algún momento. Soy principalmente un programador del lado del servidor Linux con experiencia en Python, Ruby y PHP. Sé que hay excelentes marcos en algunos de estos idiomas, como PyGame . También soy consciente del éxito que la gente ha tenido con cosas como Air y .NET ... pero tengo algunas preocupaciones:

  • Rendimiento : los lenguajes de secuencias de comandos son notoriamente lentos. Si estoy haciendo un juego en tiempo real, quiero que sea lo más ágil posible.
  • Binarios enormes : el uso de marcos como .NET o lenguajes de scripting como Ruby a menudo genera grandes CLR o bibliotecas que de otra forma no necesitarías. El juego que quiero hacer será pequeño y simple: ¡no quiero que su CLR sea más grande que el juego mismo!
  • Cosas adicionales : Sinceramente, no me gusta la idea de heredar el equipaje de una gran biblioteca de juegos si puedo comprender mejor mi propio código.

Estoy haciendo esta pregunta porque sé que soy muy susceptible al Síndrome No Inventado Aquí. Siempre quiero programarlo yo mismo, y estoy seguro de que desperdicia mucho tiempo. Sin embargo, esto me funciona muy a menudo, por ejemplo, en lugar de utilizar Rails (una web muy grande) marco de proyecto con un kit de herramientas de ORM y GUI incorporado), utilicé una serie de herramientas Ruby más pequeñas como rack y secuela que encajan perfectamente.

Entonces, me dirijo a ustedes, SO expertos. ¿Estoy siendo ingenuo? Así es como lo veo:

  • Usar C
    • Contras
      • Probablemente me hará odiar la programación
      • Alto riesgo de reinventar las ruedas
      • Alto riesgo de que tarde tanto que pierda interés
    • Pros
      • Probado & amp; cierto: la mayoría de los juegos de la lista A se hacen en C (¿sigue siendo cierto hoy en día?)
      • Alto nivel de control sobre la gestión de memoria, velocidad, gestión de activos, etc., que confío en mí mismo para aprender a manejar
      • Sin crucero
  • Usar marco o SDK
    • Contras
      • Riesgo de entregable de gran tamaño
      • Depende de los autores de la biblioteca original para todas las facetas del desarrollo del juego. ¿Qué pasa si no hay una función que quiero? Tendré que programarlo yo mismo, lo que no está mal, pero en primer lugar frustra el propósito de usar un marco de alto nivel en primer lugar
      • Alto riesgo de problemas de rendimiento
    • Pros
      • MUCHO tiempo de desarrollo más rápido
      • Podría ser más fácil de mantener
      • No se pierde tiempo reinventando paradigmas comunes

¿Qué más puedo agregar a esta lista? ¿Es una decisión pura o alguien puede cerrar el trato por mí? Las sugerencias de libros son bienvenidas.

¿Fue útil?

Solución

Mi pensamiento actual es:

  • Si desea aprender a programar, comience a crear el motor del juego desde los elementos básicos hacia arriba (incluso implementando estructuras de datos básicas: listas, mapas, etc.). Hice esto una vez, y aunque fue una experiencia de aprendizaje, cometí muchos errores y no lo haría por segunda vez. Sin embargo, para aprender a programar, hacer algo genial y ver resultados, lo calificaría como altamente.

  • Si quieres crear un juego adecuado, usa las bibliotecas que quieras y diseña toda la infraestructura del juego. Esto es lo que estoy haciendo ahora, y estoy usando todas las cosas buenas como STL, ATL / WTL, Boost, SQLite, DirectX, etc. Hasta ahora he aprendido mucho sobre el aspecto de la lógica del juego / medio El código y el diseño.

  • Si solo desea crear un juego con artistas y otras personas que colaboran para crear un producto terminado, use uno de los motores existentes (OGRE, Irrlicht, Nebula, Torque, etc.) y agregue su lógica de juego. y art.

Un poco de sabiduría final que he aprendido es que no te preocupes por el síndrome de "No inventamos aquí". Como me he dado cuenta de que otras bibliotecas (como STL, Boost, DirectX, etc.) tienen un orden de magnitud (o tres) más horas-hombre de tiempo de desarrollo en ellas, mucho más de lo que podría gastar en esa parte del juego / motor. Por lo tanto, la única razón para implementar estas cosas usted mismo es si desea conocerlas.

Otros consejos

Creo que estás trabajando bajo una falacia.

Existen varios marcos específicamente para la programación de juegos, escritos por personas con mucha experiencia con la complicación del diseño del juego, casi con seguridad más que tú.

En otras palabras, tiene un " Alto riesgo de problemas de rendimiento " si NO usa un marco.

Le recomendaría que pruebe pyglet .

  • Tiene un buen rendimiento, ya que utiliza opengl
  • Es una biblioteca compacta todo en uno
  • No tiene dependencias adicionales además de python

Haga algunas pruebas, vea si puede hacerlo lo suficientemente rápido para usted. Solo si te pruebas a ti mismo que no se mueve a un nivel inferior. Aunque, estoy bastante seguro de que python + pyglet puede manejarlo ... en el peor de los casos, tendrá que escribir algunas extensiones C.

Hoy, creo que está en un punto en el que puede ignorar con seguridad el problema de rendimiento a menos que esté tratando específicamente de hacer algo que supere los límites. Si su juego es, por ejemplo, no más complicado que Quake II, entonces debe elegir herramientas y bibliotecas que le permitan aprovechar al máximo su tiempo.

¿Por qué elegí Quake II? Debido a que se ejecuta en una versión compilada para .NET , se ejecuta con un renderizador de software a más de velocidad de cuadro aceptable en una máquina actual. (Si lo desea, compare MAME, que emula múltiples procesadores y hardware de gráficos a tasas aceptables)

Necesitas preguntarte si estás en esto para construir un motor o un juego. Si tu propósito es crear un juego, definitivamente debes mirar un motor de juego establecido. Para el desarrollo de juegos en 2D, consulte Torque Game Builder . Es un motor de juegos / SDK 2D muy poderoso que lo pondrá en producción a partir del día 1. Tienen muchas herramientas que se integran con él, paquetes de contenido, y obtiene el código fuente completo si desea realizar cambios y / o aprender. cómo funciona. También es compatible con Mac OSX y tiene versiones de Linux en la comunidad.

Si estás buscando algo en el lado de la consola, ellos también lo tienen.

Me sorprende que nadie haya mencionado XNA . Es un marco construido alrededor de DirectX para realizar la programación administrada de DirectX a la vez que elimina gran parte de la confusión y la verbosidad de la programación de nivel inferior de DirectX.

En cuanto al rendimiento, para la mayoría de las tareas de juegos en 2D y 3D, especialmente en la construcción de algo como un juego de lucha, esta plataforma funciona muy bien. No es tan tan rápido como si estuvieras haciendo una programación DirectX básica, pero te acerca mucho, y en un entorno administrado, nada menos.

Otro beneficio genial de XNA es que la mayor parte del código se puede ejecutar en una Xbox 360 e incluso se puede depurar a través de la conexión de red si el juego se ejecuta en Xbox. Los juegos XNA ahora también pueden ser aprobados por el equipo de Xbox Live para su distribución y venta en Xbox Live Arcade. Por lo tanto, si está buscando llevar el proyecto a un estado comercial, es posible que tenga a su disposición medios de distribución disponibles.

Al igual que todas las herramientas de desarrollo de MS, la documentación y el soporte son de primer nivel, y hay una gran comunidad de desarrolladores con muchos tutoriales, proyectos existentes, etc.

¿Quieres poder jugar tu juego en una consola? ¿Quieres hacerlo como una experiencia de aprendizaje? ¿Quieres que el producto final sea multiplataforma? ¿Qué bibliotecas has buscado hasta ahora?

Para un juego 2d no creo que el rendimiento sea un problema, recomiendo ir con algo que obtenga resultados en la pantalla en el menor tiempo posible. Si tienes mucha experiencia haciendo Python, pyGame es una buena opción.

Si planea hacer algunos juegos en 3D en el futuro, recomendaría echar un vistazo a Ogre ( http: // www.ogre3d.org ). Es un motor de gráficos 3D multiplataforma que retira las API de gráficos. Sin embargo, para un proyecto 2d es probable que sea excesivo.

El lenguaje de implementación más común para los juegos A-list en la actualidad es C ++, y muchos juegos incluyen un lenguaje de scripting (como Python o Lua) para los scripts de eventos del juego.

Las herramientas que usarías para escribir un juego tienen mucho que ver con tus razones para escribirlo y con tus requisitos. Esto no es diferente de cualquier otro proyecto de programación, realmente. Si se trata de un proyecto paralelo y lo está haciendo por su cuenta, solo usted puede evaluar cuánto tiempo tiene para dedicarlo y cuáles son sus requisitos de rendimiento.

En términos generales, las PC de hoy son lo suficientemente rápidas como para ejecutar plataformas 2D escritas en lenguajes de script. El uso de un lenguaje de secuencias de comandos te permitirá crear prototipos más rápido y tendrás más tiempo para modificar el juego. Nuevamente, esto no es diferente que con cualquier otro proyecto.

Si vas con C ++, y tus razones no tienen que ser más elaboradas que "porque yo quiero". Te sugiero que mires SDL para renderizar y soporte de audio. Hará las cosas un poco más fáciles.

Si desea aprender las tecnologías subyacentes (DirectX, o si desea escribir blitters optimizados por alguna razón perversa), entonces, por supuesto, use C ++.

Habiendo dicho todo eso, te advierto contra la optimización prematura. Para un juego en 2D, probablemente sea mejor ir primero con Python y PyGame. Me sorprendería si esas herramientas demostraran ser inadecuadas en las PC modernas.

En cuanto a lo que la gente ha dicho sobre C / C ++ / Python, soy un desarrollador de juegos y mi compañía alienta C. No b / c C ++ es malo, sino porque C ++ mal escrito es veneno para el desarrollo del juego debido a su dificultad leer / depurar en comparación con C. (C ++ ofrece beneficios cuando se usa correctamente, pero deja que un chico menor cometa algunos errores y tu tiempo se hunde es enorme)

En cuanto a la pregunta real: Si su propósito es simplemente hacer que algo funcione, use una biblioteca.

De lo contrario, codifíquelo usted mismo por una razón muy importante: Practicar
Práctica en la manipulación de estructuras de datos. Habrá momentos en que necesitará administrar sus propios datos. Practique depurar código de utilidad.

A menudo, las librerías hacen exactamente lo que quieres y son geniales, pero a veces la libreria maneja muy mal el caso de uso específico de TU y obtendrás grandes beneficios escribiendo tu propia. Esto es especialmente en consolas en comparación con PC

(edit :) Con respecto a la secuencia de comandos y la recolección de basura: te te matará en una consola, en un juego reciente tuve que reescribir las partes principales de la recolección de basura en Unreal solo para satisfacer nuestras necesidades la parte editor . Se tuvo que hacer aún más en el juego real (no solo por mí) (para ser justos, aunque estábamos presionando más allá de las especificaciones originales de Unreal)

Los scripts a menudo son buenos, pero no es un " Gano " botón. En general, las ganancias desaparecen si se presiona contra los límites de su plataforma. Usaría " porcentaje de plataformas CPU que tengo de sobra " como mi función de evaluación para decidir qué tan apropiado es el script

Una consideración a favor de C / C ++ / obj-C es que puede mezclar y combinar varias bibliotecas para diferentes áreas de interés. En otras palabras, no está atascado con la implementación de una característica en un marco.

Utilizo este enfoque en mis juegos ; usando chipmunk para la física 2D, Lua como lenguaje de scripting integrado y una implementación openGL ES de Apple. Escribo el pegamento para unir todos estos en un lenguaje C. El producto final es la capacidad de definir objetos del juego, crear instancias de ellos y manejar eventos a medida que interactúan entre sí en funciones C expuestas a Lua. Este enfoque se utiliza en muchos juegos de alto rendimiento con mucho éxito.

Si aún no conoces C ++, definitivamente te recomendaría seguir adelante con un lenguaje de scripting. Hacer un juego de principio a fin requiere mucha motivación, y obligarte a aprender un nuevo idioma al mismo tiempo es una buena manera de hacer que las cosas vayan lo suficientemente lento como para que pierdas interés (aunque ES una buena forma de aprender un nuevo idioma). idioma ...).

La mayoría de los lenguajes de secuencias de comandos se compilarán en código de bytes de todos modos, por lo que su mayor éxito de rendimiento será la recolección de basura. No tengo la experiencia suficiente para dar una descripción definitiva de cuán grande sería una recolección de basura exitosa, pero me inclino a pensar que no debería ser tan malo en un juego pequeño.

Además, si usa una biblioteca de lenguaje de script existente para hacer su juego, la mayoría de las áreas críticas de rendimiento (como gráficos) pueden escribirse en C ++ de todos modos (con suerte por las bibliotecas de juegos). Por lo tanto, el 80% de la CPU podría gastarse en código C ++ de todos modos, a pesar del hecho de que la mayoría de su proyecto está escrito, digamos Python.

Diría, pregúntese qué desea más: escribir un juego de principio a fin y aprender sobre el desarrollo del juego, o aprender un nuevo idioma (C ++). Si quieres escribir un juego, hazlo en un lenguaje de script. Si quieres aprender un nuevo lenguaje, hazlo en C ++.

Sí, a menos que solo quieras aprender todos los detalles de las cosas para crear un juego, definitivamente quieres ir con un motor de juego y solo enfocarte en construir tu lógica de juego en lugar de los detalles de gráficos, audio, gestión de recursos, etc.

Personalmente, me gusta recomendar Torque Game Builder (también conocido como Torque 2D) de GarageGames . Pero probablemente puedas encontrar algunos motores de juegos gratuitos que se ajusten a tus necesidades también.

Estoy bastante seguro de que la mayoría de los juegos modernos se hacen en C ++, no en C. (Todas las compañías de juegos que entrevisté con preguntas de C ++). ¿Por qué no usar C ++ y las bibliotecas existentes para física + colisiones, sonido, motor de gráficos, etc. Todavía escribes el juego, pero las cosas mundanas se ocupan.

Hay muchas soluciones diferentes para el problema de la abstracción y cada una se ocupa de ellas de diferentes maneras.

Mi proyecto actual usa C #, DirectX 9, HLSL y SlimDX. Cada uno de estos ofrece un nivel de abstracción cuidadosamente calibrado. HLSL me permite leer el código de sombreador que estoy escribiendo y SlimDX / C # me permite ignorar punteros, dependencias circulares y manejar código no administrado.

Dicho esto, ¡ninguna de estas tecnologías tiene ningún impacto en la facilidad de desarrollar mi IA, iluminación o física! Todavía tengo que sacar mis libros de texto de una manera que no lo haría con un marco de nivel superior.

Incluso utilizando un marco como XNA, si la mayoría de los conceptos de desarrollo de videojuegos son ajenos a usted, todavía hay mucho por aprender y aprender. XNA le permitirá eludir cuidadosamente el bloqueo de cardán, pero también a aquellos que no entienden los conceptos básicos de sombreado. Por otro lado, algo como DarkBASIC no solucionará tu problema de bloqueo de cardán, pero el sombreado se maneja principalmente para ti.

Es un campo suficientemente grande que su primer motor nunca será el que realmente usa. Si lo escribe usted mismo, no lo hará lo suficientemente bien. Si usa bibliotecas de terceros, ciertamente hay aspectos que lo molestarán y querrá reemplazarlos.

Como idea, podría valer la pena tomar varias bibliotecas / marcos (definitivamente haga de XNA una de sus paradas, incluso si decide que no quiere usarlo, es un gran punto de referencia) y tratar de construir varios prototipos. Quizás un paisaje (con un cuerpo de agua) o una demostración de física espacial.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top