it-swarm-es.tech

¿Cuál es la mejor alternativa a C ++ para la programación de gráficos en tiempo real?

C++ simplemente absorbe demasiado de mi tiempo al hacer que administre mi propia memoria, haciéndome escribir demasiado (hola std::vector<Thingy>::const_iterator it = lotsOfThingys.begin()) y aburriéndome con largos tiempos de compilación. ¿Cuál es la mejor alternativa para una programación gráfica en tiempo real? La recolección de basura es imprescindible (al igual que la capacidad de evitar su uso cuando sea necesario), y la velocidad debe ser competitiva con C++. Una historia razonable para acceder a C libs también es imprescindible.

(Divulgación completa: tengo mi propia respuesta a esto, pero estoy interesado en ver lo que otros han encontrado como buenas alternativas a C++ para el trabajo de gráficos en tiempo real).

Editar: Gracias a todos por las reflexivas respuestas. Dado que realmente no hay una respuesta "correcta" a esta pregunta, no seleccionaré ninguna respuesta en particular. Además, simplemente elegiría el lenguaje que me gusta como alternativa a C++, lo que realmente no sería justo.

33
Baxissimo

¿Qué pasa con D Lenguaje de programación ?

Algunos enlaces solicitados en el comentario:

Win32 Api

Abandonado (lib multimedia)

18
daddz

No descartaría C++. De hecho, consideraría agregar Boost a su biblioteca de C++, lo que hace que el lenguaje sea mucho más útil. Su ejemplo se convertiría en:

BOOST_FOREACH( Thingy& t, lostOfThingys ) {
    // do something with 't'
}

Boost tiene toneladas de herramientas que ayudan a hacer de C++ un mejor lenguaje.

18
Martin Cote

C # es un lenguaje agradable que se adapta a sus requisitos, y definitivamente es adecuado para gráficos, gracias a los esfuerzos de Microsoft por proporcionarle excelentes herramientas y bibliotecas como Visual Studio y XNA.

17
Drealmer

No estoy de acuerdo con tu premisa. Cuando se usa con cuidado y correctamente, C++ es un gran lenguaje, especialmente para un dominio como los gráficos en tiempo real, donde la velocidad es esencial.

La administración de memoria se vuelve fácil si diseña bien su sistema y utiliza contenedores stl y punteros inteligentes.

std::vector::const_iterator it = lotsOfThingys.begin()) se volverá mucho más corto si usa

using namespace std;
typedef vector::const_iterator ThingyConstIter;

Y puede acortar significativamente los tiempos de compilación al dividir sus sistemas en módulos razonablemente independientes, al usar encabezados precompilados o al usar el lenguaje PIMPL.

15
Dima

La recolección de basura en tiempo real + no coincide muy bien, me temo.

Es un poco difícil garantizar una respuesta en tiempo real si un recolector de basura puede intervenir en cualquier momento y gastar una cantidad indefinida de procesamiento ...

14
Pieter

No olvidemos mencionar el nuevo uso 'automático':

auto it = lotsOfThingys.begin(); // Let the compiler figure it out.
auto it2 = lotsOfFoos.begin();
if (it==it2) // It's still strongly typed; a Thingy iter is not a Foo iter.
13
MSalters

Quizás un enfoque híbrido. Python y C++ hacen una buena combinación (ver, por ejemplo, PyGame).

13
James Hopkin

Alguna variación de LISP que se compila en código de máquina podría ser casi tan rápida como C++ para este tipo de programación. El equipo de Naughty Dog creó una versión de LISP llamada Game Oriented Assembly LISP , que utilizaron para crear varios títulos AAA, incluidas las series Jak y Daxter. Los dos impedimentos principales para un enfoque LISP en la industria del juego serían la naturaleza arraigada del desarrollo de C/C++ (tanto las herramientas como los activos humanos están fuertemente invertidos en C/C++), así como la dificultad de encontrar ingenieros talentosos que son estrellas en tanto el dominio de programación del juego como el lenguaje LISP.

Muchos equipos de programación en la industria están cambiando a un enfoque híbrido en el que el código en tiempo real, especialmente el código de gráficos y física, está escrito en C o C++, pero la lógica del juego se realiza en un lenguaje de secuencias de comandos de nivel superior, al que se puede acceder y editable por programadores y no programadores por igual. Lua y Python son populares para los scripts de nivel superior.

12
Nathan

Como desarrollador/investigador/profesor de aplicaciones 3D VR durante unos 20 años, sugeriría que no hay alternativa (excepto posiblemente C). La única forma de reducir la latencia y permitir la interacción en tiempo real es un lenguaje compilado optimizado (p. Ej., C o C++) con acceso a una biblioteca de gráficos 3D rápidos y relables, como OpenGL. Si bien estoy de acuerdo en que es frustrante tener que codificar todo, esto también es esencial para el rendimiento y la optimización.

