Gamestudio Links
Zorro Links
Newest Posts
Zorro 2.70
by jcl. 09/29/25 09:24
optimize global parameters SOLVED
by dBc. 09/27/25 17:07
ZorroGPT
by TipmyPip. 09/27/25 10:05
assetHistory one candle shift
by jcl. 09/21/25 11:36
Plugins update
by Grant. 09/17/25 16:28
AUM Magazine
Latest Screens
Rocker`s Revenge
Stug 3 Stormartillery
Iljuschin 2
Galactic Strike X
Who's Online Now
5 registered members (Dico, AndrewAMD, TipmyPip, NewbieZorro, Grant), 15,791 guests, and 5 spiders.
Key: Admin, Global Mod, Mod
Newest Members
krishna, DrissB, James168, Ed_Love, xtns
19168 Registered Users
Previous Thread
Next Thread
Print Thread
Rate Thread
how to free memory #199727
04/01/08 08:16
04/01/08 08:16
Joined: Jul 2005
Posts: 23
Deutschland / Germany
B
Bastian Offline OP
Newbie
Bastian  Offline OP
Newbie
B

Joined: Jul 2005
Posts: 23
Deutschland / Germany
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...

Re: how to free memory [Re: Bastian] #199770
04/01/08 10:47
04/01/08 10:47
Joined: Apr 2007
Posts: 582
Germany
Poison Offline
User
Poison  Offline
User

Joined: Apr 2007
Posts: 582
Germany
Du könntest das problem per level_mark und level_free lösen.


Everything is possible, just Do it!
Re: how to free memory [Re: Poison] #199771
04/01/08 10:49
04/01/08 10:49
Joined: Jun 2005
Posts: 4,875
broozar Offline
Expert
broozar  Offline
Expert

Joined: Jun 2005
Posts: 4,875
wie wär's, wenn du die entities wiederverwendest, statt sie zu entfernen? also, alpha ausfaden, dann wieder an den oberen bildschirmrand setzen, reinfliegen lassen, voilà ein neuer gegner.

Re: how to free memory [Re: broozar] #199783
04/01/08 11:14
04/01/08 11:14
Joined: Apr 2007
Posts: 582
Germany
Poison Offline
User
Poison  Offline
User

Joined: Apr 2007
Posts: 582
Germany
Das wäre auch eine gute Idee!
geht schnell, effizient, verbraucht auf jeden Fall weniger Speicher.


Everything is possible, just Do it!
Re: how to free memory [Re: Poison] #199804
04/01/08 12:25
04/01/08 12:25
Joined: Jul 2005
Posts: 23
Deutschland / Germany
B
Bastian Offline OP
Newbie
Bastian  Offline OP
Newbie
B

Joined: Jul 2005
Posts: 23
Deutschland / Germany
@poison:
ich sagte ja bereits dass das nicht funktioniert, weil zu keinem Zeitpunkt ALLE per ent_create geschaffenen Entities wieder per ent_remove entfernt wurden.
Und level_free funktioniert nicht, solange noch irgendeine ent_create-Entity existiert, dann schmiert die Engine ab.
@broozar:
hm, klingt gut, werd ich versuchen, aber ich kann mir nicht vorstellen, dass das die Musterlösung ist. Zumindest glaube ich nicht dass andere z.B. Weltraumshooter so funktionieren, dass man immer wieder dieselben Entities verwendet, oder doch?

Edit: Nein, mit der Idee kann ich mich nicht anfreunden. Bei den Asteroiden, die aus dem Bild verschwinden (camera.x-500) mag das ja noch funktionieren, die immer wieder ins Bild zu schieben (camera.x+500); aber das wird schon problematisch bei den ganzen anderen Sachen. Wird ein Asteroid zerstört, entstehen Schockwellen und Trümmer. Wenn ich jetzt 10 zerstörte Asteroiden im Bild habe, setzt jeder davon 8 Trümmerstücke frei und sendet drei Schockwellen aus. Das sind allein schon 110 Entities in einem Bild; und wie soll ich solche Trümmerstücke und Schockwellen wiederverwenden? Die werden ja nicht einfach ins Bild geschoben. Da müsste ich ja unzählige dieser Entities vordefinieren und mit Pointern versehen und kompliziert auswählen, wann welche Steine an welche Position gelangen und wieder sichtbar werden, damit für jeden Asteroiden genügend Trümmer und Schockwellen da sind. Und genauso bei Antriebsflammen, Funkenflug und Laserfeuer.
Letzten Endes habe ich dann, je nach Effektanzahl, tausende Entities unsichtbar im Level rumschwirren, die darauf warten, eventuell wieder an einer anderen Stelle sichtbar zu werden.
Nein, so kann das doch nicht sinnvoll funktionieren...

Wie löst ihr das denn sonst, wenn ihr eine Entity entfernen wollt? ent_remove leert wie gesagt nicht den Zwischenspeicher und die Performance nimmt ständig ab. Jeder Programmierer, der ein Spiel entworfen hat, in dem viele Partikel etc. benötigt werden, muss doch dieses Problem und dessen Lösung kennen?! broozars Antwort klang eher nach "Da hat jemand ein Problem, dass ich nicht kenne, mal sehen, ob meine Idee funktioniert" und nicht nach "Das Problem hat jeder, jeder Pro weiß, wie man es löst" ^^

Last edited by Bastian; 04/01/08 13:15.
Re: how to free memory [Re: Bastian] #199845
04/01/08 14:15
04/01/08 14:15
Joined: Jun 2005
Posts: 4,875
broozar Offline
Expert
broozar  Offline
Expert

Joined: Jun 2005
Posts: 4,875
 Quote:

Nein, mit der Idee kann ich mich nicht anfreunden. Bei den Asteroiden, die aus dem Bild verschwinden (camera.x-500) mag das ja noch funktionieren, die immer wieder ins Bild zu schieben (camera.x+500); aber das wird schon problematisch bei den ganzen anderen Sachen. Wird ein Asteroid zerstört, entstehen Schockwellen und Trümmer. Wenn ich jetzt 10 zerstörte Asteroiden im Bild habe, setzt jeder davon 8 Trümmerstücke frei und sendet drei Schockwellen aus. Das sind allein schon 110 Entities in einem Bild; und wie soll ich solche Trümmerstücke und Schockwellen wiederverwenden? Die werden ja nicht einfach ins Bild geschoben. Da müsste ich ja unzählige dieser Entities vordefinieren und mit Pointern versehen und kompliziert auswählen, wann welche Steine an welche Position gelangen und wieder sichtbar werden, damit für jeden Asteroiden genügend Trümmer und Schockwellen da sind. Und genauso bei Antriebsflammen, Funkenflug und Laserfeuer.
Letzten Endes habe ich dann, je nach Effektanzahl, tausende Entities unsichtbar im Level rumschwirren, die darauf warten, eventuell wieder an einer anderen Stelle sichtbar zu werden.


wir entwickeln atm einen mp-weltraumshooter für 16 spieler. jeder von denen bekommt ein ansehnliches waffenarsenal an lasern, raketen, schiffe werden zertrümmert etc.
da erzeugen und registrieren von mp-entities noch langsamer als ent_create ohnehin schon ist (lags lags lags), mussten wir zu genau dieser lösung greifen. das ganze arsenal wird also vorinitialisiert, unsichtbar in eine levelecke gestellt und stumm geschaltet. das war nicht nur der beste weg für uns, sondern der einzige. ich kenne noch ein paar andere leute, die mit dem entitymanagement atm probleme haben. aber dieser weg scheint der einzig gangbare (und mittlerweile erprobte) zu sein.
es mag dir zunächst doof vorkommen und ist auch erstmal ne menge schreibarbeit, aber du gewinnst auch eine größere kontrolle über die entities, weil du jede mit einer eigenen ID registrieren kannst, sommit hast du direkten zugriff auf jede einzelne entity.

Re: how to free memory [Re: broozar] #199863
04/01/08 15:28
04/01/08 15:28
Joined: Jul 2005
Posts: 23
Deutschland / Germany
B
Bastian Offline OP
Newbie
Bastian  Offline OP
Newbie
B

Joined: Jul 2005
Posts: 23
Deutschland / Germany
interessant, danke!
das läuft dann also darauf hinaus, dass ich die Partikel abzähle, die gleichzeitig pro Schiff angezeigt werden sollen (z.B. 20 Feuerpartikel pro Antriebsflamme); und wenn ich axiomatisch festlege dass maximal 10Schiffe gleichzeitig im Bild sein dürfen, muss ich also diesen Partikel 200mal definieren.
Nach der while-Schleife, die den alpha-Wert auf 0 setzt, positioniere ich den Partikel per vec_set neu und setze alpha auf 100.
Habe ich das soweit richtig verstanden?
Oha, ich glaube das verdoppelt meinen Quellcode, ohne ein (für den Spieler erkennbares) Stück vorwärts zu kommen^^

Könntest du mir wohl bitte noch ein Scriptbeispiel Initialisierung zeigen bzw. mir einen Wink mit dem Zaunpfahl geben, wie die Syntax dazu aussehen sollte? Ich überlege gerade, wie ich dem ganzen Zeug IDs zuweisen soll (Skills?Arrays?)
und vor allem wie ich dann herausfiltere, welche der z.B. 100 vorbereiteten Lasersalven ich jetzt sichtbar machen und an die player-Position bringen soll...


Moderated by  HeelX, Lukas, rayp, Rei_Ayanami, Superku, Tobias, TWO, VeT 

Gamestudio download | Zorro platform | shop | Data Protection Policy

oP group Germany GmbH | Birkenstr. 25-27 | 63549 Ronneburg / Germany | info (at) opgroup.de

Powered by UBB.threads™ PHP Forum Software 7.7.1