Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Écrire un moteur de jeux vidéo en 2017

Le , par LittleWhite

32PARTAGES

8  0 
On voit de plus en plus de développeurs se lancer dans la création d'un moteur de jeux vidéo. Parmi les membres de Developpez.com ont peut citer dragonjoker59 avec Castor3D ou encore zenux. Dans une vision plus large, il y a Banshee Engine, lumixengine et encore plein d'autres.
Bref, c'est une pratique courante ayant plusieurs raisons telles que :
  • l'amusement de programmer un tel moteur ;
  • l'expérience gagnée en le faisant et donc l'augmentation des opportunités de recrutement ;
  • la connaissance parfaite du moteur pour la création d'un jeu et la création d'un moteur dédiée à un jeu précis.

Toutefois, la pratique peut aussi rapidement devenir démoralisante :
  • c'est un projet colossal ;
  • il existe des solutions reconnues (Unity, Unreal Engine, Godot, Game Maker...) ;
  • la création d'un jeu est souvent mise au second plan et n'aboutit que très rarement.


Toutefois, le sujet d'aujourd'hui n'est pas les pour ou les contres d'une telle pratique, mais comment réaliser un moteur de jeux vidéo avec lequel vous aurez des facilités pour créer votre jeu. Sachant que nous sommes en 2017, les outils ont fortement évolué et permettent un meilleur rendement.
Randy Gaul décrit sur son blog une méthode où votre code devient l'éditeur de votre jeu. Ainsi, le C++ peut être perçu tel un langage de script. Pour que cela fonctionne, vous devez suivre quelques bonnes pratiques :
  • mettre l'implémentation du jeu dans une DLL et ainsi permettre le rechargement à la volée de la logique ;
  • garder des temps de compilation très bas ;
  • réimplémenter le polymorphisme (le rechargement de la DLL provoquera une destruction de la vtable). Pour cela, vous pouvez utiliser un identifiant d'entité, qui sera utilisé comme indice pour votre vtable statique :
    Code cpp : Sélectionner tout
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    enum EntityID 
    { 
        eDebugPlayer, 
        // all other types here 
      
        EntityID_Count 
    }; 
      
    struct Entity 
    { 
        EntityID id; 
        Entity* next; 
        Entity* prev; 
    }; 
      
    struct VTABLE 
    { 
        void (*Update)( Entity*, f32 ); 
        void (*Draw)( Entity* ); 
    }; 
      
    #define VTABLE_ENTRY( T ) \ 
        { \ 
            (void (*)( Entity*, f32 ))Update##T, \ 
            (void (*)( Entity* ))Draw##T \ 
        } 
      
    VTABLE g_VTABLE[ EntityID_Count ] = { 
        VTABLE_ENTRY( DebugPlayer ), 
    }; 
      
    STATIC_ASSERT( ArraySize( g_VTABLE ) == EntityID_Count ); 
      
    void Update( Entity* entity, f32 dt ) 
    { 
        g_VTABLE[ entity->id ].Update( entity, dt ); 
    } 
      
    void Draw( Entity* entity ) 
    { 
        g_VTABLE[ entity->id ].Draw( entity ); 
    }
  • charger les ressources à la volée (et non juste le code). Pour cela, vous pouvez mettre en place un thread scannant les ressources afin de détecter les modifications ;
  • le système Entity Component (ECS) est à bannir. Du point de vue de Randy, vous devez vous concentrer sur l'écriture du jeu et faire du refactoring que si nécessaire.


L'objectif global est de réduire les temps d'itération. Vous n'avez qu'à cliquer sur un bouton et le jeu est à jour. Même si vos valeurs sont dans le code, cela ne pose pas de souci tant que votre jeu fonctionne. Si ces valeurs doivent être disponibles pour un game designer, vous allez sûrement embarquer une bibliothèque pour lire un fichier XML (ou autre) et, chaque fois qu'il voudra tester le jeu, il devra recharger le fichier XML (souvent, cela est équivalent à recharger le jeu). De même, le fichier XML ne suffit pas toujours, car le designer voudra possiblement des changements dans les mécaniques de jeu, nécessitant une recompilation du moteur et un relancement du jeu. Cela prend du temps et encore plus si le designer (ou vous-même) devez peaufiner les valeurs. En faisant en sorte que le code devienne éditeur du jeu, ces temps sont réduits. Par contre, le designer devra avoir petite connaissance du C. Rien d'insurmontable pour des gains énormes de productivité.