8
treefish

A veces, mirando fuera del camino trillado, puedes encontrar una verdadera joya. Es posible que desee considerar PureBasic (No deje que el nombre lo engañe). Aquí hay algunos detalles:

Características de PureBasic

  • Código ejecutable de máquina (ensamblaje) (FASM)
    • Soporte de montaje en línea
    • No se necesitan tiempos de ejecución (no se necesitan archivos DLL, etc.) 1 archivo ejecutable
    • Ejecutables pequeños (tan pequeños o más pequeños/tan rápidos o más rápidos que C++ sin el tiempo de ejecución)
    • Puedes escribir archivos DLL
    • Soporte multihilo
    • Soporte completo de API del sistema operativo
  • Soporte multiplataforma
    • Windows 95-2003
    • Linux
    • Mac OS X
    • Amiga
  • Desarrollo de juegos en 2D y 3D
    • DirectX
    • OGRO
  • Licencia generosa
    • Barato (79 euros o alrededor de $ 112)
    • Licencia de por vida (todas las actualizaciones y versiones futuras incluidas)
    • Un precio para todas las plataformas.
  • Soporte de biblioteca externa
    • DLL de terceros
    • Bibliotecas de usuario
  • Soporte en línea
    • Equipo de desarrollo receptivo dirigido por su creador
    • Foro en línea
      • Un lugar para respuestas (no tiene que ir por toda la red)
      • Gran cantidad de código de muestra (pruebe el código mientras está en IE con IEtool)
      • Respuestas rápidas a preguntas
  • Aprendizaje adicional (alternativa al aprendizaje de C++)
    • API
    • Estructuras
    • Interfaces
    • Punteros

