Comment Megapop a construit l’océan vivant de Life Below avec le système de composants Entity

Cette page a été traduite automatiquement pour faciliter votre expérience. Nous ne pouvons pas garantir l'exactitude ou la fiabilité du contenu traduit. Si vous avez des doutes quant à la qualité de cette traduction, reportez-vous à la version anglaise de la page web.
Découvrez comment Megapop a construit son city-builder sous-marin dense et en croissance organique en tirant parti des performances et de l'évolutivité de l'Entity Component System (ECS).
LE DÉFI :
Simulation de dizaines de milliers de créatures marines en interaction, d'un planificateur de tâches d'IA personnalisé et de coraux dynamiques - le tout sans goulot d'étranglement du CPU
PLATEFORMES:
PC (vapeur)
LIEU :
Oslo, Norvège
TAILLE DE L'ÉQUIPE :
14 personnes à temps plein, 3 pigistes
Comment un jeu comme Life Below parvient-il à simuler un écosystème océanique dense et vivant sans faire fondre le PC du joueur ?
Le nouveau « récif-builder » de Megapop demande aux joueurs de restaurer un environnement océanique mourant. Au lieu de placer des bâtiments en béton sur une grille, les joueurs agissent comme la nature elle-même, cultivant les coraux de manière organique et gérant le fragile écosystème pour attirer plus de 55 espèces marines réelles, des poissons clowns et des crabes aux dauphins et aux loutres de mer.
Pour atteindre l'esthétique et le gameplay dynamiques de Life Below, il fallait s'engager pleinement dans une conception axée sur les données. En traitant ce réseau de poissons, d'animaux sauvages et de travailleurs PNJ comme des données pures - des nombres en mémoire contiguë plutôt que des GameObjects complexes - l"équipe a résolu des défis complexes autour des comportements des boid, de l"échelle de rendu, de l'audio spatial et de la simulation d"écosystème, pour offrir une expérience performante sur PC.

Les résultats :
- Bancs simulés de jusqu'à 250 000 poissons du même type lors de tests d'effort précoces
- Maintient 60 FPS sur un RTX 3060 avec des milliers de créatures actives en fin de partie
- Prend en charge plus de 1 300 animaux en interaction à 30 FPS sur des machines de niveau inférieur
- A obtenu un taux d'approbation de 97,2% de la part des bêta-testeurs professionnels
- Gère plus de 15 000 entités et plus de 450 systèmes dans une sauvegarde de fin de partie de 14 heures - et fonctionne sans problème
- Mention honorable dans la bourse Unity for Humanity 2025

S ' engager vers une approche axée sur les données
Megapop a pris la décision de construire Life Below entièrement sur ECS pendant la préproduction. « ECS nous permet de structurer le jeu comme autant de petits systèmes qui fonctionnent ensemble, plutôt que de s’appuyer sur de grandes hiérarchies de classe », explique Jørgen Tharaldsen, fondateur et PDG du studio. « Cela facilite la construction de simulations complexes en composant le comportement à partir de pièces plus petites. »
Passer d’un paradigme de développement orienté objet à un paradigme orienté données a été un changement majeur pour l’équipe Megapop. Pour combler le fossé des connaissances, ITR – responsable technologique de Life Below et défenseur initial de l’ECS dans le cadre du projet – s’est appuyé sur une variété de ressources, allant de la documentation ECS officielle d’Unity et des échantillons ECS, aux conseils concrets de la communauté Unity Discord et de YouTube. « Le Hot Path Show organisé par Turbo Makes Games a également été particulièrement utile pour plus d’informations de niche sur DOTS et ECS », explique ITR.
Quand le programmeur Simen Wiig a rejoint Megapop environ 18 mois avant le lancement de Life Below, l’apprentissage de l’ECS a été intégré à son intégration. « L’essentiel était de m’enrouler la tête autour de la pensée orientée données au lieu de la manière habituelle de penser orientée objet », dit-il. « Une fois que j’ai eu ça, j’ai beaucoup aimé comment avoir des composants et des entités m’a aidé à mieux structurer mon code. »
ITR identifie le principe qui a fait la plus grande différence pour l'embarquement ECS: « Adoptez l’approche axée sur les données au lieu d’essayer de mélanger trop d’architectures différentes. En gardant les systèmes petits et ciblés, le projet est plus facile à faire évoluer à mesure que de nouvelles fonctionnalités sont ajoutées. »

