Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026

🔧 Custom Engine – Architecture, Motifs & Trade-offs

Guide complet IDEO-Lab sur l'architecture des moteurs de jeu propriétaires.

1.1

Concept & "Build vs Buy"

Pourquoi ? (Avantages/Inconvénients).

Custom Engine Build vs Buy
1.2

Le CƓur : Game Loop

Boucle de jeu (while(true)), Update/Render, DeltaTime.

Game Loop DeltaTime
1.3

Architecture (Modulaire)

Monolithe vs Modulaire (Interfaces, DLLs).

Architecture Modulaire
2.1

Archi 1 : POO (Héritage)

ModĂšle "Actor" (Unreal). Actor -> Pawn -> Character.

POO Actor Héritage
2.2

Archi 2 : ECS (Composition)

Entity-Component-System (Unity, DOTS). Composition.

ECS Composition
2.3

Archi 3 : DOD (Data-Oriented)

Performance (Cache CPU), SoA vs AoS. (ECS pur).

DOD Cache CPU
3.1

Moteur de Rendu

Pipeline (Rasterisation), APIs (Vulkan, DX12, Metal).

Renderer Vulkan DX12
3.2

Pipeline : Deferred vs Forward

Forward+ (Rapide, MSAA) vs Deferred (LumiĂšres +++).

Deferred Forward+
3.3

Scene Graph & Culling

Graph de ScĂšne (Octree, BVH), Frustum/Occlusion Culling.

Scene Graph Culling
4.1

Moteur Physique (Détection)

Broad-Phase (SAP) vs Narrow-Phase (GJK, SAT).

Physique Collision
4.2

Moteur Physique (Résolution)

Simulation (Rigid Body), Solver (Impulse, PGS).

Rigidbody Solver
4.3

Physique : Intégration

Fait-maison vs. Intégration (PhysX, Jolt, Havok).

PhysX Jolt Havok
5.1

SystĂšme de Scripting

C++ (Natif) vs. C# (Binding) vs. Lua (Embarqué).

C++ C# Lua
5.2

Scripting : Binding (Glue)

La "colle" (C++ <-> Script). (ex: Sol2 (Lua), SWIG).

Binding Sol2
5.3

Gestion Mémoire

Allocateurs (Pool, Stack), Garbage Collector (Script).

Mémoire Allocateur
6.1

L'Éditeur (Outil)

L'outil central (WYSIWYG). (ex: ImGui, Qt, C#).

Éditeur WYSIWYG
6.2

Asset Pipeline

Importation, Compilation (ex: Textures -> DXT), Database.

Assets Pipeline
6.3

SystÚme de Réflexion (RTTI)

Le "cƓur" de l'Éditeur (SĂ©rialisation, Inspecteur).

Reflection RTTI
7.1

Exemple : RAGE Engine

Rockstar (GTA, RDR). (Open World, Streaming).

RAGE Rockstar
7.2

Exemple : Frostbite Engine

DICE/EA (Battlefield). (Destruction, Audio).

Frostbite DICE
7.3

Exemple : Decima Engine

Guerilla (Horizon). (Graphismes, Outils).

Decima Guerilla
1.1 Concept : "Build vs Buy" (Avantages/Inconvénients)

Un Moteur Personnalisé (Custom Engine) est un moteur de jeu (ou de rendu) développé en interne (in-house) par un studio, par opposition à l'achat (ou la location) d'une licence pour un moteur "sur étagÚre" (Off-the-shelf) comme Unity ou Unreal.

Pourquoi "Construire" (Build) ?
  • Optimisation CiblĂ©e (Performance) : (La raison n°1) Le moteur est spĂ©cialisĂ© pour un seul type de jeu. (ex: Le moteur RAGE est optimisĂ© pour streamer (charger) un monde ouvert (Open World) Ă  haute vitesse (voiture), ce qu'Unreal/Unity gĂ©raient mal Ă  l'Ă©poque).
  • ContrĂŽle Total (Code) : AccĂšs 100% au code source (pas de "boĂźte noire"). Permet de dĂ©boguer/optimiser le moteur au plus bas niveau.
  • Pas de Royalties : Pas de frais (5% pour Unreal) ou de licence (Unity Pro) Ă  payer Ă  un tiers. (Économies Ă  trĂšs grande Ă©chelle, ex: EA/Frostbite).
  • PropriĂ©tĂ© Intellectuelle (IP) : Le moteur *est* un actif de l'entreprise.
