Geschwindigkeitsproblem

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

rambo256

Betreff: Geschwindigkeitsproblem

BeitragFr, Mai 07, 2004 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
wie könnte man das optimieren?

Code: [AUSKLAPPEN]
For i = 0 To 99
   If schuss#(i,0) = 1 Then
      schuss#(i,1) = schuss#(i,1)+(3*schuss#(i,3))
      schuss#(i,2) = schuss#(i,2)+(3*schuss#(i,4))
   EndIf
   If schuss#(i,1) > Graphics_Width Or schuss#(i,1) < 0 Or schuss#(i,2) > Graphics_Height Or schuss#(i,1) < 0 Then
      schuss#(i,0) = 0
   EndIf
   For x=0 To Max_tiles_X
      For y=0 To Max_tiles_Y
      
         If ImagesCollide(Projektil_bilder(Winkel_Player,auswahl),schuss#(i,1),schuss(i,2),0,Town1_gfx_2,x*Tile_width,y*tile_height,tile_matrix(2,x,y)) = True Then
            schuss#(i,0) = 0
         EndIf
         
         If Tile_matrix(2,x,y)  > 0 Then
            Kollision_stellen(x,y) = 1
         EndIf
         
         If ImagesCollide(Player_gfx_steht,Player_X,Player_y,0,Town1_gfx_2,x*Tile_width,y*tile_height,tile_matrix(2,x,y))=True  Then
            col_winkel = Winkel(Player_X,Player_Y,x*tile_width,y*tile_height)
            Player_X = Old_player_X
            Player_Y = Old_Player_Y
            col_1 = True
            collide = True
         EndIf
      
         If ImagesCollide(Player_gfx_laeuft_1,Player_X,Player_y,0,Town1_gfx_2,x*Tile_width,y*tile_height,tile_matrix(2,x,y))=True  Then
            col_winkel = Winkel(Player_X,Player_Y,x*tile_width,y*tile_height)         
            Player_X = Old_player_X
            Player_Y = Old_Player_Y
            col_2 = True
            collide = True
         EndIf
         
         If ImagesCollide(Player_gfx_laeuft_2,Player_X,Player_y,0,Town1_gfx_2,x*Tile_width,y*tile_height,tile_matrix(2,x,y))=True  Then
            col_winkel = Winkel(Player_X,Player_Y,x*tile_width,y*tile_height)
            Player_X = Old_player_X
            Player_Y = Old_Player_Y
            col_3 = True
            collide = True
         EndIf
         
         If ImagesCollide(Player_gfx_laeuft_3,Player_X,Player_y,0,Town1_gfx_2,x*Tile_width,y*tile_height,tile_matrix(2,x,y))=True  Then
            col_winkel = Winkel(Player_X,Player_Y,x*tile_width,y*tile_height)
            Player_X = Old_player_X
            Player_Y = Old_Player_Y
            col_4 = True
            collide = True
         EndIf
         
         If ImagesCollide(Player_gfx_laeuft_4,Player_X,Player_y,0,Town1_gfx_2,x*Tile_width,y*tile_height,tile_matrix(2,x,y))=True  Then
            col_winkel = Winkel(Player_X,Player_Y,x*tile_width,y*tile_height)
            Player_X = Old_player_X
            Player_Y = Old_Player_Y
            col_5 = True
            collide = True
         EndIf
         
         If ImagesCollide(Player_gfx_laeuft_5,Player_X,Player_y,0,Town1_gfx_2,x*Tile_width,y*tile_height,tile_matrix(2,x,y))=True  Then
            col_winkel = Winkel(Player_X,Player_Y,x*tile_width,y*tile_height)
            Player_X = Old_player_X
            Player_Y = Old_Player_Y
            col_6 = True
            collide = True
         EndIf
         
         If ImagesCollide(Player_gfx_laeuft_6,Player_X,Player_y,0,Town1_gfx_2,x*Tile_width,y*tile_height,tile_matrix(2,x,y))=True  Then
            col_winkel = Winkel(Player_X,Player_Y,x*tile_width,y*tile_height)
            Player_X = Old_player_X
            Player_Y = Old_Player_Y
            col_7 = True
            collide = True
         EndIf
   
      Next
   Next
Next


wenn ich das einbaue,dann ruckelt es wie sau,auch wenn ich debug enabled ausgeschaltet hab Crying or Very sad
 

Kekskiller

BeitragFr, Mai 07, 2004 22:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast eine ganze Menge an Multiplikationen drinne, was enorm an
der Geschwindigkeit zieht.Zudem fragst du jede einzelne Animation
des Helden ab.Es wäre leichter , wenn du ein einziges Kollisionsbild
erzeugst was alle andern Bilder halbwegs abdeckt und somit deren
Kollisionsprüfung darstellt.Dann ersparst du dir die vielen Abfragen.
Du kannst du Positionen, die berechnet werden auch vorher in ein
Dimfeld laden und später auslesen.Es bringt sehr viel Geschwindigkeit.

rambo256

BeitragFr, Mai 07, 2004 22:41
Antworten mit Zitat
Benutzer-Profile anzeigen
ich habe es jetzt in mehrere For-SChleifen aufgeteilt,is jetzt auch schon besser,d.h. jetzt hab ich ca. 20 frames/second,aber bekomme ich das auch noch schneller hin?
 

Kekskiller

BeitragFr, Mai 07, 2004 22:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Verwende nicht so viele Floatzahlen.Wie ich sehe, hast du für eine
bestimmte Anzahl von etwas diese verwendet.Benutze nur Integer-
zahlen bei solchen Unternehmungen.Ansonsten sollte man noch
Auflösung und Farbtiefe entschärfen ( sofern du es schon getan hast ).

rambo256

BeitragFr, Mai 07, 2004 22:49
Antworten mit Zitat
Benutzer-Profile anzeigen
ich wüsste nochwas...
Sollte ich die Projektile als Plot,rect oder als image zeichnen?
Aber dann stellt sich die Frage,wie ich das mit der Kollisionsabfrage mache,wenn ich statt Bilder Plots bzw. rects habe?!
 

IonPainter

BeitragFr, Mai 07, 2004 23:03
Antworten mit Zitat
Benutzer-Profile anzeigen
image ist schon ok, du machst zu viele kollisionsabfragen... probier mal imagesoverlap statt imagescollide

rambo256

BeitragSa, Mai 08, 2004 9:48
Antworten mit Zitat
Benutzer-Profile anzeigen
das hab ich mir auch schon gedacht,aber dann hab ich folgendes problem:
Da ich 3layer habe und mehrere Tiles in einem Tileset,muss ich dann auch die Frames angeben... Crying or Very sad
Und das geht ja bei imagesoverlap nicht

rambo256

BeitragSa, Mai 08, 2004 9:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich hab jetzt gemerkt,das es an dieser Abfrage liegt...
wie könnte man das optimiern?

Code: [AUSKLAPPEN]
For i=0 To 99
    For x=0 To Max_Tiles_X
       For y=0 To Max_Tiles_Y
      If ImagesCollide(Projektil_bilder(Winkel_Player,auswahl),schuss#(i,1),schuss(i,2),0,Town1_gfx_2,x*Tile_width,y*tile_height,tile_matrix(2,x,y)) = True Then
         schuss#(i,0) = 0
      EndIf
      Next
   Next
Next
 

HOT-BIT

Gast

BeitragSa, Mai 08, 2004 12:27
Antworten mit Zitat
Hmmm,

das ist doch irgendwie klar !

Wenn du 100 mal die x-y-Koordinaten deiner ganzen Map durchrechnen läßt.
Berechne einfach die Koordinate deines jeweiligen Schusses auf der Map
Dann geht es schneller.

Toni

rambo256

BeitragSo, Mai 09, 2004 11:17
Antworten mit Zitat
Benutzer-Profile anzeigen
mhh,irgendwie versteh ich nicht was du damit meinst...
Das mache ich doch eigentlich oder nicht?
Vll wäre es ganz nützlich,wenn du mir mal einen Pseudo-Code aufschreibst,das wäre nett!!
THX
 

Kekskiller

BeitragSo, Mai 09, 2004 18:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Du berechnest aber für alle Schüsse im Dimfeld die Variablen.
Ich würde Typen empfehlen und dem entsprechend eine Each-Schleife
machen

soli

BeitragSo, Mai 09, 2004 19:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Du solltest nur Prüfen wenn schuss#(i,0)=1 ist,
ausserdem weisst du doch wo der Schuss ist,
da musst du nicht mit allen Tiles vergleichen.

.....
code kann ich dir leider keinen geben,
mein Blitz startet nicht mehr sobald ich
online bin.
Sad
solitaire

rambo256

BeitragSo, Mai 09, 2004 20:56
Antworten mit Zitat
Benutzer-Profile anzeigen
einen Pseudo-Code denn?

soli

BeitragMo, Mai 10, 2004 2:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Das allererste "endif" das zu
"If schuss#(i,0) = 1 Then "
gehört, erst vor dem letzten "next"
schliessen.

und diese Schleife
For x=0 To Max_tiles_X
For y=0 To Max_tiles_Y
.....
müsste wohl raus
und durch soetwas ersetzen:

if positionschuss=positionfeind
if positionschuss=positionzielobjekt
if positionschuss=positionhinderniss
etc

aber auf keinen fall alle tiles abfragen
solitaire

rambo256

BeitragMo, Mai 10, 2004 14:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Also,ich denke du meinst das so:

hier zähle ich alle "Kollisionsstellen",aber vor der repeat schleife!!!

Code: [AUSKLAPPEN]

For x=0 To max_tiles_X
   For y=0 To Max_tiles_Y
      If tile_matrix(2,x,y) > 1 Then
         Kollision_stellen(X,Y) = 1
         kollis = kollis+1
      EndIf
   Next
Next


Hier ist die eigentliche kollisionsabfrage und die Kugelaktualisierung:

Code: [AUSKLAPPEN]
;Kugeln Aktualisiern

For i = 0 To 99
   
   If schuss(i,0)=1 Then
      
      schuss(i,1) = schuss(i,1)+(3*schuss(i,3))
      schuss(i,2) = schuss(i,2)+(3*schuss(i,4))
      
      If schuss(i,1) > Graphics_Width Or schuss(i,1) < 0 Or schuss(i,2) > Graphics_Height Or schuss(i,1) < 0 Then
         schuss(i,0) = 0
      EndIf
      
      For x=0 To max_tiles_x
         For y=0 To max_tiles_y
            If Kollision_stellen(X,Y) = 1 Then
               If ImagesCollide(projektil_bilder(Winkel_Player,auswahl),schuss(i,1),schuss(i,2),0,town1_gfx_2,x*Tile_width,y*tile_height,tile_matrix(2,x,y)) Then
                  schuss(i,0) = 0
               EndIf
            EndIf
         Next
      Next    
   EndIf
Next


nur dann kommt in unregelmäßigen abständen beim schießen ein Array index out of bounce...

rambo256

BeitragMo, Mai 10, 2004 15:52
Antworten mit Zitat
Benutzer-Profile anzeigen
woran liegt das?!
Es klappt jetzt alles,nur dann kommt in unregelmäßigen abständen ein Array-Index out of bounds. Das kam sonst nie!!!
Wäre nett wenn ihr mir da auch noch weiterhelfen könntet.
THX

soli

BeitragMo, Mai 10, 2004 17:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Mach den Debugger an,
und sag mal in welcher Zeile
der Fehler auftritt.
solitaire

rambo256

BeitragMo, Mai 10, 2004 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Diese:

Code: [AUSKLAPPEN]
If ImagesCollide(projektil_bilder(Winkel_Player,auswahl),schuss(i,1),schuss(i,2),0,town1_gfx_2,x*Tile_width,y*tile_height,tile_matrix(2,x,y))

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group