frameworks - significado - Programación de juegos: cómo evitar reinventar la rueda
reinventar significado (14)
¿Quieres jugar tu juego en una consola? ¿Quieres hacerlo como una experiencia de aprendizaje? ¿Quieres que el producto final sea multiplataforma? ¿A qué bibliotecas has mirado hasta ahora?
Para un juego en 2d no creo que el rendimiento sea un problema, recomiendo ir con algo que te permita obtener resultados en la pantalla en el menor tiempo posible. Si tienes mucha experiencia en Python, pyGame es una buena opción.
Si planeas hacer algunos juegos en 3D en el futuro, recomendaría echarle un vistazo a Ogre ( http://www.ogre3d.org ). Es un motor de gráficos en 3D multiplataforma que abstrae las API gráficas. Sin embargo, para un proyecto 2d es probable que sea excesivo.
Resumen:
¿Puedo programar un juego de "cliente espeso" en C sin reinventar las ruedas , o debería simplemente morder la bala y usar alguna biblioteca o SDK? Soy un programador de C moderado y no tengo miedo de trabajar con punteros, estructuras de datos, ubicaciones de memoria, etc., si esto me da el control que necesito para hacer un gran juego de "clientes gruesos". Sin embargo, estoy pensando en evitar los lenguajes y marcos de alto nivel por el poder y el control, no por la facilidad de uso.
Estoy interesado en jugar con un juego de plataformas / lucha en 2D como un proyecto paralelo en algún momento. Principalmente soy un programador de servidores Linux con experiencia en Python, Ruby y PHP. Sé que hay marcos excelentes 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 scripting son notoriamente lentos. Si estoy haciendo un juego en tiempo real, quiero que sea lo más rápido posible.
- Enormes binarios : el uso de marcos como .NET o lenguajes de scripting como Ruby a menudo resultan en CLR grandes o bibliotecas que de otra manera 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 en sí!
- Cosas extra : Honestamente, simplemente no me gusta la idea de heredar el equipaje de una gran biblioteca si puedo entender 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 se pierde mucho tiempo. Sin embargo, esto me funciona notablemente a menudo, por ejemplo, en lugar de utilizar Rails (un marco de proyecto web muy grande con un ORM y un conjunto de herramientas GUI), utilicé una serie de herramientas Ruby más pequeñas como rack y secuelas que encajan entre sí. hermosamente.
Entonces, me dirijo a ustedes, tan expertos. ¿Estoy siendo ingenuo? Así es como lo veo:
- Use C
- Contras
- Probablemente me hará odiar la programación
- Alto riesgo de reinventar las ruedas
- Alto riesgo de que tome tanto tiempo que pierda interés
- Pros
- Probado y verdadero: la mayoría de los juegos de la lista A están hechos en C (¿esto sigue siendo cierto hoy?)
- Alto nivel de control sobre la administración de la memoria, la velocidad, la administración de activos, etc., que confío en aprender a manejar
- Sin cruft
- Contras
- Usar framework o SDK
- Contras
- Riesgo de entrega sobredimensionada
- Dependiendo de los autores originales de la biblioteca para todas las facetas del desarrollo del juego, ¿qué sucede si no hay una función que yo quiera? Tendré que programarlo yo mismo, lo cual no está mal, pero en parte 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 hay tiempo perdido reinventando paradigmas comunes
- Contras
¿Qué más puedo agregar a esta lista? ¿Es una decisión puramente crítica, o alguien puede sellar el trato por mí? Libro de sugerencias de bienvenida.
Creo que estás trabajando bajo una falacia.
Existen varios frameworks específicamente para la programación de juegos, escritos por personas con mucha experiencia en la complicación del diseño del juego, casi con toda seguridad más que tú.
En otras palabras, tiene un "alto riesgo de problemas de rendimiento" si NO usa un marco.
Debes preguntarte si estás en esto para construir un motor o construir un juego. Si su propósito es crear un juego, definitivamente debe mirar un motor de juego establecido. Para el desarrollo de juegos 2D, mira Torque Game Builder . Es un motor de juegos 2D / SDK muy poderoso que lo pondrá en producción desde el primer día. Tiene 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 buscas algo en el lado de la consola, también tienen eso.
El lenguaje de implementación más común para los juegos de la lista actual es C ++, y muchos juegos incorporan un lenguaje de scripting (como Python o Lua) para el scripting 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 hace por su cuenta, solo usted puede evaluar cuánto tiempo debe dedicar a esto y cuáles son sus requisitos de rendimiento.
En términos generales, las computadoras actuales son lo suficientemente rápidas como para ejecutar plataformas 2D escritas en lenguajes de scripting. Usar un lenguaje de scripting te permitirá hacer prototipos más rápido y tendrás más tiempo para ajustar la jugabilidad. Nuevamente, esto no es diferente a cualquier otro proyecto.
Si opta por C ++, y sus motivos no tienen por qué ser más elaborados que "porque quiero", le sugiero que consulte SDL para ver el renderizado y el 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 2D, probablemente será mejor ir primero con Python y PyGame. Me sorprendería si esas herramientas resultan 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 empresa alienta C. No b / c C ++ es malo, pero porque C ++ mal escrito es veneno para el desarrollo del juego debido a su dificultad para leer / depurar en comparación con C. (C ++ da beneficios cuando se usa correctamente, pero deja que un chico menor cometa algunos errores y tu receptor de tiempo es enorme)
En cuanto a la pregunta real: si su propósito es simplemente hacer que algo funcione, use una biblioteca.
De lo contrario, códelo usted mismo por una razón muy importante: práctica
Practica en la manipulación de estructuras de datos. Habrá ocasiones en que necesite administrar sus propios datos. Practica en la depuración de código de utilidad.
A menudo, las librerías hacen exactamente lo que usted desea y son geniales, pero a veces su lib maneja muy mal su caso de uso específico y obtendrá grandes beneficios al escribirlo usted mismo. Esto es especialmente en las consolas en comparación con las PC
(editar :) En cuanto al script y la recolección de basura: te matará en una consola, en un juego reciente tuve que reescribir grandes porciones de la recolección de basura en Unreal solo para llenar nuestras necesidades en la parte del editor . Se tuvo que hacer mucho más en el juego real (no solo yo) (para ser justos, aunque estábamos yendo más allá de las especificaciones originales de Unreal)
El scripting a menudo es bueno, pero no es un botón de "I win". En general, las ganancias desaparecen si estás empujando contra los límites de tu plataforma. Usaría "el porcentaje de CPU de plataformas que tengo que ahorrar" como mi función de evaluación para decidir qué tan apropiado es el script
Estoy bastante seguro de que la mayoría de los juegos modernos se hacen en C ++, no en C. (Cada compañía de juegos con la que alguna vez entrevisté hizo preguntas en C ++).
¿Por qué no utilizar 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 solucionan.
Hoy, creo que se encuentra en un punto en el que puede ignorar el problema de rendimiento a menos que intente específicamente hacer algo que supere los límites. Si su juego es, digamos, 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 procesador de software a una velocidad de cuadro más que aceptable en una máquina actual. (Si lo desea, compare MAME, que emula múltiples procesadores y hardware de gráficos a precios aceptables)
Sí, a menos que solo quieras aprender todos los detalles de las cosas que conforman un juego, definitivamente debes elegir un motor de juego y solo enfocarte en construir tu lógica de juego en lugar de los detalles de gráficos, audio, administración de recursos, etc.
Personalmente, me gusta recomendar el Torque Game Builder (también conocido como Torque 2D) de GarageGames . Pero probablemente puedas encontrar algunos motores de juegos gratuitos que se adapten a tus necesidades también.
Si aún no conoce C ++, definitivamente le recomendaría que siga adelante con un lenguaje de scripting. Hacer un juego de principio a fin requiere mucha motivación y obligarse a aprender un nuevo idioma al mismo tiempo es una buena manera de hacer que las cosas avancen con la suficiente lentitud para que pierda interés (aunque ES una buena forma de aprender un nuevo idioma). idioma...).
La mayoría de los lenguajes de scripting se compilarán en el código de bytes de todos modos, por lo que su mayor impacto en el rendimiento será la recolección de basura. No tengo experiencia suficiente para dar una descripción definitiva de cuán grande sería una recolección de basura, pero me inclinaría a pensar que no debería ser tan malo en un juego pequeño.
Además, si utiliza una biblioteca de lenguaje de secuencias de comandos existente para hacer su juego, la mayoría de las áreas críticas de rendimiento (como gráficos) se pueden escribir en C ++ de todos modos (con suerte en las bibliotecas de juegos). Así que el 80% de la CPU podría gastarse realmente en código C ++ de todos modos, a pesar de que la mayor parte de su proyecto está escrito, digamos Python.
Yo diría, pregúntate qué quieres 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 scripting. Si quieres aprender un nuevo idioma, hazlo en C ++.
Yo recomendaría que pruebes la piruleta .
- Tiene un buen rendimiento, ya que utiliza opengl
- Es una biblioteca compacta todo en uno
- No tiene dependencias adicionales además de python
Haz algunas pruebas para ver si puedes hacerlo lo suficientemente rápido para ti. Solo si compruebas a ti mismo que no se mueve a un nivel inferior. Aunque, estoy bastante seguro de que python + pyglet puede manejarlo ... en el peor, tendrás que escribir unas pocas extensiones C.
Mi pensamiento actual es:
Si quieres aprender a programar, comienza a hacer que el motor del juego vaya desde los elementos base hacia arriba (incluso implementando estructuras de datos básicas: listas, mapas, etc.). Lo hice una vez, y aunque fue una experiencia de aprendizaje, cometí muchos errores y no volvería a hacerlo una segunda vez. Sin embargo, para aprender cómo programar y hacer algo interesante y ver los resultados lo calificaría muy bien.
Si desea crear un juego adecuado, use las bibliotecas que desee y diseñe toda la infraestructura del juego usted mismo. 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 medio / juego de el código y diseño
Si solo quieres hacer un juego con artistas y otras personas que colaboran para crear un producto terminado, utiliza uno de los motores existentes (OGRE, Irrlicht, Nebula, Torque, etc.) y solo agrega la lógica y el arte de tu juego.
Una última parte de la sabiduría que he aprendido es que no se preocupe por el síndrome de Not Invented Here. 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 alguna vez 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 aprender sobre ellas.
Una consideración a favor de C / C ++ / obj-C es que puede mezclar y combinar varias bibliotecas para diferentes áreas de preocupación. En otras palabras, no está atascado con la implementación de una función en un marco.
Uso este enfoque en mis juegos ; usando ardilla para física 2D, Lua como lenguaje de guión integrado y una implementación de OpenGL ES de Apple. Escribo el pegamento para unir todo esto en un lenguaje C. El producto final es la capacidad de definir objetos de juego, crear instancias de ellos y manejar eventos mientras interactúan entre sí en las funciones de C expuestas a Lua. Este enfoque se usa en muchos juegos de alto rendimiento con mucho éxito.
Me sorprende que nadie haya mencionado a XNA . Es un marco construido alrededor de DirectX para hacer una programación administrada de DirectX mientras se elimina gran parte de la fluidez y la verbosidad de la programación de DirectX de bajo nivel.
En cuanto a rendimiento, para la mayoría de las tareas de juegos en 2D y 3D, especialmente para construir algo así como un juego de lucha, esta plataforma funciona muy bien. No es tan rápido como si estuvieras haciendo una programación de DirectX bare metal, pero te acerca mucho, y en un entorno administrado, nada menos.
Otra gran ventaja de XNA es que la mayoría 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 de XNA ahora pueden ser aprobados por el equipo de Xbox Live para su distribución y venta en Xbox Live Arcade también. Entonces, si está buscando llevar el proyecto a un estado comercial, puede tener a su disposición un medio de distribución disponible.
Al igual que todas las herramientas de desarrollo de MS, la documentación y el soporte son de primera clase, y hay una gran comunidad de desarrolladores con muchos tutoriales, proyectos existentes, etc.
Hay muchas soluciones diferentes al problema de la abstracción y cada una trata 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 realmente el código de sombreado que estoy escribiendo y SlimDX / C # me permite ignorar los punteros, las dependencias circulares y manejar el código no administrado.
Dicho esto, ninguna de estas tecnologías tiene ningún impacto en la facilidad de desarrollo de 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 si usa un framework como XNA, si la mayoría de los conceptos de desarrollo de videojuegos son ajenos a usted, todavía queda mucho por aprender y aprender. XNA te permitirá esquivar cuidadosamente el bloqueo cardánico, pero ¡ay de aquellos que no entienden los conceptos básicos de sombreado! Por otro lado, algo como DarkBASIC no resolverá tu problema de bloqueo cardánico, pero el sombreado se maneja principalmente para ti.
Es un campo lo suficientemente grande que su primer motor nunca será el que realmente usa. Si lo escribe usted mismo, no lo escribirá lo suficientemente bien. Si usa bibliotecas de terceros, seguramente hay aspectos que lo molestarán y querrá reemplazarlos.
Como idea, podría valer la pena tomar varias bibliotecas / marcos (sin duda, hacer de XNA una de sus paradas, incluso si decide que no desea usarlo, es un gran punto de referencia) y tratar de construir varios prototipos. Tal vez un paisaje (con un cuerpo de agua) o una demostración de física espacial.