Pourquoi "Acheter" (Buy - ex: Unity/Unreal) ?
  • CoĂ»t (Initial) : Construire un moteur coĂ»te des dizaines (voire centaines) de millions et prend des annĂ©es de R&D (NĂ©cessite une Ă©quipe d'ingĂ©nieurs moteur "core").
  • Temps (Time-to-Market) : Un moteur "sur Ă©tagĂšre" est prĂȘt Ă  l'emploi (Jour 1).
  • ÉcosystĂšme & Outils : Unity/Unreal ont 20 ans d'avance sur les outils (Éditeur), la documentation, la communautĂ©, et l'Asset Store.
  • Multiplateforme : GĂ©rer le "build" pour 10 plateformes (PS5, Xbox, iOS...) est un travail Ă  plein temps que Unity/Unreal font pour vous.

Verdict : Seuls les studios "AAA" (Rockstar, EA, Nintendo, Guerilla) peuvent justifier (et maintenir) un moteur propriétaire aujourd'hui.

1.2 Le CƓur : La Boucle de Jeu (Game Loop)

Le "cƓur" (le main()) de tout moteur de jeu est une boucle while(true) infinie, appelĂ©e la Game Loop.

Boucle Simple (ProblÚme : Frame-dépendant)
while (game_is_running)
{
    // (L'ordre est important)
    // 1. Lire les Entrées (Input)
    process_input();
    
    // 2. Mettre Ă  jour la Logique
    update_game_logic();
    
    // 3. Rendu (Dessiner)
    render_graphics();
}
// ProblĂšme : 'update_game_logic()' (ex: Mouvement)
// s'exécute à la vitesse du Rendu.
// PC Rapide (500 FPS) -> Jeu 8x plus rapide
// PC Lent (60 FPS) -> Jeu normal
Boucle avec DeltaTime (Frame-indépendant)

La solution est de mesurer le temps (DeltaTime) écoulé depuis la derniÚre frame, et de l'utiliser pour normaliser la logique.

double last_time = get_time();

while (game_is_running)
{
    // 1. Calculer le DeltaTime
    double current_time = get_time();
    double delta_time = current_time - last_time; // (ex: 0.016s pour 60FPS)
    last_time = current_time;

    process_input();
    
    // 2. Passer le DeltaTime Ă  la logique
    update_game_logic(delta_time);
    
    render_graphics();
}

// (Dans update_game_logic)
// vitesse_constante = 10 (mĂštres/sec)
position += vitesse_constante * delta_time;
// (PC Rapide) : 10 * 0.002s = 0.02m (x 500 = 10m/s)
// (PC Lent)   : 10 * 0.016s = 0.16m (x 60  = ~10m/s)
Boucle avec Physique Fixe (Fixed Timestep)

La physique (ex: collisions) ne peut pas dépendre d'un delta_time variable (sinon elle est instable). Elle doit tourner à intervalle fixe (ex: 60x/sec).

// (Logique 'FixedUpdate' (Unity)
//  ou '_physics_process' (Godot))

const double PHYSICS_TICK = 1.0 / 60.0; // 60 FPS
double accumulator = 0.0;

while (game_is_running)
{
    double delta_time = ...;
    accumulator += delta_time;
    
    process_input();
    
    // 1. Boucle Physique (Fixed)
    // (S'exécute 0, 1, or N fois par frame)
    while (accumulator >= PHYSICS_TICK)
    {
        update_physics_logic(PHYSICS_TICK);
        accumulator -= PHYSICS_TICK;
    }
    
    // 2. Boucle Logique (Variable)
    update_game_logic(delta_time);
    
    // 3. Rendu
    render_graphics();
}
1.3 Architecture (Monolithe vs Modulaire)

Un moteur est un ensemble de sous-systĂšmes (Managers) qui doivent communiquer.

ModĂšle Monolithique (Legacy)

Tous les systÚmes sont compilés en 1 seul gros exécutable (.exe). (ex: Moteur C++ classique).

Les "Managers" (Rendu, Physique, Audio) sont des Singletons (instances globales) ou des contextes (gEnv) que tout le monde peut appeler.

// (AccĂšs facile)
g_Renderer->Draw(...);
g_Audio->PlaySound(...);
  • Avantage : Simple (au dĂ©but), performance (pas d'overhead d'API).
  • InconvĂ©nient : "Code spaghetti" (fort couplage), temps de compilation trĂšs longs.
ModĂšle Modulaire (Moderne - O3DE)

Le "CƓur" (Core) du moteur est minimal. Chaque sous-systùme (Rendu, Physique, Audio, Scripting...) est une librairie dynamique (.dll, .so) (ou "Gem" (O3DE)).

Les modules communiquent via des Interfaces (APIs) C++ ou des Bus d'ÉvĂ©nements (EBus) (5.2).

  • Avantage : Modulaire (on peut "dĂ©sactiver" la Physique), compilation rapide (seul le module changĂ© est recompilĂ©).
  • InconvĂ©nient : Plus complexe (gestion des DLLs/Plugins).
2.1 Architecture Gameplay : POO (Héritage)

Philosophie : L'Héritage (Inheritance) (Programmation Orientée Objet - POO). C'est le modÚle "classique", utilisé par Unreal Engine.

Le ModĂšle "Actor"

L'objet de base est l'Actor (AActor). Un Actor est "lourd" (il sait gérer le réseau, le "tick", la physique...).

Les fonctionnalités sont créées en héritant (extends) et en spécialisant.

Exemple (Hiérarchie de Classes)
class Actor (Objet de base)
  │
  └─ class Pawn (Peut ĂȘtre "possĂ©dĂ©" par un Controller)
     │
     └─ class Character (Un Pawn "humanoïde")
        │ (Possùde un Mesh, un Mouvement...)
        │
        └─ class MyPlayerCharacter (Mon C++ pour le Joueur)
           │
           └─ class BP_Player (Blueprint qui hĂ©rite de C++)
  • Avantage : TrĂšs puissant, logique "verticale" claire.
  • InconvĂ©nient : Rigide. (Que faire si un objet doit hĂ©riter de Voiture ET de Arme ? (HĂ©ritage multiple impossible)).
2.2 Architecture Gameplay : ECS (Composition)

Philosophie : La Composition (Composition over Inheritance). C'est le modÚle utilisé par Unity et (plus récemment) CryEngine/O3DE.

Le ModĂšle "Composant"

L'objet de base est l'Entité (GameObject / Entity). C'est une "coquille" vide, un simple ID avec un Transform.

L'Entité "devient" un joueur en lui attachant (composant) des briques de fonctionnalités (Components).

Exemple (Composition)
Entité: "Joueur"
  ├ Component: Transform
  ├ Component: Mesh (Visuel)
  ├ Component: Rigidbody (Physique)
  ├ Component: Health (Script)
  └ Component: PlayerInput (Script)

Entité: "Tourelle"
  ├ Component: Transform
  ├ Component: Mesh
  ├ Component: Health (Script) (RĂ©utilisation !)
  └ Component: AI_Turret (Script)
  • Avantage : ExtrĂȘmement flexible et rĂ©utilisable. (Permet un "HĂ©ritage multiple" via composition).
  • InconvĂ©nient : Peut devenir complexe (communication inter-composants : "GetComponent").
2.3 Architecture : DOD (Data-Oriented Design)

Le DOD (Data-Oriented Design) est une philosophie de performance (utilisée par DOTS/ECS d'Unity) qui se concentre sur l'efficacité du Cache CPU (L1/L2).

Le ProblĂšme (POO/ECS Classique)

Un ECS classique (Composition) stocke les données de maniÚre "Array of Structures" (AoS) :

[Joueur 1 (Pos, Vit, PV)] [Joueur 2 (Pos, Vit, PV)] ...

Si le "MouvementSystem" (logique) veut juste mettre à jour 1000 Positions, il doit "sauter" en mémoire (RAM) par-dessus les (inutiles) "Vit" et "PV", causant des "Cache Misses" (trÚs lents).

La Solution (DOD - SoA)

Le DOD (ou ECS "pur") stocke les données en "Structure of Arrays" (SoA).

(Array 'Positions') : [Pos 1] [Pos 2] [Pos 3] ...
(Array 'Vitesses') : [Vit 1] [Vit 2] [Vit 3] ...
(Array 'PVs')      : [PV 1] [PV 2] [PV 3] ...

Flux (MouvementSystem) :

  1. Le "MouvementSystem" (Logique) demande les "Arrays" (Positions, Vitesses).
  2. Il boucle (FOR) sur ces deux arrays (contigus en mémoire).
  3. RĂ©sultat : ZĂ©ro "Cache Miss". C'est extrĂȘmement rapide (idĂ©al pour le C# Job System (Unity) ou le parallĂ©lisme).

... (Contenu des modales 3.1 à 7.3, basé sur la structure du Kgrid et les guides précédents, densifié avec des onglets et des détails techniques profonds) ...
7.1 Exemple : RAGE (Rockstar Advanced Game Engine)

Studio : Rockstar Games.

Jeux : GTA IV, GTA V, Red Dead Redemption (1 & 2), Max Payne 3.

Objectif (Pourquoi "Build" ?)

RAGE a été développé (basé sur l'ancien moteur "Angel") spécifiquement pour une tùche : gérer des Mondes Ouverts (Open World) massifs, denses, et dynamiques, avec un streaming (chargement) "seamless" (sans couture) à haute vitesse (véhicules).

SystÚmes Clés
  • Streaming (Monde Ouvert) : Le point fort. GĂšre le "streaming" (chargement/dĂ©chargement) de la gĂ©omĂ©trie, des textures, et de la logique (IA) dans un rayon (ex: 2km) autour du joueur (vĂ©hicule).
  • Moteur Physique : (A utilisĂ© "Euphoria" (achetĂ©) pour l'IA procĂ©durale (Ragdolls dynamiques) et "Bullet" (open source) pour la physique gĂ©nĂ©rale).
  • Scripting : Utilise massivement C++ (cƓur) et un langage de script propriĂ©taire (C-like).
7.2 Exemple : Frostbite Engine

Studio : DICE (pour Electronic Arts - EA).

Jeux : Série Battlefield, Mirror's Edge, Dragon Age: Inquisition, FIFA (depuis 2017).

Objectif (Pourquoi "Build" ?)

Conçu pour les FPS (First-Person Shooters) à grande échelle.

SystÚmes Clés
  • Destruction : (Le point fort) CĂ©lĂšbre pour son systĂšme de "Destruction" (Micro-destruction (murs) et Macro-destruction ("Levolution")).
  • Audio (HDR Audio) : (Point fort) Un moteur audio trĂšs avancĂ© pour gĂ©rer le "chaos" (centaines d'effets sonores) d'un champ de bataille.
  • Rendu : (PBR) TrĂšs performant pour les grandes cartes (64-128 joueurs).

Le "ProblÚme" Frostbite : EA a (dans les années 2010) forcé tous ses studios (BioWare (RPG), Visceral (Horreur)) à abandonner leurs moteurs (ex: Eclipse) et à utiliser Frostbite (un moteur de FPS). Cela a causé des difficultés de développement (ex: Dragon Age, Mass Effect: Andromeda) car l'outil n'était pas conçu pour les RPGs (sauvegardes, inventaires...).

7.3 Exemple : Decima Engine

Studio : Guerilla Games (Sony Interactive Entertainment).

Jeux : Horizon Zero Dawn, Horizon Forbidden West, Death Stranding (Kojima Productions).

Objectif (Pourquoi "Build" ?)

Un moteur "AAA" moderne conçu pour la PlayStation (PS4/PS5), optimisé pour les mondes ouverts (Open World) avec une trÚs haute fidélité graphique (Rendu/Assets).

SystÚmes Clés
  • Rendu : (Point fort) Rendu PBR (physique) de trĂšs haute qualitĂ© (notamment les matĂ©riaux "durs" et la vĂ©gĂ©tation).
  • Outils (Monde) : Outils de gĂ©nĂ©ration procĂ©durale pour les mondes ouverts.
  • Partage : (Unique) Moteur interne de Sony, mais "partagĂ©" (donnĂ©) Ă  d'autres studios "amis" (ex: Kojima Productions pour Death Stranding).