Strategiespiel Geschwindigkeitsproblem

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Jean

Betreff: Strategiespiel Geschwindigkeitsproblem

BeitragDo, Mai 25, 2006 14:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Zusammen

Ich arbeite an einem kleineren Strategiespiel. Jedoch ist es relativ langsam, da es 200 Einheiten, 100 Bäume und 100 Gebäude maximal verwenden kann. Und da ich bei jeder auch noch so kleinen Bewegung einer Einheit überprüfen will ob sie eine andere Einheit, ein Baum oder ein Gebäude beürhrt, muss ich jede menge Schleifen verwenden.

Also hier die Rechnung:

200 Durchläufe (Einheiten werde bewegt)
20000 Durchläufe (Einheiten berühren Baum)
20000 Durchläufe (Einheiten berühren Gebäude)
40000 Durchläufe (Einheiten berühren andere Einheit)
100 Durchläufe (Testen ob etwas bereits entwickelt wird)
100 Durchläufe (Testen ob etwas fertig entwickelt ist)

=80400 Durchläufe

Mein Pc (pentium4 3ghz, 1024mb ram, 256mb nvidia, 400gb hd) bekommt nur 31 Frames pro Sekunde hin. Und da ich denke, dass nicht alle ein so leistungsfähigen Pc habe könnte es schnell mal zu Rucklern kommen. Also, was kann ich machen, dass mein Spiel anständig läuft?

Vielen Dank
Jan

D2006

Administrator

BeitragDo, Mai 25, 2006 14:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich weiß ja nicht, was für eine Kollisionsmethode du benutzt, aber ich nehme an pixelgenaue Bilderkollision, oder?

Falls ja:
Wozu bei allen 200 Einheiten diese Kollisionsprüfung durchführen, wenn ca. zB 95% eh weiter weg sind als 50 Pixel und damit eine Kollision ausgeschlossen werden kann?
Als Tipp quasi: Nur auf Kollision prüfen wenn die Dinge, die eine Einheit stören könnte in einem bestimmten Bereich von zB 50 Pixel sind. Abstandsmessung geht mit dem Satz des Pythagoras.

MfG
D2006
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

darth

Betreff: ..

BeitragDo, Mai 25, 2006 14:48
Antworten mit Zitat
Benutzer-Profile anzeigen
dann müsste er doch für jede einheit prüfen ob ein gegenstand in der nähe ist (oder für jeden gegenstand ob eine einheit in der nähe ist)
d.h dass das problem nur verlagert, aber nicht aufgehoben wird...
(soll heissen: anzahl schleifendurchläufe bleiben, alles was vllt wegfällt ist die kollisionsroutine in jedem durchlauf, wird bloss durch eine rechnung ersetzt)

oder sehe ich etwas falsch?
Diese Signatur ist leer.

Jean

BeitragDo, Mai 25, 2006 14:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, ich verwende "IMAGERECTOVERLAP", also alles nur weitere if Abfragen.

D2006

Administrator

BeitragDo, Mai 25, 2006 15:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ihr wisst aber schon, dass ImageRechtOverlap um EINIGES langsamer ist als ne fixe Rechnung mit ner Wurzel. Ist also auf jedenfall Pflicht das einzubauen.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

Artemis

BeitragDo, Mai 25, 2006 15:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Man muss noch nicht einmal die Wurzel ziehen. Schneller geht es, wenn man die Überprüfung der Strecke quadriert.

Also nicht so:
BlitzBasic: [AUSKLAPPEN]
If Sqr((x1-x2)^2+(y1-y2)^2) < 50 Then

sondern:
BlitzBasic: [AUSKLAPPEN]
If (x1-x2)^2+(y1-y2)^2 < 50^2 Then

aMul

Sieger des Minimalist Compo 01/13

BeitragDo, Mai 25, 2006 15:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann mach es lieber gleich so:
BlitzBasic: [AUSKLAPPEN]
If (x1-x2)^2+(y1-y2)^2 < 250 Then

Smile
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

Cardonic

BeitragDo, Mai 25, 2006 15:27
Antworten mit Zitat
Benutzer-Profile anzeigen
50^2 = 50*50 = 2'500 und nicht 250 Wink

mfg Cardonic
If you should go skating on the thin ice of modern life, dragging behind you the silent reproach of a million tear-stained eyes, don't be surprised when a crack in the ice appears under your feet.

D2006

Administrator

