ED_Alloc: no free edicts in GMod: das Edict-Limit erklärt
ED_Alloc: no free edicts heißt, dass alle Edicts belegt sind. Was ein Edict ist, wo das Limit in GMod liegt und was Mapper und Serverbetreiber dagegen tun.
Ein Edict ist ein Platz in der Liste der vernetzten Entities, also aller Objekte, die der Server an die Clients übertragen kann. Garry's Mod hat 8192 solcher Plätze. Sind alle belegt, kann die Engine kein weiteres vernetztes Entity anlegen, und braucht sie trotzdem eines, endet der Server mit ED_Alloc: no free edicts. Dagegen hilft nur, weniger Entities zu erzeugen: als Mapper mit statischen statt dynamischen Objekten, als Serverbetreiber mit Limits, Aufräumen und einer Map, die selbst wenig mitbringt.
Was ein Edict ist und was eines belegt
Die Engine verwaltet zwei Listen. In der einen stehen Entities mit Edict. Über das Edict hat ein Entity auf dem Server und auf jedem Client dieselbe Nummer und kann übertragen werden. In der anderen stehen Entities, die nur auf dem Server oder nur auf einem Client existieren. Ein vernetztes Entity hält sein Edict vom Erzeugen bis zum Entfernen besetzt, auch wenn es sich nie bewegt.
| Belegt ein Edict | Belegt keines |
|---|---|
| Spieler, jede getragene Waffe, Projektile | prop_static und prop_detail, sie stecken fest in der BSP |
prop_physics, prop_dynamic, prop_ragdoll, Fahrzeuge, NPCs | Welt-Brushes und func_detail, sie sind Teil der Weltgeometrie |
Brush-Entities wie func_door oder func_brush | Logik-Entities wie logic_timer, logic_case oder math_counter und Physik-Constraints |
env_sprite und Lichter mit Namen | kurzlebige Effekte, die als Temp Entities verschickt werden |
Die Tabelle folgt dem Standardcode der Source Engine (Source SDK 2013) und der Valve Developer Community, denn der Engine-Code von GMod selbst ist nicht öffentlich. Die Logik-Entities der rechten Spalte sind nicht kostenlos. Sie zählen zur zweiten Liste, die in GMod laut Valve Developer Community ebenfalls 8192 Einträge fasst. Warum statische Props gar nicht erst als Entity existieren, erklärt der Artikel zu prop_static, prop_dynamic und prop_physics.
Wo das Limit in GMod liegt
Im Code der Source Engine legt die Konstante MAX_EDICT_BITS fest, mit wie vielen Bits eine Entity-Nummer übertragen wird. Im Source SDK 2013 sind es 11 Bits, also 2048 Edicts. Garry's Mod hat die Grenze angehoben. Du darfst drei Limits nicht verwechseln:
| Limit | Wert in GMod | Was beim Überschreiten passiert |
|---|---|---|
| Vernetzte Entities (Edicts) | 8192 | Neue Entities werden abgelehnt, im schlimmsten Fall endet der Server mit ED_Alloc: no free edicts |
| Nicht vernetzte Entities | 8192 | Die Engine legt das Entity nicht an und warnt in der Konsole |
| Einträge in der Map-Datei beim Kompilieren | 65536 | VBSP bricht ab |
Die ersten beiden Werte nennt die Valve Developer Community, den ersten bestätigt das Wiki von Garry's Mod. Der dritte ist MAX_MAP_ENTITIES von VBSP. Das Update vom März 2024 hat ihn in Garry's Mod auf 65k angehoben, und zwar nur für die Compile-Tools. Im Test brach das aktuelle VBSP mit num_entities == MAX_MAP_ENTITIES ab, sobald die Map-Datei samt Welt 65536 Einträge enthielt, und jedes prop_static zählte mit. Die Limits von VBSP sind Thema von Source Engine Map-Limits.
In der Praxis ist früher Schluss. Laut GMod-Wiki schlägt ents.Create bereits irgendwo zwischen 8064 und 8176 belegten Edicts fehl, abhängig von der Zahl der Spieler-Slots und anderen Entities. GMod erzeugt in der Nähe der Grenze absichtlich keine neuen Entities mehr. In Sandbox sieht der Spieler dann die Meldung „Failed to create an entity. Server likely hit the entity limit.“ Addons, die mit einem ungültigen Entity nicht rechnen, werfen ab diesem Punkt Lua-Fehler. Der Absturz droht, wenn trotz dieser Sperre kein Platz mehr frei ist.
Entities und Edicts auf dem Server zählen
Diese Befehle gibst du in der Serverkonsole ein:
lua_run print(ents.GetEdictCount(), ents.GetCount())
report_entities
sv_lowedict_threshold
sv_lowedict_action
ents.GetEdictCount()liefert die Zahl der vernetzten Entities,ents.GetCount()die Zahl aller Entities.report_entitieslistet alle Entities nach Klasse mit Anzahl auf und endet mit einer Summenzeile, die auch die Edicts nennt.sv_lowedict_thresholdundsv_lowedict_actionsind Variablen der Engine. Ohne Wert eingegeben, zeigen sie die aktuelle Einstellung.
Miss zweimal: einmal direkt nach dem Start der Map ohne Spieler und einmal zur Hauptzeit. Die erste Zahl ist der Sockel, den die Map kostet. Die Differenz ist das, was Spieler und Addons erzeugen.
Was die Map mitbringt und wie du als Mapper sparst
Alles, was als Entity in der BSP steht und sich beim Start nicht selbst entfernt, belegt seinen Platz dauerhaft. So hältst du den Sockel klein:
- Props statisch machen. Jedes
prop_dynamicundprop_physicskostet ein Edict, einprop_statickeines. - Brushes zusammenfassen. Mehrere Brushes in einem
func_brushsind ein Entity. Brauchen sie keine Funktion, werden siefunc_detailund verschwinden beim Kompilieren ganz aus der Entity-Liste. - Lichter ohne Namen lassen. Im Standardcode der Source Engine (Source SDK 2013) entfernt sich ein
lightoderlight_spotohne Namen beim Start der Map selbst, weil sein Licht schon in den Lightmaps steckt. Mit Namen bleibt es als Entity bestehen. - Sprites prüfen. Jedes
env_spriteist ein vernetztes Entity. Die FGD von GMod enthältenv_sprite_clientside. Laut Valve Developer Community wird es nach dem Start auf dem Server entfernt, solange es weder Namen noch Parent hat. - Auf Bone Follower achten. Ein Prop, dessen Model ein Kollisionsmodell mit Gelenken hat, erzeugt für jedes Teilstück ein zusätzliches Entity
phys_bone_follower. Die Eigenschaft Disable Bone Followers amprop_dynamicverhindert das, kostet aber die Kollision.
Kontrollieren kannst du das Ergebnis im Map Scanner. Für eine BSP zeigt er die Zahl der Entities und die häufigsten Entity-Klassen. Weitere Stellschrauben stehen in GMod-Map optimieren.
Was Spieler und Addons zur Laufzeit hinzufügen
- Spieler: Jeder Spieler ist ein Entity, und jede Waffe in seinem Inventar ist ein weiteres.
- Gespawnte Props: Sandbox legt jedes Prop als
prop_physicsan. Die Vorgabe fürsbox_maxpropsist 200 pro Spieler. Bei 40 Spielern wären das bis zu 8000 Props und damit fast das gesamte Budget. - Weitere Sandbox-Limits: In der Vorgabe erlaubt Sandbox pro Spieler außerdem 10 Ragdolls, 4 Fahrzeuge, 10 NPCs und 100 Entities (
sbox_maxsents). - Wiremod: Jedes Hologramm aus Expression 2 ist ein vernetztes Entity. Wiremod begrenzt die Zahl pro Spieler mit
wire_holograms_max. - Zusammengesetzte Objekte: Fahrzeug-Addons und große Konstruktionen bestehen in der Praxis oft aus vielen einzelnen Entities. Die genaue Zahl hängt vom Addon ab.
Verlässt ein Spieler den Server, entfernt der Standardcode der Source Engine seine Waffen gleich mit. Seine Props bleiben in Sandbox stehen, bis jemand aufräumt.
Was du als Serverbetreiber tun kannst
- Rechnen. Multipliziere deine
sbox_max-Werte mit der üblichen Spielerzahl und addiere den Sockel der Map. Liegt das Ergebnis über etwa 8000, senke die Limits. - Aufräumen.
gmod_admin_cleanupentfernt als Admin alles, was Spieler gespawnt haben, und setzt die Map zurück. Mitgmod_cleanupräumt jeder Spieler seine eigenen Objekte weg. Prop-Protection-Addons bieten oft an, die Props getrennter Spieler nach einer Frist zu entfernen. - Vorwarnen lassen. Laut dem Hilfetext der beiden Variablen führt die Engine
sv_lowedict_actionaus, sobald nur noch so viele Edicts frei sind, wiesv_lowedict_thresholdangibt: 0 nichts, 1 Warnung ins Log, 2 Spiel neu starten, 3 Map neu starten, 4 nächste Map im Mapcycle. - Die Map passend wählen. Auf bspmarket.de stehen bei einer Map unter Technische Daten die Richtwerte Entities (Map) und Statische Props. In den Kategorien kannst du nach der Entity-Zahl filtern. Was sonst zur Auswahl gehört, steht in DarkRP-Map auswählen.
Erläuterungen zu dieser und verwandten Meldungen findest du auch in der Fehlerdatenbank.
Häufige Fragen
Kann ich das Edict-Limit erhöhen?
Nein. Der Wert ist fest in die Engine einkompiliert und lässt sich laut Valve Developer Community nicht ändern, ohne die Kompatibilität mit der Engine zu brechen. Dir bleibt nur, die Zahl der Entities zu senken.
Gilt das Limit auch in anderen Source-Spielen?
In den meisten ist es niedriger. Laut Valve Developer Community erlauben die meisten Source-Spiele 2048 Edicts. Eine Map, die in GMod problemlos läuft, kann deshalb in einem anderen Spiel schon beim Laden an der Grenze scheitern.
Warum scheitert das Spawnen schon unter 8192?
Weil GMod eine Reserve frei hält. Laut GMod-Wiki schlägt ents.Create zwischen 8064 und 8176 belegten Edicts fehl. Wo genau, hängt unter anderem von der Zahl der Spieler-Slots ab.
Belegen unsichtbare Entities auch ein Edict?
Ja, wenn sie zu den vernetzten Entities gehören. Ob ein Entity sichtbar ist oder sich bewegt, spielt keine Rolle. Entscheidend ist allein, ob es ein Edict bekommt. Reine Logik-Entities bekommen im Standardcode der Source Engine keines.