Quelle est la meilleure alternative au C++ pour la programmation graphique en temps réel? [fermé]

C++ suce juste trop de mon temps en me faisant micro-Gérer ma propre mémoire, me faisant taper beaucoup trop (hello std::vector<Thingy>::const_iterator it = lotsOfThingys.begin()), et de m'ennuyer avec de longs temps de compilation. Quelle est la meilleure alternative pour une programmation graphique en temps réel? La collecte des ordures est un must (tout comme la capacité d'éviter son utilisation quand c'est nécessaire), et la vitesse doit être compétitive avec C++. Une histoire raisonnable pour accéder aux fichiers est également un must.

(divulgation Complète: j'ai ma propre réponse à cette, mais je suis intéressé de voir ce que d'autres ont trouvé être de bonnes alternatives au C++ pour le travail graphique en temps réel.)

Edit: Merci à tous pour les réponses réfléchies. Étant donné qu'il n'y a vraiment pas de "bonne" réponse à cette question, je ne sélectionnerai pas de réponse particulière. En plus, je choisirais le langage que j'aime comme alternative C++, ce qui ne serait pas juste.

32
demandé sur Bill the Lizard 2008-09-16 18:29:50

30 réponses

je ne le jetez pas de C++. En fait, j'envisagerais D'ajouter Boost à votre bibliothèque C++, ce qui rend le langage beaucoup plus utilisable. Votre exemple devient:

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

Boost a des tonnes d'outils qui aident à faire de C++ un meilleur langage.

18
répondu Martin Cote 2008-09-16 19:08:58

Qu'en est-il D Langage De Programmation?

Quelques liens demandés dans le commentaire:

Win32 Api

à l'Abandon (Multimédia lib)

18
répondu daddz 2009-12-23 14:45:29

C# est un langage agréable qui répond à vos exigences, et il est certainement adapté pour les graphiques, grâce aux efforts de Microsoft pour lui fournir de grands outils et bibliothèques comme Visual Studio et XNA.

17
répondu Drealmer 2008-09-16 14:32:42

la gestion de la mémoire devient facile si vous concevez bien votre système, et utilisez des conteneurs stl et des pointeurs intelligents.

std::vector::const_iterator it = lotsOfThingys.begin()) va devenir beaucoup plus courte si vous utilisez

using namespace std;

typedef vector::const_iterator ThingyConstIter;

et vous pouvez raccourcir considérablement les temps de compilation en fractionnant vos systèmes en modules autonomes, en utilisant des en-têtes précompilés, ou en utilisant L'idiome PIMPL.

15
répondu Dima 2010-01-04 05:06:25

en temps réel + collecte des ordures ne correspondent pas très bien je le crains.

il est un peu difficile de faire des garanties de réponse en temps réel si un éboueur peut intervenir à tout moment et passer une quantité indéterminée de traitement...

13
répondu Pieter 2008-09-16 14:56:24

peut-être une approche hybride. Python et C++ font une bonne combinaison (voir, par exemple, PyGame).

13
répondu James Hopkin 2008-09-16 15:15:31

n'oublions pas de mentionner la nouvelle 'auto' utilisation:

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
répondu MSalters 2009-04-22 08:18:46

une variation de Lisp qui se compile en code machine pourrait être presque aussi rapide que C++ pour ce genre de programmation. Vilain Chien l'équipe a créé une version de Lisp appelée Jeu Orienté Assemblée Lisp, qu'ils ont utilisé pour créer plusieurs titres AAA, y compris les séries Jak et Daxter. Les deux principaux obstacles à une approche Lisp dans l'industrie du jeu seraient la nature enracinée du développement C/C++ (les outils et les ressources humaines sont fortement investis dans C / C++), ainsi que la difficulté de trouver des ingénieurs talentueux qui sont des vedettes à la fois dans le domaine de la programmation de jeux et dans le langage Lisp.

de nombreuses équipes de programmation dans l'industrie sont en train de passer à une approche hybride où le code temps réel, en particulier le code graphique et physique, est écrit en C ou C++, mais la logique de jeu est faite dans un langage de script de niveau supérieur, qui est accessible et modifiable par les programmeurs et les non-programmeurs. Lua et Python

12
répondu Nathan 2008-09-16 17:01:58

en tant que développeur/chercheur/professeur d'applications 3D VR depuis une vingtaine d'années, je dirais qu'il n'y a pas d'alternative (sauf peut-être C). Le seul moyen de réduire la latence et d'activer l'interaction en temps réel est un langage compilé optimisé (par exemple C ou C++) avec accès à une bibliothèque graphique 3D relasible rapide telle Qu'OpenGL. Bien que je sois d'accord qu'il est intéressant d'avoir à tout coder, c'est aussi essentiel pour performanc et l'optimisation.

