Performance-schonende Spawn-Abfrage

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Gizeh

Betreff: Performance-schonende Spawn-Abfrage

BeitragMo, Okt 08, 2007 16:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Okt 08, 2007 16:54
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Okt 08, 2007 17:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Okt 08, 2007 17:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Okt 08, 2007 17:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink )
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

BeitragMo, Okt 08, 2007 17:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Okt 08, 2007 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für Eure Tipps, das sind lauter gute Ansätze Wink
Hat mir wirklich weiter geholfen!

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group