Visite el foro en línea para tener una mejor idea de PureBasic ( http://www.purebasic.fr/english/index.php ) o el sitio principal: www.purebasic.com

6
DevilDog

Estoy completamente de acuerdo con la mención de C # para la programación de gráficos. Tiene la ligera desventaja de ser un lenguaje administrado y permitir que el recolector de basura reine libremente sobre su aplicación es un suicidio de framerate después de un tiempo, pero con algunas asignaciones de pool relativamente inteligentes hechas al principio de la vida del programa, se pueden evitar problemas reales.

Varias personas ya han mencionado XNA, que es increíblemente amigable y está bien documentada y me gustaría hacer eco de esa recomendación también. Personalmente lo estoy usando para mis proyectos de juegos de hobby y me ha tratado muy bien.

Sin embargo, XNA no es la única alternativa. También existe SlimDX, que se encuentra en constante desarrollo como medio para proporcionar un envoltorio ligero de DirectX de forma similar a Managed DirectX (que, creo, fue descontinuado por Microsoft a favor de XNA). Ambos son dignos de investigación: http://code.google.com/p/slimdx/

5
mittens

No hay alternativas verdaderas para los grandes títulos AAA, especialmente en las consolas. Para títulos más pequeños, C # debería hacer.

3
yrp

Yo diría que el lenguaje de programación D es una buena opción. Puede vincular a archivos de objetos C e interactuar con código C++ a través de bibliotecas C. D tiene recolección de basura, ensamblaje en línea y los desarrolladores de juegos han creado enlaces a las bibliotecas SDL y OpenGL, y también están trabajando activamente en nuevas API de desarrollo de juegos. Me encanta D. Lástima que mi trabajo no exige su uso. :(

3
komma8.komma1

C # es una buena respuesta aquí: tiene una recolección de basura justa (aunque tendría que perfilarla bastante, para cambiar la forma en que maneja las cosas ahora que todo el manejo de la memoria está fuera de sus manos), es simple uso, tiene muchos ejemplos y está bien documentado. En el departamento de 3D, ofrece soporte completo para sombreadores y efectos, por lo que esa sería mi elección.

Aún así, C # no es tan eficiente como C++ y es más lento debido a la sobrecarga, por lo que si se trata de velocidad y flexibilidad para usar cualquier truco en el libro que desee (con punteros y ensamblaje si desea ensuciarse las manos) C++ y el precio sería escribir mucho más código como mencionaste, pero tener control total sobre todo, incluida la administración de memoria.

3
Adi

Yo voto c ++ 0x. El soporte parcial ya está disponible en gcc-4.3 + usando el indicador -std = c ++ 0x.

2
crelbor

Si está apuntando a Windows, C++/CLI (dialecto "administrado" .NET de Microsoft de C++) es una posibilidad interesante, especialmente si desea aprovechar su experiencia en C++. Puede mezclar código nativo (p. Ej., Llamadas a bibliotecas de estilo C) con código administrado .NET sin inconvenientes, y aprovechar .NET GC y bibliotecas.

En cuanto a las preocupaciones sobre el impacto de GC en el rendimiento en 'tiempo real', creo que tienden a ser exageradas. El .NET GC multigeneracional es muy bueno para nunca tomar mucho tiempo para hacer una colección, a menos que se encuentre en algún tipo de situación crítica de poca memoria. Escribo código .NET que interactúa con intercambios electrónicos de derivados, donde el tiempo demora == mucho $$$, y nunca hemos tenido un problema relacionado con GC. Unos pocos milisegundos es mucho, mucho tiempo para el GC, pero no para un humano que interactúa con un software, incluso un juego en "tiempo real". Si realmente necesita un rendimiento real "en tiempo real" (para dispositivos médicos, control de procesos, etc.), no puede usar Windows de todos modos, simplemente no es un sistema operativo en tiempo real.

2
McKenzieG1

Muchos motores de juego pueden satisfacer tus necesidades, supongo. Por ejemplo, usando SDL o Cairo, si se necesita portabilidad. Muchos lenguajes de secuencias de comandos (que vienen en general con sintaxis fácil y recolección de basura) tienen enlaces a estos lienzos.
Flash podría ser otra alternativa.

Solo señalaré Procesando , que es un lenguaje de programación de código abierto y un entorno para personas que desean programar imágenes, animaciones e interacciones.

En realidad, es una envoltura delgada alrededor de Java, lo que hace que parezca un lenguaje de script: tiene un (primitivo) IDE cuando puede escribir algunas líneas de código y presionar Ejecutar sin siquiera tener que guarde el archivo. En realidad, envuelve el código alrededor de una clase y agrega una llamada main (), lo compila y lo ejecuta en una ventana.

Mucha gente lo usa para exhibiciones en tiempo real (VJ y similares). Tiene el poder y las limitaciones de Java, pero agrega una serie de envoltorios (bibliotecas) de Niza para simplificar el acceso a Java2D, OpenGL, SVG, etc.

De alguna manera, se ha convertido en un modelo de lenguaje gráfico simple: hay varias aplicaciones que intentan imitar el procesamiento en otros idiomas, como Ruby, Scala o Python. Una de las más impresionantes es una implementación de JavaScript, utilizando el componente canvas implementado en Firefox, Safari, Opera, etc.

2
PhiLho

Al igual que James (hopkin), para mí, el enfoque híbrido es la mejor solución. Python y C++ es una buena opción, pero otro estilo como C #/C++ funciona. Todo depende de su contexto gráfico. Para el juego, XNA es una buena plataforma (limitada a win32), en este caso C #/C++ es la mejor solución. Para la visualización científica, se acepta Python/C++ (como los enlaces de vtk en python). Para el juego móvil Java/C++ puede funcionar ...

2
Johan Moreau

¿Sería 'C' una respuesta demasiado obvia?

1
Martin Beckett

He utilizado con éxito C++ para el motor, con la aplicación escrita en Lua en la parte superior. JavaScript también es muy práctico, ahora existe la última generación de motores JS basados ​​en JIT (tracemonkey, V8, etc.).

Creo que C++ estará con nosotros por un tiempo todavía; incluso Tim Sweeney en realidad no cambiado a Haskell (pdf) todavía, AFAIK :-)

1
sdclibbery

Java y LWJGL (OpenGL wrapper) me han funcionado bien. Si está buscando más de una biblioteca de tipos de gráficos de escena como Orge, eche un vistazo a jMonkeyEngine, que utilizamos para crear una aplicación de tipo google earth (consulte www.skapeworld.com). Si eres sensato con la creación de objetos, la recolección de basura no es un problema.

1
Rik

Puedes mirar Ada. No existe un recolector de basura, pero este lenguaje se usa a menudo para sistemas en tiempo real que necesitan una alta confiabilidad. Eso significa menos tiempos de depuración para sus aplicaciones 3D.

Y también puede mirar Haskell, si no conoce el paradigma funcional, este lenguaje le parecerá extraño, pero vale la pena un poco de su tiempo. Tim Sweeney (EPIC Inc) está considerando este lenguaje como una alternativa de C++.

0
BenjaminB

Buena pregunta. En cuanto al 'hacerme escribir demasiado', C++ 0x parece abordar la mayor parte como se menciona:

auto it = lotsOfThingys.begin ()) // ... deduce el tipo, al igual que en * ML VS2010beta ya lo implementa.

En cuanto a la gestión de la memoria, por eficiencia, tendrá que realizar un buen seguimiento de las asignaciones de memoria, con o sin recolección de basura (es decir, hacer agrupaciones de memoria, reutilizar el objeto asignado a veces) de todos modos, de modo que eventualmente si su entorno es basura recogido o no, importa menos. Tendrá que llamar explícitamente a gc () también, para evitar que la memoria se fragmente. Tener formas consistentes de administrar la memoria es importante en cualquier lugar. RAII - es una característica asesina de C++ Otra cosa - es que la memoria es solo un recurso, aún debe realizar un seguimiento de otros recursos con un GC, por lo que RIAA.