8
répondu 2009-05-13 10:51:51

je suis tout à fait d'accord avec la mention de C# pour la programmation graphique. Il a le léger inconvénient d'être un langage géré et de permettre au collecteur de déchets règne libre sur votre application est suicide framerate après un certain temps, mais avec quelques allocations de piscine relativement intelligent fait au début de la vie du programme, tous les problèmes réels peuvent être évités.

Plusieurs personnes ont déjà mentionné XNA, qui est incroyablement amical et bien documenté, et je voudrais en écho la recommandation. Je l'utilise personnellement pour mes projets de jeux de loisirs et il m'a très bien traité.

XNA n'est pas la seule alternative, cependant. Il y a aussi SlimDX qui est en constante évolution comme un moyen de fournir un emballage lean de DirectX d'une manière similaire à Managed DirectX (qui a été, je crois, abandonné par Microsoft en faveur de XNA). Les deux sont dignes de la recherche: http://code.google.com/p/slimdx/

5
répondu mittens 2008-09-16 19:31:24

il n'y a pas de véritable alternative pour les gros titres AAA, surtout sur les consoles. Pour les titres plus petits C# devrait faire.

3
répondu yrp 2008-09-16 14:56:14

C# est une bonne réponse ici - et c'est un juste garbage collection (même si vous avez le profil, un peu à changer la façon dont vous gérez les choses maintenant que l'ensemble de la gestion de la mémoire est hors de vos mains), il est simple à utiliser, beaucoup d'exemples et bien documenté. Dans le département 3D il donne le plein soutien pour les shaders et les effets et ainsi - ce serait mon choix.

pourtant, C# n'est pas aussi efficace que C++ et est plus lent à cause de la surabondance, donc si c'est la vitesse et la flexibilité pour utiliser n'importe quelle astuce dans le livre que vous aimez (avec des pointeurs et l'assemblage si vous aimez se salir les mains) - coller à C++ et le prix serait d'écrire beaucoup plus de code comme vous l'avez mentionné, mais avoir le contrôle total sur tout, y compris la gestion de la mémoire.

3
répondu Adi 2008-09-16 15:33:48

je dirais que le langage de programmation D est une bonne option. Vous pouvez créer des liens vers des fichiers d'objets C et vous connecter avec du code C++ à travers des bibliothèques C. D A la collecte des déchets, l'assemblage en ligne, et les développeurs de jeux ont créé des reliures pour les bibliothèques SDL et OpenGL, et travaillent activement sur de nouveaux API de développement de jeux. J'aime D. dommage que mon travail n'exige pas qu'il soit utilisé. : (

3
répondu komma8.komma1 2008-09-16 19:06:19

Comme James (hopkin), pour moi, l'approche hybride est la meilleure solution. Python et C++ est un bon choix, mais un autre style comme C#/c++ fonctionne. Tout dépend de votre contexte graphique. Pour le jeu, XNA est une bonne plate-forme (limitée à win32), dans ce cas C#/c++ est la meilleure solution. Pour la visualisation scientifique, Python / C++ est accepté (comme les fixations vtk en python). Pour le jeu mobile JAVA / C++ peut fonctionner...

2
répondu Johan Moreau 2008-09-16 15:38:53

si vous ciblez Windows, C++ / CLI (le dialecte "managé" de C++ de Microsoft) est une possibilité intéressante, surtout si vous voulez tirer parti de votre expérience C++. Vous pouvez mélanger du code natif (par exemple, des appels vers des bibliothèques de style C) avec du code géré par .NET de façon très transparente, et profiter de .NET GC et des bibliothèques.

en ce qui concerne les préoccupations au sujet de L'impact du GC sur le rendement "en temps réel", je pense qu'elles ont tendance à être exagérées. Le GC. net multi-générationnel est très bon à never prendre beaucoup de temps pour faire une collecte, sauf si vous êtes dans une sorte de situation critique de mémoire faible. J'écris du code .NET qui interagit avec les Bourses de produits dérivés électroniques, où les délais == beaucoup de $$$, et nous n'avons jamais eu de problème lié au GC. Quelques millisecondes, c'est long pour le GC, mais pas pour un humain qui interagit avec un logiciel, même un jeu "en temps réel". Si vous avez vraiment besoin de véritables performances "en temps réel" (pour les dispositifs médicaux, le contrôle des processus, etc. ensuite, vous ne pouvez pas utiliser Windows de toute façon - ce n'est pas un OS en temps réel.

2
répondu McKenzieG1 2008-09-16 19:44:51