Randy propose une implémentation du rechargement à la volée de la DLL sur son GitHub.

Voir aussi

CppCon 2016 - Un moteur de jeux avec la bibliothèque standard et C++11
Compilation C++ à l'exécution

Votre opinion

Vous êtes-vous lancé dans la création d'un moteur de jeux vidéo ? Quel a été votre résultat ? Comment avez-vous perçu cette expérience ? Que changeriez-vous à votre démarche ?

Source

Le blog de Randy Gaul

Une erreur dans cette actualité ? Signalez-le nous !

Avatar de Guntha
Membre éprouvé https://www.developpez.com
Le 05/07/2017 à 14:31
On retrouve beaucoup d'idées de Handmade Hero/du Handmade Network là-dedans (désolé de refaire mon évangéliste :p): la recompilation et le rechargement de la DLL du jeu à la volée, réduire les temps de compilation au minimum, une aversion en général pour l'orienté objet :p

De mon côté, quand j'étais encore à l'école et quand je venais d'en sortir, j'essayais de faire un moteur "intelligemment" en utilisant de l'héritage à tout va, je me prenais la tête pour trouver la meilleure approche possible (quel que soit le jeu qui tourne en dessous :p ), et maintenant je code le jeu d'abord (quitte à avoir des appels OpenGL directement dans le code du jeu), pour ensuite remonter dans le moteur les fonctionnalités qui doivent l'être. Même si je n'ai pas beaucoup de temps pour ça, ça m'a permis d'en faire plus qu'avec l'ancienne "méthode" (et puis l'expérience pro aide beaucoup...).
5  0 
Avatar de yildiz-online
Expert confirmé https://www.developpez.com
Le 07/11/2018 à 9:53
Si tu ne connais pas les possibilités des langages les plus communs, c'est un peu tôt pour vouloir créer un moteur de jeu.

Un jeu est une application complexe qui touche plusieurs domaines, un moteur de jeu est encore plus complexe vu qu'il doit pouvoir supporter plusieurs jeux, en simplifiant leur création.

Commence par faire 2 ou 3 petits jeux tout simples (tetris, pong, arkanoid) qui ne sont pas des clones les uns des autres pour avoir plusieurs cas de figures (et bien sur qui représentent le type de moteur que tu veux créer), et une fois ceci achevé, essaie d'en extraire les composants communs, et fais un nouveau jeu à partir de ces composants.

Si ça passe, tu es sur la bonne voie, continue comme ça jusqu'à avoir un framework/librairie de plus en plus complet, refactor tes premiers jeux pour utiliser le moteur et continue ce développement itératif.
En parallèle tu peux développer des outils pour simplifier l'utilisation du moteur(sdk avec interface graphique).
4  0 
Avatar de yildiz-online
Expert confirmé https://www.developpez.com
Le 07/11/2018 à 17:16
Citation Envoyé par Mat.M Voir le message
Mais comme il est affirmé souvent sur ce forum il vaut mieux prendre le C++ pour des questions de performances.
Si c'est une question de perf, y a beaucoup plus de chances qu'un débutant mette le pc à genoux parce que ses algos sont mauvais, ses assets non optimisés, plutôt qu'à cause du langage.
Java reste très largement suffisant en terme de performance et c'est un langage bien plus productif que c++, tout comme kotlin est bien plus productif que java , et python plus que kotin etc, etc...
Bref, mieux vaut choisir quelque chose avec lequel on pourra bosser plutôt que de se mettre des limitations d'avances sur des assomptions peu probables.

Citation Envoyé par Mat.M Voir le message

Surtout que pour optmiser du code et faire du code GPU sous Open GL ou D3D ça ne se fait qu'en C++ et HLSL.
Peut-être qu'il existe des classes Java pour faire ça mais ça risque d'être moins performant.
L'optimisation ne se fait qu'à la fin, le temps qu'il y arrive il sera déjà à la 3e ou 4e itération de son moteur et aura sans doute changé de langage entre temps.
Le code HLSL (ou GLSL) est compilé par un compilateur indépendant, aucun impact du langage appelant.
4  0 
Avatar de stopviolence
Inactif https://www.developpez.com
Le 05/07/2017 à 14:15
Citation Envoyé par LittleWhite Voir le message
[*]c'est un projet colossal ;
J'dirais que ça dépend de l'ambition du projet.

J'ai causé avec dragonjoker qui cherche de l'aide sur son castor3d, qui est pour l'instant à l'état de moteur d'affichage de polygones, j'aurais bien apporté ma patte pour y ajouter des trucs à moi histoire de commencer à transformer ça en moteur de jeu, seulement j'en aurais pour minimum 1 an de travail à plein temps.

Et si mes souvenirs sont bons je crois bien que ça fait presque 10 ans qu'il bosse dessus...

Le blème c'est que pour faire un moteur de jeu 3d faut les moyens des boîtes qui font ça, des millions de budget, une équipe d'ingénieurs, 5 ans de travail à plein temps... c'est clair que je me lancerais pas là dedans. Moi j'utilise des moteurs d'affichage déjà fonctionnels et si vraiment je dois tripoter un peu de bas niveau c'est juste pour y rajouter des outils qui manquent (et rien que ça c'est déjà une masse de taf).

Sinon je fais mes petits moteurs 2d dans mon coin et là ça va c'est de l'ordre du faisable pour un type qui code tout seul.
2  0 
Avatar de super_navide
Nouveau Candidat au Club https://www.developpez.com
Le 05/07/2017 à 15:15
Moi j'ai créé mon propre moteur www.power-kube.com qui continue d'évolué ....
ajoute de la physique

ajout inteligence de deplacement (les enemies explore tous seul comme des grands )


Il est sur que mon premier jeux était pas terrible et était la juste pour tester le moteurs et les différents outils.
Mais la je bosse sur power kube 2 et je pense qu'il sera meilleur car le moteur est fini et que j'ai plus qu'a penser et a me focaliser sur le jeux en lui même.
En parallèle je me suis mis a godot que je trouve génial...
3  1 
Avatar de Kannagi
Expert éminent https://www.developpez.com
Le 07/11/2018 à 8:40
Si tu veux faire un moteur 3D , utilise le langage qui te plaît le plus , même si le C++ est le plus indiqué pour la tache (dans le sens où il est compilé donc assez performant).
2  0 
Avatar de yildiz-online
Expert confirmé https://www.developpez.com
Le 05/07/2017 à 17:15
jbullet a pas été mis à jour depuis des lunes (et le sera pas vu que l'auteur compte pas bosser sans être payé...)

Avec du JNI tu peux te débrouiller sur bullet natif, c'est assez simple, je l'ai fait sur mon moteur:

https://bitbucket.org/yildiz-engine-...physics-bullet
1  0 
Avatar de dourouc05
Responsable Qt & Livres https://www.developpez.com
Le 05/11/2018 à 22:23
Citation Envoyé par Syrotix Voir le message
je ne sais pas en quel language ...
Citation Envoyé par super_navide Voir le message
je reste en tous java .
1  0 
Avatar de Kannagi
Expert éminent https://www.developpez.com
Le 19/11/2018 à 16:36
Si ton but est de faire un jeu alors utilise Unity ou Unreal...
Pour les connaissances bah un moteur de jeux vidéo reste un abus de langage , vu que c'est plus ou moins un framework assez spécialisé.
Et un framework est un ensemble de fonction/classes , avec une architecture précise.
Et ces ensembles de fonctions/classes sont fait pour faire un jeu , tu pourrais avoir que des fonctions pour le rendu mais ça serait un moteur de rendu et non un jeu , quand tu as un ensemble qui gère l'ensemble des besoins d'un jeux vidéo qui est le rendu , les collisions , le son , gérer le fenêtrage/les event , les script , les outils de façon unifié tu aura ton moteur de Jeux vidéo , pour cela qu'on le conseille pas au premier débutant...
1  0 
Avatar de LittleWhite
Responsable 2D/3D/Jeux https://www.developpez.com
Le 05/07/2017 à 14:39
Oui, Randy s'inspire pas mal de Handmade Hero (il le dit clairement).
0  0