La vie en dessous | Megapop | Jeux Kasedo
Créer un planificateur de tâches pour les PNJ
Dans Life Below, les joueurs ne donnent pas d'ordres directs à leurs travailleurs PNJ - une équipe de sprites aquatiques qui entretiennent le récif. Au lieu de cela, le joueur fixe des objectifs (placer un corail ici, récolter ces ressources) et un planificateur de tâches personnalisé assigne automatiquement le travailleur optimal pour chaque tâche.
L'ordonnanceur s'exécute au sein d'un système compilé Burst et fonctionne en trois étapes: tout d'abord, il utilise ECS pour collecter de larges informations sur la disponibilité des travailleurs, l'emplacement des ressources et les tâches en attente; ensuite, un algorithme sélectionne les tâches hautement prioritaires tout en maintenant la distribution entre les types de tâches équilibrée; enfin, il récupère des informations détaillées en utilisant ECS pour trouver le meilleur travailleur et planifier chaque étape. « Nous utilisons la programmation par fonction hiérarchique pour nous assurer qu'il est facile d'ajouter de nouvelles tâches tout en veillant à ce que le jeu ne se retrouve pas dans un état corrompu », explique ITR.
Une centaine de travailleurs opèrent simultanément en pointe en fin de match. Le système est monothreadé – non pas en raison d’une limitation technique, mais parce que chaque attribution de tâche dépend du résultat de la précédente. « C'est similaire au planificateur de tâches d'un système d'exploitation », dit ITR, « sauf que nous savons à peu près combien de temps une tâche prendra avant de la planifier, au lieu de l'avoir après. »

La vie en dessous | Megapop | Jeux Kasedo
Simuler des comportements complexes
De nombreux jeux implémentent un comportement de flocage en utilisant des solutions GPU ou Burst simples. Pour Life Below, Megapop avait besoin d'espèces pour chasser, fuir et interagir de manière dynamique, notamment lors de rencontres rapprochées face caméra avec le joueur.
« Pour les simulations de boid simples, il est facile de lancer quelque chose en utilisant Burst ou les calculs GPU », explique Jørgen. « Mais nous voulions un comportement plus complexe où différentes espèces interagissent, et même où vous interagissez avec la faune en vue rapprochée de la caméra. »
À l’aide du Job System, l’équipe a séparé les parties parallélisables de la logique du boid – les mises à jour de position de base et les calculs de séparation – des interactions complexes de ramification comme la poursuite des prédateurs. Toutes les espèces ne sont pas aussi exigeantes en matière de performance : les mangeoires de fond comme les crabes sont relativement bon marché à simuler, tandis que les prédateurs comme le poisson-lion évaluent plusieurs conditions à chaque cadre pour chasser, chasser et attaquer d'autres espèces.
Gérer l'audio spatial à grande échelle
Faire travailler l'audio spatial dynamique aux côtés de milliers d'entités actives a été l'un des défis les plus difficiles du projet. La solution, développée par le programmeur Fingar Bøen, consistait à regrouper les créatures proches en grappes et à piloter l'audio à partir du comportement du groupe plutôt que des poissons individuels.
« Des facteurs comme les espèces, la taille du groupe, le mouvement et le moment aident à déterminer quand les sons doivent jouer », explique Fingar. « Cela nous permet de représenter des milliers de créatures tout en gardant le paysage sonore naturel et le coût du processeur gérable. »
ECS Jobs et Burst prennent en charge la phase de collecte des données – collecte des positions des entités et regroupement efficace en parallèle – tandis que le code managé qui déclenche les événements audio est maintenu aussi minimal que possible. L'équipe travaille également à échanger les identifiants d'événements FMOD basés sur des chaînes de caractères contre des GUID, ce qui réduira l'allocation des ordures et rendra le pipeline audio Burstable plus efficace.
Rendre un récif vivant
La visualisation de milliers d'entités nécessite un pipeline de rendu hautement optimisé. Megapop utilise des textures d'animation Vertex (TVA) pour les mouvements complexes des animaux tels que les cycles de nage, et des animations procédurales pour les poissons de plus petit banc. L'environnement réagit également à la santé de l'écosystème : les coraux affichent dynamiquement des états de croissance, de stress et de dégâts des algues basés sur des paramètres transmis directement par ECS.
Entités Graphiques et GPU instancing
L'équipe a utilisé le GPU instancing dès le début du développement, d'abord par le biais d'appels API graphiques personnalisés avant de migrer vers le package graphique Entities officiel d'Unity. Le changement n'a pas été provoqué par une amélioration des performances - les deux approches sont basées sur la même technologie sous-jacente - mais Entities Graphics a rendu le système beaucoup plus facile à utiliser et a considérablement amélioré l'intégration ECS. « C’était beaucoup plus facile à utiliser et ça fonctionnait beaucoup mieux avec ECS », explique Adam Hove, artiste technique et programmeur chez Megapop.
Entities Graphics prend en charge les composants ECS personnalisés qui téléchargent automatiquement leurs données sur le GPU en tant que valeurs par entité à chaque trame, mais uniquement lorsque ces valeurs ont réellement changé. Cela signifie que des centaines d'entités stables ne rechargent pas inutilement les données tampon. L'instancing GPU lui-même garantit que le fait d'avoir des centaines de coraux et de décorations dispersées à l'écran ne multiplie pas les appels de tirage : « Avec l’instancing GPU, vous pouvez rendre des milliers de coraux en un seul appel de tirage », explique ITR. « Donc, si nous avons cinq coraux d’un seul type à l’écran, ou cinq mille d’entre eux, cela rend tout aussi vite. »