beaucoup de moteurs de jeu peuvent s'adapter à votre besoin, je suppose. Par exemple, en utilisant SDL ou Cairo, si la portabilité est nécessaire. Beaucoup de langages de script (venant en général avec la syntaxe facile et la collecte des ordures) ont la liaison à ces toiles.

Flash pourrait être une autre alternative.

je vais juste souligner Traitementun langage et un environnement de programmation open source pour les personnes qui veulent programmer des images, de l'animation, et interaction.

en fait, C'est un wrapper mince autour de Java, ce qui le fait ressembler à un langage de script: il a un IDE (primitif) quand vous pouvez taper quelques lignes de code et frapper Run sans même avoir à sauver le fichier. En fait il enroule le code autour d'une classe et ajoute un appel principal (), le compile et l'exécute dans une fenêtre.

beaucoup de gens l'utilisent pour des expositions en temps réel (VJ et similaires). Il a la puissance et les limites de Java, mais ajoute hors de la boîte un nombre de belles enveloppes (bibliothèques) pour simplifier L'accès à Java2D, OpenGL, SVG, etc.

D'une certaine manière, il est devenu un modèle de langage graphique simple: il existe plusieurs applications qui tentent d'imiter le traitement dans d'autres langues, comme Ruby, Scala ou Python. L'un des plus impressionnants est une implémentation JavaScript, en utilisant le canvas composante implémentée dans Firefox, Safari, Opera, etc.

2
répondu PhiLho 2008-09-24 05:37:53

je vote c++0x. Le support partiel est déjà disponible dans gcc-4.3+ en utilisant le drapeau-std=C++0x.

2
répondu crelbor 2010-01-03 02:33:31

j'ai très bien utilisé C++ pour le moteur, avec L'application écrite en Lua dessus. JavaScript est également très pratique, la dernière génération de moteurs JS basés sur JIT est maintenant disponible (tracemonkey, V8 etc).

je pense que C++ sera avec nous pendant un certain temps encore; même Tim Sweeney n'a pas fait passé à Haskell (pdf) pourtant, autant que je sache :-)

1
répondu sdclibbery 2009-10-05 11:03:16

Java et LWJGL (OpenGL wrapper) ont bien fonctionné pour moi. Si vous cherchez plus d'une bibliothèque de type scene graph comme Orge jetez un oeil à jMonkeyEngine que nous avons utilisé pour créer une application de type google earth (voir www.skapeworld.com). Si vous êtes sensible à la création d'objets, la collecte des ordures n'est pas un problème.

1
répondu Rik 2010-11-24 10:46:42

est-ce que 'C' serait une réponse trop évidente?

1
répondu Martin Beckett 2011-03-17 18:03:04

si votre cible est un PC, je pense que vous pouvez essayer C#, ou embed Lua dans votre application C++ et exécutez des scripts pour des trucs' de haut niveau'. Toutefois, si votre cible est une console, vous gérer votre propre mémoire!

0
répondu R Caloca 2008-09-16 16:46:12

Objectif-C ressemble à un bon match pour vos exigences (la dernière version avec option GC), bien qu'il soit trop dynamique et Smalltalk-like à mon goût.

0
répondu Nemanja Trifunovic 2008-09-16 17:20:38

XNA est votre meilleur pari, je pense. Étant pris en charge par le framework .NET, vous pouvez construire pour une plate-forme Windows ou Xbox 360 en changeant simplement un paramètre dans Game Studio. Mieux encore, tous les outils sont gratuits!

si vous décidez D'aller avec XNA, vous pouvez facilement commencer à utiliser leur guide quickstart XNA guide de Démarrage rapide

Il a été une expérience enrichissante et amusante experiance pour moi jusqu'à présent, et une pause agréable de la gestion de la mémoire en C++.

0
répondu Balk 2008-09-16 17:21:11

la collecte des Ordures est un must (comme c'est la capacité d'éviter son utilisation lors de la nécessaire)

vous ne pouvez pas désactiver un éboueur Temporairement. Vous avez besoin d'une déterministes garbage collector alors. Mais une telle bête vient avec un succès de performance aussi. Je pense que BEA JRockit est une telle bête et tu devrais t'en tenir à Java.

Juste pour commenter votre exemple; typedef est votre ami...

typedef std::vector<Thingy> Thingys;
Thingys::const_iterator it = lotsOfThingys.begin()
0
répondu Markowitch 2008-09-16 19:01:52

ne négligez pas les langues indépendantes dans votre quête. Emergence BASIC de Ionic Wind Software a un moteur DirectX 9 intégré, prend en charge OOP et peut facilement interfacer avec les bibliothèques C.

http://www.ionicwind.com

James.