De todos modos, C # - es una alternativa agradable en muchos aspectos, me parece un lenguaje muy agradable, especialmente la capacidad de escribir código de estilo funcional (la linda sintaxis lambda ->, mapear/seleccionar 'LINQ', etc.), por lo tanto la posibilidad de escribir código paralelo; mientras que todavía es una 'llave estándar', cuando usted (o sus colegas) la necesitan.

0
oyd11

El mejor entorno para su proyecto es el que realiza su tarea de la manera más rápida posible. Esto, especialmente para gráficos 3D, incluye bibliotecas.

Dependiendo de la tarea, puede salirse con la suya con la piratería de directx. Entonces podría usar .NET y slimdx . Los lenguajes administrados tienden a ser más rápidos de programar y más fáciles de depurar.

¿Quizás necesites un motor 3D realmente bueno? Pruebe Ogre3D o Irrlicht . Necesita calidad de grado comercial (se podría argumentar que Ogre3D ofrece eso): elija Cryengine o Unreal. Con Ogre3D e Irrlicht también puede usar .NET, aunque los puertos no siempre están actualizados y los complementos no se incluyen tan fácilmente como en las versiones de C++. Para Cryengine/Unrealengine, supongo que no tendrás una opción real.

¿Lo necesitas más portátil? OpenGL para el rescate, aunque es posible que necesite algún contenedor (por ejemplo, SDL ).

¿También necesitas una GUI? wxWidgets , QT podría ser una posibilidad.

¿Ya tienes una cadena de herramientas? Sus bibliotecas deben poder manejar los formatos de archivo.

¿Quieres escribir una biblioteca? C/C++ podría ser una solución, ya que la mayoría del mundo puede usar bibliotecas C/C++. ¿Quizás con el uso de COM?

Todavía hay muchos proyectos/bibliotecas que no mencioné (XNA, Boost, ...) y si desea crear algún programa que no solo muestre gráficos en 3D, también podría tener otras necesidades (Entrada, Sonido , Red, AI, Base de datos, GUI, ...)

Para resumir: un lenguaje de programación es una herramienta para alcanzar una meta. Tiene que verse en el contexto de la tarea en cuestión. La tarea tiene sus propias necesidades y estas necesidades pueden elegir el idioma para usted (por ejemplo, necesita una determinada biblioteca para obtener una función que lleva mucho tiempo programar y solo puede acceder a la biblioteca con el idioma X).

Si necesita el one-does-casi-all: pruebe C++/CLI (quizás en combinación con C # para una sintaxis más fácil).

0
Tobias Langner

Eche un vistazo a Delphi/Pascal Object y algunos ejemplos: http://www.delphigamer.com o http://glscene.cjb.net/

0
philnext

Si su objetivo es una PC, creo que puede probar C # o incrustar Lua en su aplicación C++ y ejecutar scripts para cosas de 'alto nivel'. Sin embargo, si su objetivo es una consola, usted debe administrar su propia memoria!

0
R Caloca

No pase por alto los idiomas independientes en su búsqueda. Emergence BASIC de Ionic Wind Software tiene un motor DirectX 9 incorporado, admite OOP y puede interactuar fácilmente con las bibliotecas C).

http://www.ionicwind.com

James.

0
JamesS

La recolección de basura es imprescindible (al igual que la capacidad de evitar su uso cuando sea necesario)

No puede deshabilitar un recolector de basura temporalmente. Entonces necesitarías un recolector de basura determinista. Pero esa bestia también viene con un éxito de rendimiento. Creo que BEA JRockit es una bestia y entonces deberías quedarte con Java.

Solo para comentar tu ejemplo; typedef es tu amigo ...

typedef std::vector<Thingy> Thingys;
Thingys::const_iterator it = lotsOfThingys.begin()
0
Markowitch

Objective-C parece una buena combinación para sus requisitos (la última versión con GC opcional), aunque es demasiado dinámico y Smalltalk para mi gusto.

0
Nemanja Trifunovic

XNA es tu mejor apuesta, creo. Al ser compatible con .NET Framework, puede construir para una plataforma Windows o Xbox 360 simplemente cambiando una configuración en Game Studio. ¡Mejor aún, todas las herramientas son gratis!

Si decide utilizar XNA, puede comenzar a utilizar fácilmente su guía de inicio rápido Guía de inicio rápido de XNA

Ha sido una experiencia gratificante y divertida para mí hasta ahora, y un buen descanso de la administración de memoria de C++.

0
Game_Overture