La vie en dessous | Megapop | Jeux Kasedo
Coraux dynamiques via Shader Graph
Chaque entité corallienne détient des composants ECS pour la santé, la croissance des algues et l'état de stress. Grâce à l'attribut MaterialProperty d'Entity Graphics, ceux-ci se téléchargent automatiquement sur le GPU et pilotent les paramètres Shader Graph – produisant ainsi des changements visibles comme le blanchiment, la coloration au stress et la propagation des algues sans aucune gestion manuelle des matériaux. Shader Graph a également ouvert le travail aux artistes qui n'écrivent pas HLSL, en les laissant itérer directement sur les résultats visuels et voir l'effet des changements en temps réel.
Débogage de code orienté données
Le débogage d'une base de code orientée données est une discipline différente du débogage de projets Unity standard, et l'expérience de Megapop avec Unity 6 reflète à quel point l'outillage a mûri. « 6.0 a ajouté la fenêtre de recherche, les marqueurs de profileur et le graphique de rendu, qui ont tous été très utiles pour l’optimisation », explique ITR.
L ' équipe est passée à Unity 6.3 avant sa publication et a noté que des outils comme la fenêtre Entities Hierarchy et le débogueur natif étaient devenus sensiblement plus stables dans la dernière version de LTS prise en charge.
La hiérarchie des entités était essentielle pour inspecter l'état de l'entité au moment de l'exécution, tandis que les fonctionnalités spécifiques à JetBrains Rider - y compris la possibilité de voir les informations sur les composants pour des entités spécifiques tout en passant par le code - rendaient le débogueur natif nettement plus utile. ECS Journaling a aidé à identifier quel système a changé un composant de manière inattendue et a signalé les écritures inutiles lors de l'optimisation.
Pour les graphiques, le Frame Debugger et RenderDoc ont été combinés avec le système de rendu graphique d'Unity 6 pour tracer exactement où les ressources du GPU étaient touchées.
Améliorer les performances avec Burst
Une sauvegarde de 14 heures soumise sous forme de rapport de bug contenait 15 000 entités et plus de 450 systèmes actifs – et fonctionnait toujours sans problème à 60 FPS. La simulation complète de l'écosystème s'horloge à environ 0.5ms de temps processeur par image dans un scénario de fin de jeu typique, ce qui importe car le jeu prend en charge l'accélération du temps qui exécute la mise à jour fixe plusieurs fois par image de rendu.
Burst est au cœur de la frappe de ces chiffres: le désactiver fait que la simulation prend plus de trois fois plus de temps par image. « Pour de nombreux systèmes, nous avons constaté que Burst suffisait à l’optimiser », explique ITR, « Jobs était mieux adapté à des parties spécifiques du code parallélisables qui itéraient sur de nombreuses entités ».
Dans les tests de résistance à une seule espèce: 3 500 crabes à 60 FPS sur l'ordinateur personnel d'ITR vieux de huit ans, et 7 000 crabes ou 5 500 poissons-clowns à 50 FPS sur un ordinateur portable de travail haut de gamme avec des interactions actives de boid tout au long. Les collectes et les répartiteurs natifs de DOTS ont également réduit considérablement l'allocation des ordures par trame par rapport aux projets précédents de l'équipe.
Tirer les leçons de l'expérience
En mêlant biologie marine authentique et ingénierie de systèmes complexes, Life Below se taille une place distinctive dans le genre city-builder. La dernière version de Megapop démontre l"évolutivité d'ECS pour Unity lors de la manipulation de jeux lourds en simulation - et révèle des avantages structurels qui vont bien au-delà des performances pures. L'équipe note que le fait de pouvoir diviser proprement les assemblages en données et en logique, par exemple, signifiait que Life Below compilait beaucoup plus rapidement que d'autres projets de taille similaire.
Pour les développeurs qui envisagent de réaliser un jeu avec ECS pour Unity, l'expérience de l'équipe est cohérente: la courbe d'apprentissage est réelle, mais l'investissement est rentable. Adam, qui est responsable technologique du prochain projet de Megapop, envisage déjà de tirer parti d'ECS. "Quand on l'a déjà mis en place, c'est facile de s'appuyer et de s'agrandir", dit-il.
Construire mieux avec Unity
Développez des jeux lourds en simulation qui évoluent. ECS for Unity vous donne les outils de performance et d'architecture pour donner vie à des mondes complexes et vivants.