BeitragDo, Mai 25, 2006 15:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich machte mal nen fixen Geschwindigkeittest, worin die Methode mit der Wurzel gewann.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

aMul

Sieger des Minimalist Compo 01/13

BeitragDo, Mai 25, 2006 16:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Wurzel schneller als Quadrat Shocked Oder hab ich das jetzt falsch verstanden?

@Cardonic
Ähm ja, oder so^^

EDIT:
@D2006
Code: [AUSKLAPPEN]
ms=MilliSecs()
x=0
For i=0 To 24
   For i2=0 To 24
      For i3=0 To 24
         For i4=0 To 24
            If Sqr((i-i2)^2+(i3-i4)^2)<50 Then x=x+1
         Next
      Next
   Next
Next
Print MilliSecs()-ms
ms=MilliSecs()
x=0
For i=0 To 24
   For i2=0 To 24
      For i3=0 To 24
         For i4=0 To 24
            If (i-i2)^2+(i3-i4)^2<50^2 Then x=x+1
         Next
      Next
   Next
Next
Print MilliSecs()-ms

WaitKey

Also bei mir ist das untere schneller?
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

Spikespine

BeitragDo, Mai 25, 2006 16:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Probier mal anstatt:

(i-i2)^2

lieber:

(i-i2)*(i-i2)

ist schneller Smile
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax

D2006

Administrator

BeitragDo, Mai 25, 2006 17:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Interessant wird's wenn 50^2 variabel wird und wechselt. Hier zum Beispiel zwischen 20 und 70

Code: [AUSKLAPPEN]
time1 = MilliSecs()
SeedRnd 94384

For t=1 To 550000
   If Sqr((x1-x2)^2+(y1-y2)^2) < Rand(20,70) Then blub=1
Next

time1 = MilliSecs() - time1


;--


time2 = MilliSecs()
SeedRnd 94384


For t=1 To 550000
   If (x1-x2)^2+(y1-y2)^2 < Rand(20,70)^2 Then blub=1
Next

time2 = MilliSecs()-time2


Print time1
Print time2


ABER: Wie ich gerade merke, ist der untere Code mithilfe von Spikespines Tipp doch schneller. Also dann doch mit 50*50. Es sei denn es soll nicht variabel sein, dann natürlich 2500.

MfG
D2006
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2
 

BIG BUG

BeitragDo, Mai 25, 2006 18:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Ohne genaue Geschwindigkeitstest gemacht zu haben, behaupte ich einfach mal, dass selbst ImagesCollide nicht viel langsamer als die Wurzelberechnung ist, da es in fast allen Fällen ja nicht einmal zu einer Bildüberlappung kommt und somit auch keine Pixelprüfung durchgeführt werden muss.

Darth Gamer hat schon recht, es werden viel zu viele Objekte gegeneinander geprüft.

Wenn Du mit einer Dim-Tileengine arbeitest, frage einfach nur die umliegenden Tiles per Index ab, wobei natürlich jedes Tile eine Referenz auf alle dort befindlichen Objekte hat.
Ansonsten musst Du eben deine Karte in Zonen aufteilen, so dass Objekte nur in Objekten in eben diesen Zonen überprüft werden. Im Prinzip also wie bei einer Tileengine, nur halt im Hintergrund.
Damit hast Du nur einen Bruchteil der Abfragen. Die Frage ob x*x oder x^2 ist dann nur noch Peanut.
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

Kryan

BeitragDo, Mai 25, 2006 18:17
Antworten mit Zitat
Benutzer-Profile anzeigen
hier n kleiner code zu deinen "peanuts":

Code: [AUSKLAPPEN]
wert=127

m1=MilliSecs()
For i=1 To 10000000
 calc=wert^2
Next

m1final=MilliSecs()-m1
Print m1final


m2=MilliSecs()
For i=1 To 10000000
 calc=wert*wert
Next

m2final=MilliSecs()-m2
Print m2final

WaitKey


Also, wenn ich sowas schon sehe, dann würde ich auch zu dieser Satz-des-Pythagoras-Variante greifen Wink

Aber abgesehen davon, würde das beste Ergebnis bestimmt erzielt werden, wenn man BIG BUGs Vorschläge und die der anderen miteinander kombinieren würde!!
Webspaceanbieter?
Klick hier!
Kultige Spieleschmiede?
Klick hier!

Jean

BeitragDo, Mai 25, 2006 18:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo

