Probleme mit Geschwindigkeit

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

prolapper

Betreff: Probleme mit Geschwindigkeit

BeitragSa, Jan 05, 2008 22:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Leute

Ich habe gerade folgendes Spiel geschrieben. Es ist noch sehr simpel und noch nicht richtig spielbar,
aber das Spielprinzip sollte mit diesem Code klar werden. Jedoch ist mir aufgefallen, dass dieses Programm sehr viel Rechnerleistung beansprucht, ist ja klar mit den ganzen Schleifen. Deswegen frage ich euch, ob vielleicht einer mir helfen kann und einen anderen Weg, der nicht so rechenaufwendig ist posten kann.

Hier noch mal das Spielprinzip kurz dargelegt:

; - Alle paar Sekunden (hängt von Schwierigkeit ab) wird ein neuer Stein erstellt
; - Alle paar Hundertsl (hängt auch von Schwierigkeit ab) werden alle Steine, die "in Bewegung sind" um
ein Pixel weiter nach unten verschoben
;
; - Alle Steine, die nicht weg sind werden gezeichnet
;
; - Es wird überprüft ob eine Taste gedrückt wurde und wenn ja welche.
; - Wenn Es ein Buchstabe ist wird in einer Schleife ein Stein mit dem selben Buchstaben
herausgesucht und wird entfernt
; - Wenn Es Esc ist kommt man ins Menü ( Es wird beendet )
; - Später werden noch Zusatztasten eingefügt.

Code: [AUSKLAPPEN]

;-------------------------------------------------------Images laden------------------------------------------------------------

Global hintergrund = LoadImage("Grafiken\hintergrund2.bmp")
Global stein_a = LoadImage("Grafiken\A.bmp")
Global stein_b = LoadImage("Grafiken\B.bmp")
Global stein_c = LoadImage("Grafiken\C.bmp")
Global stein_d = LoadImage("Grafiken\D.bmp")
Global stein_e = LoadImage("Grafiken\E.bmp")
Global stein_f = LoadImage("Grafiken\F.bmp")
Global stein_g = LoadImage("Grafiken\G.bmp")
Global stein_h = LoadImage("Grafiken\H.bmp")
Global stein_i = LoadImage("Grafiken\I.bmp")
Global stein_j = LoadImage("Grafiken\J.bmp")
Global stein_k = LoadImage("Grafiken\K.bmp")
Global stein_l = LoadImage("Grafiken\L.bmp")
Global stein_m = LoadImage("Grafiken\M.bmp")
Global stein_n = LoadImage("Grafiken\N.bmp")
Global stein_o = LoadImage("Grafiken\O.bmp")
Global stein_p = LoadImage("Grafiken\P.bmp")
Global stein_q = LoadImage("Grafiken\Q.bmp")
Global stein_r = LoadImage("Grafiken\R.bmp")
Global stein_s = LoadImage("Grafiken\S.bmp")
Global stein_t = LoadImage("Grafiken\T.bmp")
Global stein_u = LoadImage("Grafiken\U.bmp")
Global stein_v = LoadImage("Grafiken\V.bmp")
Global stein_w = LoadImage("Grafiken\W.bmp")
Global stein_x = LoadImage("Grafiken\X.bmp")
Global stein_y = LoadImage("Grafiken\Y.bmp")
Global stein_z = LoadImage("Grafiken\Z.bmp")

;--------------------------------Variablen Deklarieren -----------------------------------------------------------------------

MaskImage hintergrund, 255,0,255

SeedRnd MilliSecs()

ZanfangEr = MilliSecs()  ;Diese Variable wird nur manchmal deklariert und ist für das ERSTELLEN VON STEINEN zuständig ;Er == Erstellen
ZanfangBe = ZanfangEr    ;Diese Variable wird nur manchmal deklariert und ist für das BEWEGEN VON STEINEN zuständig   ;Be == Bewegen
Zmomentan = MilliSecs () ;Diese Variable wird jede Schleife neue deklariert

MilisecNrstein = 1000    ;Millisekunden bis zum erstellen des nächsten Steins
MilisecBestein = 30      ;Millisekunden bis zum Bewegen der Steine

