Performance-schonende Spawn-Abfrage
Übersicht BlitzBasic Beginners-Corner
GizehBetreff: Performance-schonende Spawn-Abfrage |
Mo, Okt 08, 2007 16:39 Antworten mit Zitat |
|
---|---|---|
Ich habe eine Frage zum Gegner-Spawn.
Die Spielfigur läuft in meinem Spiel quer durchs Level (TopDown-View, alle Richtungen möglich). Nun möchte ich natürlich, dass immer wenn die Spielfigur bestimmte Positionen erreicht, bzw. sich innerhalb eines Radius von 1-2 Screens an einem Spawn-Punkt befindet, eine Horde von Gegnern spawnt. Dazu lege ich zuvor alle Spawn-Points fest, und benutze für diese Spawn-Points Types (Position, Art und Anzahl der Gegner mit welchen sie gefüllt sind etc.), dachte ich. Das dumme ist nur: Jetzt muss ich ja fortlaufend in der MainLoop konstant die Position der Spielfigur abfragen, und permanent mit allen Positions-Angaben aller Spawn-Points vergleichen - also permanent durch alle Spawn-Types loopen. Das belastet doch mit Sicherheit die Performance. Und ist vielleicht auch unnötig? "Etwas" geschwindigkeitsschonender wäre es vielleicht noch, die Positions-Angaben der Spawn-Types in zwei Blitz Arrays zu packen (X und Z) und in der MainLoop erstmal permanent durch diese zu loopen und die Pos der Spielfigur mit diesen abzufragen. Und erst wenn sich hier eine Übereinstimmung ergibt, die Types zu bearbeiten. Aber ideal scheint mir das immer noch nicht. Deshalb meine Frage: Wie kann man eine Gegner-Spawn-Abfrage denn möglichst ressourcenschonend realisieren? Habt Ihr da vielleicht Tipps für mich? |
||
Pdd |
Mo, Okt 08, 2007 16:54 Antworten mit Zitat |
|
---|---|---|
Ich glaube kaum, dass das loopen durch Spawnpunkte (und seien es auch noch so viele) und die damit verbundene a²+b²=c²-Abfrage eine solche Performance-Belastung darstellen. Da solltest du dir wirklich keine Sorgen machen... | ||
Lieber Apfel als Birne. |
Fuchsi |
Mo, Okt 08, 2007 17:03 Antworten mit Zitat |
|
---|---|---|
Zudem könntest du dein Spielfeld in einzelne Teile splittern, und nur die Spawnpoints abfragen, welche sich in dem Teil, in dem sich auch die Spielfigur aufhält, befinden. | ||
darth |
Mo, Okt 08, 2007 17:04 Antworten mit Zitat |
|
---|---|---|
ich würde meinen (um es variabel zu belassen) kommst du nicht darum herum.
Code: [AUSKLAPPEN] for s.spawnpoint=each spawnpint
if sqr((playerx-s\x)^2+(playery-s\y)^2)<10 then spawn gegner endif next wenn er die spawnpoints nur in einer gewissen reihenfolge abklappern können soll, dann gehts "schneller". Code: [AUSKLAPPEN] s.spawnpoint=first spawnpoint
if sqr((playerx-s\x)^2+(playery-s\y)^2)<10 then spawn gegner delete s.spawnpoint endif das sind die zwei möglichkeiten die mir einfallen. natürlich könnte man (was meiner meinung nach sehr ungeschickt ist) einen gewaltigen array anlegen. Code: [AUSKLAPPEN] dim spawn(graphicswidth(),graphicsheight())
spawn(300,400)=1 ... if spawn(int(playerx),int(playery))=1 then spawn gegner endif aber ich stimme pdd zu. die erste möglichkeit saugt kaum sehr viel performance. du hast wahrscheinlich kaum mehr als 100spawnpoints und eine schleife von 1-100 braucht nicht allzuviel zeit. |
||
Diese Signatur ist leer. |
Smily |
Mo, Okt 08, 2007 17:13 Antworten mit Zitat |
|
---|---|---|
Wenn du wirklich performance spran musst, würden mir am anfang 2 möglichkeiten einfallen, die man auch kombinieren kann:
1: Du musst in dem fall nicht unbedingt den pythagoras verwenden. ein "if abs(posx-spawn/x) < width*3 and ...." würde wohl reichen. 2 : Die kontrollen werden nicht bei jedem durchlauf in der mainloop gemacht, sondern nur z.B. alle 2 sekunden. (Die abstände hängen davon ab, wielange der spieler mindestens brauch, um eine bildschirmlänge zurückzulegen) oder: du speicherst die position des spielers in eine variable, sobald der spieler einen abstand xyz von dieser position hat, wird die kontrolle durchgeführt (und natürlich die neue pos in die variable geschrieben ) |
||
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets "Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!" stummi.org |
Dreamora |
Mo, Okt 08, 2007 17:15 Antworten mit Zitat |
|
---|---|---|
Ich hätte da noch ne weitere:
"SpawnActivator" Entity an den Spieler hängen. Diese bekommt einen recht grossen Kollisionsradius. Das selbe machst du mit den Spawns aber dort "SpawnAware" Entities mit ganz kleinen Kollisions Radien. Diese Entities sind Childs der Spawnpunkte. Weiterer wichtiger Punkt für die Performance ist, dass du handle(SpawnPointType) in den EntityNamen speicherst, damit du ihn direkt mit Object.SpawnPointType(entityname(ent)) wieder zurück holen kannst. Die Kollisionstypen so machen das nur spawnActivator mit Aware kollidieren kann sonst kollidieren die mit nichts. So und nun, wann immer eine Kollision stattfindet, wird der Spawn zur Gruppe der aktiven Spawns hinzugefügt. Sprich du erzeugst dafür nen Type mit dem Entity drin gespeichert. Immer wenn du spawnen willst, überprüfst du ob das entity noch im Radius ist, wenn nicht, einfach die typeinstanz wieder deleten. Hoffe das gibt dir eine grundlegende Idee. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Gizeh |
Mo, Okt 08, 2007 17:28 Antworten mit Zitat |
|
---|---|---|
Danke für Eure Tipps, das sind lauter gute Ansätze
Hat mir wirklich weiter geholfen! |
||
Übersicht BlitzBasic Beginners-Corner
Powered by phpBB © 2001 - 2006, phpBB Group