ED_Alloc: no free edicts dans GMod : la limite d’edicts expliquée
ED_Alloc: no free edicts : tous les edicts sont pris. Ce qu’est un edict, où est la limite dans GMod, ce que mappeurs et propriétaires de serveur peuvent faire.
Un edict est un emplacement dans la liste des entités en réseau, c’est-à-dire de tous les objets que le serveur peut transmettre aux clients. Garry’s Mod dispose de 8192 de ces emplacements. Une fois qu’ils sont tous pris, le moteur ne peut plus créer d’autre entité en réseau, et s’il en a quand même besoin d’une, le serveur s’arrête avec ED_Alloc: no free edicts. Le seul remède est de créer moins d’entités : en tant que mappeur, avec des objets statiques plutôt que dynamiques ; en tant que propriétaire de serveur, avec des limites, des nettoyages et une map qui en apporte peu elle-même.
Ce qu’est un edict et ce qui en utilise un
Le moteur tient deux listes. L’une contient les entités dotées d’un edict. Grâce à l’edict, une entité porte le même numéro sur le serveur et sur chaque client et peut être transmise. L’autre contient les entités qui n’existent que sur le serveur ou que sur un client. Une entité en réseau garde son edict occupé de sa création à sa suppression, même si elle ne bouge jamais.
| Utilise un edict | N’en utilise aucun |
|---|---|
| Joueurs, chaque arme portée, projectiles | prop_static et prop_detail, qui sont intégrés au BSP |
prop_physics, prop_dynamic, prop_ragdoll, véhicules, NPC | World brushes et func_detail, qui font partie de la géométrie du monde |
Entités brush comme func_door ou func_brush | Entités logiques comme logic_timer, logic_case ou math_counter, et contraintes physiques |
env_sprite et lumières avec un nom | Effets éphémères envoyés sous forme de temp entities |
Le tableau suit le code standard du Source Engine (Source SDK 2013) et la Valve Developer Community, car le code du moteur propre à GMod n’est pas public. Les entités logiques de la colonne de droite ne sont pas gratuites. Elles comptent dans la seconde liste qui, d’après la Valve Developer Community, contient elle aussi 8192 entrées dans GMod. La raison pour laquelle les props statiques n’existent même jamais en tant qu’entités est expliquée dans l’article sur prop_static, prop_dynamic et prop_physics.
Où se situe la limite dans GMod
Dans le code du Source Engine, la constante MAX_EDICT_BITS définit le nombre de bits utilisés pour transmettre un numéro d’entité. Dans le Source SDK 2013, c’est 11 bits, ce qui donne 2048 edicts. Garry’s Mod a relevé la limite. Il y a trois limites à ne pas confondre :
| Limite | Valeur dans GMod | Ce qui se passe en cas de dépassement |
|---|---|---|
| Entités en réseau (edicts) | 8192 | Les nouvelles entités sont refusées ; dans le pire des cas, le serveur s’arrête avec ED_Alloc: no free edicts |
| Entités hors réseau | 8192 | Le moteur ne crée pas l’entité et affiche un avertissement dans la console |
| Entrées dans le fichier de map à la compilation | 65536 | VBSP s’interrompt |
Les deux premières valeurs viennent de la Valve Developer Community, et le wiki de Garry’s Mod confirme la première. La troisième est le MAX_MAP_ENTITIES de VBSP, que la mise à jour de mars 2024 de Garry’s Mod a relevé à 65k, uniquement pour les outils de compilation. Lors d’un test, le VBSP actuel s’est interrompu avec num_entities == MAX_MAP_ENTITIES dès que le fichier de map contenait 65536 entrées, monde compris, et chaque prop_static comptait. Les limites de VBSP font l’objet de l’article sur les limites des maps du Source Engine.
En pratique, la fin arrive plus tôt. D’après le wiki de GMod, ents.Create échoue déjà quelque part entre 8064 et 8176 edicts utilisés, selon le nombre de slots de joueurs et selon d’autres entités. À l’approche de la limite, GMod cesse volontairement de créer de nouvelles entités. En Sandbox, le joueur voit alors le message « Failed to create an entity. Server likely hit the entity limit. » Les addons qui ne s’attendent pas à une entité invalide se mettent à produire des erreurs Lua à partir de ce moment. Le crash menace quand il ne reste plus aucun emplacement malgré ce garde-fou.
Compter les entités et les edicts sur le serveur
Saisis ces commandes dans la console du serveur :
lua_run print(ents.GetEdictCount(), ents.GetCount())
report_entities
sv_lowedict_threshold
sv_lowedict_action
ents.GetEdictCount()renvoie le nombre d’entités en réseau,ents.GetCount()le nombre de toutes les entités.report_entitiesliste toutes les entités par classe avec leur nombre et se termine par une ligne de totaux qui indique aussi les edicts.sv_lowedict_thresholdetsv_lowedict_actionsont des variables du moteur. Saisies sans valeur, elles affichent le réglage actuel.
Mesure deux fois : une fois juste après le démarrage de la map, sans joueurs, et une fois à l’heure de pointe. Le premier chiffre est le coût de base de la map. La différence, c’est ce que créent les joueurs et les addons.
Ce que la map apporte et comment économiser en tant que mappeur
Tout ce qui est stocké comme entité dans le BSP et ne se supprime pas tout seul au démarrage garde son emplacement en permanence. Voici comment garder un coût de base faible :
- Rends les props statiques. Chaque
prop_dynamicet chaqueprop_physicscoûte un edict, unprop_staticn’en coûte aucun. - Regroupe les brushes. Plusieurs brushes dans un seul
func_brushforment une seule entité. S’ils n’ont besoin d’aucune fonction, transforme-les enfunc_detailet ils disparaissent complètement de la liste des entités à la compilation. - Laisse les lumières sans nom. Dans le code standard du Source Engine (Source SDK 2013), un
lightou unlight_spotsans nom se supprime lui-même au démarrage de la map, car sa lumière est déjà dans les lightmaps. Avec un nom, il reste en tant qu’entité. - Vérifie les sprites. Chaque
env_spriteest une entité en réseau. Le FGD de GMod contientenv_sprite_clientside. D’après la Valve Developer Community, il est supprimé sur le serveur après le démarrage tant qu’il n’a ni nom ni parent. - Attention aux bone followers. Un prop dont le modèle a un modèle de collision articulé crée une entité
phys_bone_followersupplémentaire pour chaque pièce. La propriété Disable Bone Followers duprop_dynamicl’empêche, mais te coûte la collision.
Tu peux vérifier le résultat dans le Map Scanner. Pour un BSP, il affiche le nombre d’entités et les classes d’entités les plus fréquentes. D’autres leviers sont présentés dans optimiser les performances d’une map GMod.
Ce que les joueurs et les addons ajoutent à l’exécution
- Joueurs : Chaque joueur est une entité, et chaque arme de son inventaire en est une autre.
- Props spawnés : Sandbox crée chaque prop en tant que
prop_physics. La valeur par défaut desbox_maxpropsest de 200 par joueur. Avec 40 joueurs, ça ferait jusqu’à 8000 props, soit presque tout le budget. - Autres limites de Sandbox : Par défaut, Sandbox autorise aussi 10 ragdolls, 4 véhicules, 10 NPC et 100 entités (
sbox_maxsents) par joueur. - Wiremod : Chaque hologramme d’Expression 2 est une entité en réseau. Wiremod plafonne leur nombre par joueur avec
wire_holograms_max. - Objets composés : En pratique, les addons de véhicules et les grandes constructions sont souvent faits de nombreuses entités distinctes. Le nombre exact dépend de l’addon.
Quand un joueur quitte le serveur, le code standard du Source Engine supprime ses armes avec lui. En Sandbox, ses props restent jusqu’à ce que quelqu’un nettoie.
Ce que tu peux faire en tant que propriétaire de serveur
- Fais le calcul. Multiplie tes valeurs
sbox_maxpar le nombre habituel de joueurs et ajoute le coût de base de la map. Si le résultat dépasse environ 8000, baisse les limites. - Nettoie. Utilisé en tant qu’admin,
gmod_admin_cleanupsupprime tout ce que les joueurs ont spawné et réinitialise la map. Avecgmod_cleanup, chaque joueur supprime ses propres objets. Les addons de prop protection proposent souvent de supprimer les props des joueurs déconnectés après un délai. - Fais-toi prévenir à l’avance. D’après le texte d’aide des deux variables, le moteur exécute
sv_lowedict_actionquand il ne reste plus qu’autant d’edicts libres que l’indiquesv_lowedict_threshold: 0 rien, 1 avertissement dans le log, 2 redémarrer le jeu, 3 redémarrer la map, 4 map suivante du map cycle. - Choisis une map adaptée. Sur bspmarket.de, les Données techniques d’une map indiquent les valeurs approximatives Entités (map) et Props statiques. Dans les catégories, tu peux filtrer par nombre d’entités. Les autres critères de choix sont présentés dans choisir une map DarkRP.
Tu trouveras aussi des explications sur ce message et sur des messages apparentés dans la base d’erreurs.
Questions fréquentes
Puis-je relever la limite d’edicts ?
Non. La valeur est compilée dans le moteur et, d’après la Valve Developer Community, ne peut pas être modifiée sans casser la compatibilité avec le moteur. Tout ce que tu peux faire, c’est réduire le nombre d’entités.
La limite s’applique-t-elle aussi aux autres jeux Source ?
Dans la plupart, elle est plus basse. D’après la Valve Developer Community, la plupart des jeux Source autorisent 2048 edicts. Une map qui tourne sans problème dans GMod peut donc échouer sur la limite dans un autre jeu dès son chargement.
Pourquoi le spawn échoue-t-il déjà en dessous de 8192 ?
Parce que GMod garde une réserve libre. D’après le wiki de GMod, ents.Create échoue entre 8064 et 8176 edicts utilisés. L’endroit exact dépend, entre autres, du nombre de slots de joueurs.
Les entités invisibles utilisent-elles aussi un edict ?
Oui, si ce sont des entités en réseau. Qu’une entité soit visible ou qu’elle bouge n’a aucune importance. La seule chose qui compte, c’est qu’elle reçoive ou non un edict. Dans le code standard du Source Engine, les entités purement logiques n’en reçoivent pas.