Global welcher = 0       ;Variable, die der Funktion 'Imageermitteln()' übergeben wird, die das richtigen Image für den Stein zum Ausgeben ermittelt
Global stein          ;Varable, die angibt welches Image ausgegeben wird
;---------------------------Typen und DIM-Felder-------------------------------------------------------

Type Stein
   
   Field X, Y, Art, Bewegung
   
   ; Bewegung = 0 == Stein wird nicht gezeichnet
   ; Bewegung = 1 == Stein bewegt sich gerade
   ; Bewegung = 2 == Stein bewegt sich nicht
   ;
   ; Art = 97 == Art = "A"
   ; Art = 98 == Art = "B"
   ; Art = 99 == Art = "C"
   ; Art = 100== Art = "D"
   ;         ...
   ;         ...
   ;         ...
   ;         ...
   ; Art = 122== Art = "Z"
   
End Type

Dim Steine.Stein(60)

For I = 1 To 60
 
      Steine(I)= New Stein
      Steine(I)\Bewegung = 0
      
Next


;----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
                                                    Graphics 800,600,0,2
                                                    SetBuffer BackBuffer ()
;---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
;--------------------------------------------------------HAUPTSCHLEIFE---------------------------------------------------------------------------------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Repeat

Cls

   Zmomentan = MilliSecs()
   

;------------------------STEIN erstellen--------------------
   
   If  Zmomentan - ZanfangEr => MilisecNrstein
      

      For I = 1 To 60
         
         If Steine(I)\Bewegung = 0 Then
            
            Welchespalte = Rand(1,6)
            
            If Welchespalte = 1 Then Welchespalte = 30
            If Welchespalte = 2 Then Welchespalte = 114
            If Welchespalte = 3 Then Welchespalte = 198
            If Welchespalte = 4 Then Welchespalte = 282
            If Welchespalte = 5 Then Welchespalte = 366
            If Welchespalte = 6 Then Welchespalte = 450
            
            
            Steine(I)\Bewegung = 1
            Steine(I)\X = Welchespalte
            Steine(I)\Y = -5
            Steine(I)\Art = Rand(97,122)
            
            Exit
            
         EndIf
      
      Next
      
      ZanfangEr = ZanfangEr + MilisecNrstein
      

   EndIf
;------------------------------------------------------------

   Zmomentan = MilliSecs()

;-----------------------Steine bewegen-----------------------
   If Zmomentan - ZanfangBe => MilisecBestein
      
      For I = 1 To 60
      
         If Steine(I)\Bewegung = 1 Then
            
            Steine(I)\Y = Steine(I)\Y + 1
         EndIf
         
      Next
      
      ZanfangBe = ZanfangBe + MilisecBestein
      
   EndIf
;------------------------------------------------------------


;----------------------Steine zeichnen(Grafik ausgeben)-----------------------
   For I = 1 To 60

      If Steine(I)\Bewegung <> 0 Then
      
         welcher = Steine(I)\Art
         Imageermitteln(welcher)

         DrawImage stein, Steine(I)\X, Steine(I)\Y
      
      EndIf
   
   Next

;------------------------------------------------------------
DrawImage  hintergrund, 0, 0
   
   
Flip

Until KeyHit(1)
;---------
End;------
;---------



;--------------------------------------------------------FUNKTIONEN--------------------------------------------------------------------------------------------------------------------------------------------------------------------
;----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
;(-)-[-]-{-}-\-/-{-}-[-]-(-)-(-)-[-]-{-}-\-/-{-}-[-]-(-)-(-)-[-]-{-}-\-/-{-}-[-]-(-)-(-)-[-]-{-}-\-/-{-}-[-]-(-)-
Function Imageermitteln(welcher)
      
      If welcher = 97 Then stein = stein_a
       If welcher = 98 Then stein = stein_b
       If welcher = 99 Then stein = stein_c
       If welcher = 100 Then stein = stein_d
       If welcher = 101 Then stein = stein_e
       If welcher = 102 Then stein = stein_f
       If welcher = 103 Then stein = stein_g
       If welcher = 104 Then stein = stein_h
       If welcher = 105 Then stein = stein_i
       If welcher = 106 Then stein = stein_j
       If welcher = 107 Then stein = stein_k
       If welcher = 108 Then stein = stein_l
       If welcher = 109 Then stein = stein_m
      If welcher = 110 Then stein = stein_n
       If welcher = 111 Then stein = stein_o
       If welcher = 112 Then stein = stein_p
       If welcher = 113 Then stein = stein_q
       If welcher = 114 Then stein = stein_r
       If welcher = 115 Then stein = stein_s
       If welcher = 116 Then stein = stein_t
       If welcher = 117 Then stein = stein_u
       If welcher = 118 Then stein = stein_v
       If welcher = 119 Then stein = stein_w
       If welcher = 120 Then stein = stein_x
       If welcher = 121 Then stein = stein_y
       If welcher = 122 Then stein = stein_z
 
