Strategiespiel Geschwindigkeitsproblem
Übersicht

![]() |
JeanBetreff: Strategiespiel Geschwindigkeitsproblem |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
darthBetreff: .. |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo, ich verwende "IMAGERECTOVERLAP", also alles nur weitere if Abfragen. | ||
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dann mach es lieber gleich so:
BlitzBasic: [AUSKLAPPEN] If (x1-x2)^2+(y1-y2)^2 < 250 Then ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
50^2 = 50*50 = 2'500 und nicht 250 ![]() 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. |
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wurzel schneller als Quadrat ![]() @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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Probier mal anstatt:
(i-i2)^2 lieber: (i-i2)*(i-i2) ist schneller ![]() |
||
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax |
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() |
||
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nunja, um herauszufinden ob eine Einheit still steht oder nicht muss ich ja auch eine Schleife haben ![]() |
||
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich zitiere: ![]() 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 ![]() 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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group