Ich habe jetzt einfach mal die Funktion "ImagesOverlap" so umgeschrieben:

Function ImagesOverlap (temp,x1,y1,temp2,x2,y3)
If (x1-x2)^2+(y1-y2)^2 < 250 Then Return True
End Function

Nur leider hat dies wenig mit meinem Problem zu tun, da ich diesen Befehl nur selten verwende, weil bei dem Geschwindigkeitstest weder ein Baum noch ein Mensch auf dem Spielfeld war und so der Befehl immer übersprungen wurde.

BIG BUGs Idee mit den Zonen gefällt mir eigentlich, so wäre es sicher sehr schnell.

Vielen Dank
Jan


Edit: Ich habe nochmals über die Idee von Big Bug nachgedacht und habe gemerkt, dass sie nicht gut umsetzbar ist, da ich nicht weiss, wie viele Einheiten der Spieler in einer Zone haben möchte. Es kann sein, dass dort nur 10 Einheiten sind, jedoch aber auch 200. Also müsste das Einheitenfeld jeder Zone auch wieder 200 Feldeinträge zulassen, womit wieder 200 Schleifendurchläufe notwendig sind. Wink

aMul

Sieger des Minimalist Compo 01/13

BeitragDo, Mai 25, 2006 19:41
Antworten mit Zitat
Benutzer-Profile anzeigen
200 Schleifendurchläufe ist doch wohl nichts! Ausserdem kannste die Zonen ja so groß machen, das z.B. nur 100 Einheiten draufpassen(10x10).

Und du musst doch auch immer nur die Einheiten prüfen, die sich bewegen/schießen/was auch immer. Stillstehende Einheiten brauchen doch keine Abfrage!

Wenn du nicht weißt, wie du den Einheiten eine Zone zuordnest, dann nimm doch einfach die Koordinaten, teile sie durch die größe der Zonen, und schon hast du die richtige Zone.

Achja, am besten testest du nicht nur die Aktuelle Zone, sondern auch die 8 Zonen ausserrum, fals eine Einheit mal über den Rand will Wink

MfG
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

Jean

BeitragDo, Mai 25, 2006 20:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Nunja, um herauszufinden ob eine Einheit still steht oder nicht muss ich ja auch eine Schleife haben Rolling Eyes Und was mache ich, wenn eine Einheit an der Grenze steht? Also ein Teil schon in einer anderen Zone, den anderen in der alten Zone

aMul

Sieger des Minimalist Compo 01/13

BeitragDo, Mai 25, 2006 20:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich zitiere: Wink
aMul hat Folgendes geschrieben:

Achja, am besten testest du nicht nur die Aktuelle Zone, sondern auch die 8 Zonen ausserrum, fals eine Einheit mal über den Rand will Wink


Fals du nicht weiterweißt, kannste dir ja mal mein Schema zum Aufbau der Schleife durchlesen:
Code: [AUSKLAPPEN]
for einheiten.einheit = each enheit
 If Einheit_bewegt_sich then
  for einheiten.einheit = each enheit
   if einheiten_in_der_gleichen_zone then
    if Abstand_zwischen Einheiten<XXX then
     PRÜFEN!
    endif
   endif
  next
 Endif
next

Das sollte eigendlich schnell genug sein, da immer schön ausortiert wird, und zum Schluß vielleicht noch 2 Prüfungen pro Einheit übrigbleiben Wink

MfG
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

5k41

BeitragFr, Mai 26, 2006 10:35
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn ich das richtig verstehe ist das ein Scroll-RPG oder? Dann würd ich mal an deiner Stelle auch auf das zeichnen, nicht nur auf das prüfen achten! Wenn du jeden schleifendurchlauf ALLES zeichnest kann ich mir vorstellen woher der gescwhindigkeitsverlust kommt! Prüfe auf jeden fall vor dem zeichnen, ob die Einheit überhaupt sichtbar ist (wenn du das noch nicht gemacht hast wird das ganzschön was bringen). Und wieso musst du jeden schleifendurchlauf testen, ob schon alles entwickelt ist? Teste das doch nur wenn man entweder im Bau menü ist und grade auf ein Gebäude geklickt hat, welches eine Entwicklung braucht, oder man die nächste Stufe entwickeln willst. Wenn du diese Gedanken nun auf alle Prüfungen etc. überträgst sollte das eigentlich was werden!

MfG
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group