End Function



Danke im Voraus
Prolapper
P.S: ICH SUCHE NOCH EINEN GRAFIKER UND EINEN PROGRAMMIERER FÜR EIN RPG
E-Mail: prolapper@gmx.net

Eingeproggt

BeitragSa, Jan 05, 2008 22:32
Antworten mit Zitat
Benutzer-Profile anzeigen
also....

1.) Gib Graphics ganz an den Anfang. Weiß nicht, wie du es zusammengebracht hast, dass bei deiner Konstruktion kein Fehler kommt... Beim Aufruf von Graphics werden nämlich alle Graphiken gelöscht.
2.) Dein Spiel ist so langsam, weil du "Flip" drin hast. Schreib mal "Flip 0". Deine Berechnung selbst ist auf meinem PC blitzschnell, ein Schleifendurchlauf in weniger als 1ms
3.) Ich hatte keine Graphiken zum testen, also hab ich mir selber welche gemacht Smile
Code: [AUSKLAPPEN]
SetFont LoadFont("Arial Black",24)
img=CreateImage(32,32)
SetBuffer ImageBuffer(img)
For i=65 To 90
   Color Rand(0,255),Rand(0,255),Rand(0,255)
   Rect 0,0,32,32
   Color 255,255,255
   Text 16,16,Chr(i),1,1
   SaveBuffer ImageBuffer(img),Chr(i)+".bmp"
Next

4.) Ich würd die Graphiken übrigens in inen Array packen, wär "schöner"

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

prolapper

BeitragSa, Jan 05, 2008 23:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey danke für die schnelle Antwort.
Hab die Sachen etz umgeändert. Also auf des Array hat ich eigentlich selbst kommen müssen ^^.
Aber trotzdem:
Der Bildablauf ist sehr instabil. Mal raßen die Steine für 0,2 Sek. und dann ruckeln sie sich in beunruigend langsamen bewegungen zum Boden.
Ich denke vielleicht gar nicht, dass es am rechenaufwand liegt, weil sich die schnellen und langsamen Bewegungsabschnitte im Durchschnitt auflösen und dann genau so schnell wären wie gewünscht.
Aufgefallen ist mir auch , dass die Steine immer GENAU nach der ursprünglichen erdachten Zeit erstellt werden.
*Verzweifel*

Prolapper



*EDIT :
Hab etz mal nen FPS-berechner eingebaut und der gibt ein verblüffendes Ergebnis zurück:
Der sagt, dass das bild sehr oft in der Sekunde aufgebaut wird. Also kann es nicht am Ausgeben der Grafiken liegen und am erstellen wie gesagt auch nicht. Es muss also ein Fehler am aktualiesieren der Stein positionen liegen.
Aber ich weiß nicht welcher ?!
P.S: ICH SUCHE NOCH EINEN GRAFIKER UND EINEN PROGRAMMIERER FÜR EIN RPG
E-Mail: prolapper@gmx.net

prolapper

BeitragSo, Jan 06, 2008 0:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Etz versteh ich garnix mehr ...
Wenn ich etz irgendwo im Quellentext den Befehl
Code: [AUSKLAPPEN]
Print "..."

einfüg, dann funktionierts genau richtig.

?????????????????????????????????????????????

Ist übrigens egal was der Befehl ausgibt, hauptsache er gibt was aus.
Kann sich das jemand erklären ???
Später möcht ich dann nicht so einen gammigen Print-Befehl im Spiel haben ^^
P.S: ICH SUCHE NOCH EINEN GRAFIKER UND EINEN PROGRAMMIERER FÜR EIN RPG
E-Mail: prolapper@gmx.net

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group