0
répondu 2009-04-22 07:59:19

Le meilleur environnement pour votre projet est celui que vous obtenez votre tâche fait de la manière la plus rapide possible. Ceci-en particulier pour les graphiques 3D - inclut les bibliothèques.

selon la tâche, vous pouvez vous en tirer avec un piratage directx mineur. Alors vous pouvez utiliser .NET et slimdx. Les langues gérées ont tendance à être plus rapides à programmer et plus faciles à déboguer.

vous avez peut-être besoin d'un très bon moteur 3D? Essayez Ogre3D ou Irrlicht. Vous besoin de qualité de qualité commerciale (on pourrait soutenir que L'Ogre3D offre que) - aller pour Cryengine ou irréel. Avec Ogre3D et Irrlicht, vous pouvez aussi utiliser .NET, bien que les ports ne soient pas toujours à jour et que les plugins ne soient pas inclus aussi facilement que dans les versions c++. Pour Cryengine / Unrealengine vous n'aurez pas un vrai choix je suppose.

vous en avez besoin plus portable? OpenGL pour le sauvetage-bien que vous pourriez avoir besoin d'un peu d'emballage (par exemple SDL).

vous besoin d'une interface graphique? wxWidgets, QT peut-être une possibilité.

vous avez déjà une chaîne d'outils? Vos bibliothèques doivent être capables de gérer les formats de fichiers.

Vous voulez écrire une bibliothèque? C / C++ pourrait être une solution, puisque la plupart du monde peut utiliser des bibliothèques C / C++. Peut-être avec L'utilisation de COM?

il y a encore beaucoup de projets / bibliothèques que je n'ai pas mentionnés (XNA, Boost, ... et si vous voulez créer un programme qui ne non seulement afficher 3D-graphics, vous pourriez avoir d'autres besoins ainsi (Entrée, son, réseau, AI, base de données, GUI, ...)

Pour résumer: Un langage de programmation est un outil pour atteindre un objectif. Il doit être vu dans le contexte de la tâche à portée de main. La tâche a ses propres besoins et ces besoins peuvent choisir la langue pour vous (par exemple, vous avez besoin d'une certaine bibliothèque pour obtenir une fonctionnalité qui prend du temps à programmer et vous ne pouvez accéder à la bibliothèque qu'avec la langue X).

Si vous avez besoin de la on-ne-presque-tous: essayez le C++/CLI (peut-être en combinaison avec C# pour faciliter la syntaxe).

0
répondu Tobias Langner 2009-10-05 11:23:35

Bonne question. Pour ce qui est de "me faire taper beaucoup trop", C++0x semble en traiter la plupart comme il est mentionné:

auto it = lotsOfThingys.commencer. // ))(.. type de déduction, comme dans * ML VS2010beta implémente déjà cela.

en ce qui concerne la gestion de la mémoire - pour des raisons d'efficacité - vous aurez à garder une bonne trace des allocations de mémoire, avec ou sans collecte des ordures (c'est-à-dire, faire des pools de mémoire, réutiliser parfois objet alloué) de toute façon, de sorte que finalement, si votre l'environnement est le garbage collector ou pas, importe peu. Vous devrez aussi appeler explicitement le gc () pour éviter que la mémoire ne se fragmente. Avoir des façons cohérentes de gérer la mémoire est important n'importe où. Rai - est une caractéristique de tueur de C++ Une autre chose - est que la mémoire est juste une ressource, vous devez toujours garder une trace d'autres ressources avec un GC, donc RIAA.

de toute façon, C# est une alternative intéressante à bien des égards, je trouve ça une très belle langue, en particulier de la possibilité d'écrire code de style fonctionnel (la syntaxe cute lambda ->, la syntaxe map/select 'LINQ' etc), donc la possibilité d'écrire du code parallèle; alors que c'est encore un 'standard curly-brackets', quand vous (ou vos collègues) en avez besoin.

0
répondu oyd11 2009-12-23 10:14:34

regardez L'objet Delphi/Pascal et quelques exemples : http://www.delphigamer.com ou http://glscene.cjb.net/

0
répondu philnext 2010-06-18 16:59:42

Vous pouvez regarder Ada. Il n'y a pas de collecteur d'ordures mais ce langage est souvent utilisé pour le système en temps réel nécessitant une grande fiabilité. Cela signifie moins de temps de débogage pour vos applications 3D.

Et, vous pouvez également regarder les Haskell, si vous ne connaissez pas le paradigme fonctionnel, ce langage vous semblera étrange, mais il vaut un peu de votre temps. Tim Sweeney (EPIC Inc) considère ce langage comme une alternative C++.

0
répondu BenjaminB 2012-10-26 06:30:53