Ich arbeite gerade an meinem ersten kompletten Spiel, einem vertikalen Weltraumshooter. Nach knapp 4000Zeilen Quellcode (in C-Script) stoße ich gerade auf ein mir bislang unbekanntes Problem: die Framerate schießt nach einer Weile in die Höhe, und irgendwann stürzt die Engine mit der Fehlermeldung "not enough entities reserved" ab; obwohl alle generierten Entities per ent_remove entfernt wurden. Das kann ich natürlich mit max_entities lösen, aber davon wird die Framerate auch nicht besser.

Im ersten Level des Spiel lasse ich zunächst in einer Schleife Asteroiden generieren, ca. 6 pro Sekunde. Bei Lasertreffern sprühen Funken, bei Explosionen entstehen Schockwellen, Sternsprites ziehen vorüber um Geschwindigkeiten zu suggerieren und jeder Antrieb sprüht Feuer. Kurz gesagt: Jede einzelne Entity, inklusive dem Spieler wird per ent_create erstellt (Asteroiden etc. entstehen zur Laufzeit bei camera.x+500). Das Level selbst ist komplett leer und besitzt keine Geometrie oder Models; der Himmel wird auch als Skycube per Script erzeugt.

Selbstverständlich werden auch alle Entities per ent_remove wieder entfernt; entweder am Ende eines Ausblendeffekts (mit while(my.alpha>0); z.B. bei Schockwellen oder Antriebsflammen), oder wenn die Entity den Punkt camera.x-500 erreicht.
Ich habe auch die Kamera weiter rausgezoomt, um zu prüfen ob dies funktioniert, und tatsächlich spielt sich alle in einem Feld von 1000 Quants ab; nichts dringt nach außen, sondern wird an der 500Quants-Grenze entfernt.

Nichtsdestotrotz bleiben die Entities irgendwie auch nach dem ent_remove im Speicher und füllen diesen. Die einzige sinnvolle Auskunft, die mir das Handbuch geben konnte, war der Abschnitt über level_mark und level_free, aber das kann ich nicht verwenden, da alles, was nach level_mark per ent_create entstanden ist, auch wieder per ent_remove entfernt werden muss, bevor level_free den nexus leert. Das kann ja nicht funktionieren, solange Player/Gegner schießen und die Asteroiden/Gegner zur Laufzeit entstehen. Es gibt einfach keinen Zeitpunkt, an dem alles enstandene wieder entfernt wurde.

Wie kann ich den Zwischenspeicher löschen und alles bisher entfernte endgültig aus dem Speicher werfen, um das Level lauffähig zu machen? Ich habe auch schon mit camera.clip_far versucht; aber das schneidet ja nur den view ab, und betrifft ebensowenig den Zwischenspeicher wie ent_remove.

Danke im voraus; bevor ich das Problem nicht lösen kann, kann ich meinen Level nicht ausbauen...