Spiel wird nach dem dritten Level langsamer

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Klip

Betreff: Spiel wird nach dem dritten Level langsamer

BeitragMi, Jan 12, 2005 18:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Tag,

es würde mich interessieren, wie ich mein Spiel schneller bekomme. Es handelt sich um einen Astro-Lander-Klon. Das erste und zweite Level laufen noch flüssig, doch ab dem dritten stockt der PC, obwohl dort nicht mehr berechnet wird als in den anderen Leveln.

Ich vermute, dass es daran liegt, dass die alten Bilder, welche nun nicht mehr gebraucht werden, sich immer noch im Zwischenspeicher befinden.

(Ich habe das Spiel in viele Functions unterteilt. die Technik funktioniert perfekt, nur die Geschwindigkeit ist halt langsam. Könnte auch an meinem function-Aufbau liegen, habt ihr Erfahrungen gemacht, dass viele Funktionen ein Spiel mekrlich verlangsamen? Es laufen allerdings nur 2 Stück gleichzeitig ab, jeweils die Funktion, welche die Steuerung des Spielers regelt, sowie eine, welche das Level darstellt, also die Map und den Spieler zeichnet.)

EDIT: Das Spiel läuft noch weiter, allerdings rappelt der PC merklich lauter und die Reaktion auf Tastendrück verlangsamt sich. Kurz gesagt: Es stockt oder "laggt".

Travis

BeitragMi, Jan 12, 2005 19:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Symtome könnten auf einen hohen Speicherverbrauch deuten. Wenn du WinXP hast, dann drücke doch mal STRG+ALT+Enf, wenn es wieder stockt. Dann kannst du im Taskmanager unter Systemleistung deinen Speicherverbrauch kontrollieren.

Falls dieser immer weiter ansteigt und die Auslagerungsdatei immer größer wird, hast du vielleicht eine Grafik in einer Schleife geladen, oder erstellst sehr viele Variablen oder sonstwas.

Ich glaube kaum, dass es an den Funktionen liegt. Ich weiss ja nicht, wie du "viele Funktionen" definierst, aber ich hatte damit noch nie Probleme, selbst mit rekursiven Funktionen nicht.
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.
 

Timo

BeitragMi, Jan 12, 2005 19:15
Antworten mit Zitat
Benutzer-Profile anzeigen
wie du schon sagtest, es kann sein, dass du vielleicht bilder noch im Speicher hast, die allmählich den noch vorhandenen Grafikspeicher zu müllen. Bilder, die du nicht mehr brauchst, kannst du mit FreeImage aus dem Speicher entfehrnen

Klip

BeitragMi, Jan 12, 2005 22:09
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Travis: Sowohl der Prozessor, als auch mein zugesicherter Speicher sind maßlos überlastet, leider. Variablen habe ich nicht zu viele. Klar, einige Bilder natürlich und einige Werte für Wind und Position von Spieler und Landezone. Ich denke nicht, dass es damit zusammenhängt.
Danke für die Bestätigung im Falle der Funktionen.

@ Timo: Ich werde den FreeImage-Befehl ausprobieren, das Resultat editiere oder poste ich hier hinein.

Danke für die Hilfe.

Es handelt sich auch leider um mein erstes richtiges Spiele-Projekt, weswegen ich im analysieren "solcher" Fehler noch keine Übung habe.
 

noir

BeitragMi, Jan 12, 2005 22:14
Antworten mit Zitat
Benutzer-Profile anzeigen
zeig uns halt mal deinen code

BladeRunner

Moderator

BeitragDo, Jan 13, 2005 0:15
Antworten mit Zitat
Benutzer-Profile anzeigen
eventuell ein Loadimage in der Hauptschleife für den dritten level?
Oder loadimmage in den functions bei jedem Aufruf.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Jan_

Ehemaliger Admin

BeitragDo, Jan 13, 2005 8:37
Antworten mit Zitat
Benutzer-Profile anzeigen
WEnn du mir deinen Code sendest, schaue ich mal nach.
between angels and insects

Klip

BeitragDo, Jan 13, 2005 17:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit FreeImage hat leider nichts gebracht.

Ich habe mal probiert, den Code so gut wie es geht zu kommentieren. Damit ihr euch vorstellen könnt, wie das ganze dann aussieht, wenn es läuft, lade ich noch einen Screenshot nach.

EDIT: Hier der Screenshot:
http://img.photobucket.com/albums/v499/Klip/k.jpg

Code: [AUSKLAPPEN]

AppTitle "- K -"


Graphics 640,480,16,2
SetBuffer BackBuffer()

      SetFont(LoadFont("Tahoma",90,1))
      Locate 20,20
      Color 215,0,0
      Print "- K -"

      SetFont(LoadFont("Tahoma",70,1))
      Locate 120,290
      Color 255,255,255
      Print "Lade..."

 ; Grafiken und Variablen laden
      
      Global   raumschiff1 = LoadAnimImage("gfx/raumschiff1.png",40,40,0,10)   ; Spieler
      Global    hoehenanzeige = LoadImage("gfx/hohe.png")
      Global    windanzeige = LoadImage("gfx/wind.png")
      Global    landezone = LoadImage("gfx/landezone.png")                  ; Zielpunkt
      Global    explosion = LoadImage("gfx/explosion.png")
      Global    sfx_explosion = LoadSound("sfx/explosion.wav")
      Global    map1 = LoadImage("gfx/map1.png")                        ; Level
      Global    map2 = LoadImage("gfx/map2.png")
      Global    map3 = LoadImage("gfx/map3.png")
      
      Global level = 1         ; Levelvariable
      Global r_frame = 0         ; Frame des Spielerbildes
      
      MaskImage raumschiff1,150,0,150
      MaskImage hoehenanzeige,150,0,150
      MaskImage windanzeige,150,0,150
      MaskImage explosion,150,0,150
      MaskImage map1,150,0,150
      MaskImage map2,150,0,150
      MaskImage map3,150,0,150
      
   Global x# = 0
   Global y# = 0
   Global gravity# = 0.02
   Global speed# = 0
   Global wind = 0
   Global lzx# = 0
   Global lzy# = 0
      
Repeat         ; Hauptschleife

Select level
   Case 1
      level1
   Case 2
      level2
   Case 3
      level3
   Case 4
      level4
End Select

Until KeyHit(1)
End

; Funktionen -------------------------- #############################################


Function steuerung()

   r_frame = 0

   If KeyHit(1)
      End                        ; mit Esc Spiel beenden
   EndIf
   If KeyDown(200)
      r_frame = 1
      gravity = gravity - 0.05      ; Nach oben
   EndIf
   If KeyDown(203)
      r_frame = 2
      speed = speed - 0.01         ; Nach links
   EndIf
   If KeyDown(205)
      r_frame = 3
      speed = speed + 0.01         ; Nach rechts
   EndIf
   If KeyDown(208)                  ; Nach unten
      r_frame = 4
      gravity = gravity + 0.03
   EndIf

      gravity = gravity + 0.009         ; Schwerkraft
      x = x + speed + wind
      y = y + gravity

   If x < -40 Or x > 660 Or y > 500
      gameover                  ; Wenn man den Bildschirm seitwärts verlässt... : game over!
   EndIf

   If y < -20
      DrawImage hoehenanzeige,x+20,10   ; Anzeige, wenn man den Bildschirm aufwärts verlässt
   EndIf
   
   If ImagesCollide(raumschiff1,x,y,r_frame,landezone,lzx,lzy,0) And speed<0.5 And speed>-0.5 And gravity<0.6
      geschafft            ; Kollision mit der Landezone
   EndIf
   
   DrawImage windanzeige,300,30         ; Windanzeige
   Locate 318,45
   SetFont(LoadFont("Tahoma",14,1))
   Color 255,220,255
   Print wind
   
; -------------------------------------- Debug-Anzeige ----------------------
   SetFont(LoadFont("Tahoma",14,1))
   Color 255,220,255
   Locate 40,400
   Print "Schwerkraft: " + gravity
   Locate 40,420
   Print "Geschwindigkeit: " + speed
   Locate 40,440
   Print "Position: " + x + ", " + y
   
End Function

Function levelstart()            ; Levelanzeige vor jedem Level
   FlushKeys
   Cls
   SetFont(LoadFont("Tahoma",30,1))
   Locate 120,240
   Color 255,220,255
   Print "Level " + level + "!"
   SetFont(LoadFont("Tahoma",20,1))
   Locate 120,290
   Print "Taste drücken"
   WaitKey
End Function

Function level1()               ; Das Level selbst

   FlushKeys

   x = 20.5
   y = 20.5
   wind = 0
   speed = 0
   gravity = 0.02
   lzx = 107
   lzy = 219

   levelstart

   Repeat
   Cls

   TileImage map1,0,0
   DrawImage landezone,lzx,lzy
   DrawImage raumschiff1,x,y,r_frame

; -------------------------------------------- Explosion bei Bodenberührung
   If ImagesCollide(raumschiff1,x,y,r_frame,map1,0,0,0)
   gameover
   EndIf
   
   steuerung
   
   Flip
   Until level <> 1
               FreeImage map1
End Function

Function level2()

   FlushKeys
   
   gravity = 0.02
   speed = 0
   x = 500.5
   y = 120.5
   wind = 0
   lzx = 140
   lzy = 97

   levelstart

   Repeat
   Cls

   TileImage map2,0,0
   DrawImage landezone,lzx,lzy
   DrawImage raumschiff1,x,y,r_frame

; -------------------------------------------- Explosion bei Bodenberührung
   If ImagesCollide(raumschiff1,x,y,r_frame,map2,0,0,0)
   gameover
   EndIf
   
   steuerung

   Flip
   Until level <> 2
               FreeImage map2
End Function

Function level3()

   FlushKeys

   gravity = 0.02
   speed = 0
   x = 12.5
   y = 12.5
   wind = 0
   lzx = 542
   lzy = 372

   levelstart

   Repeat
   Cls
   
   TileImage map3,0,0
   DrawImage landezone,lzx,lzy
   DrawImage raumschiff1,x,y,r_frame

; -------------------------------------------- Explosion bei Bodenberührung
   If ImagesCollide(raumschiff1,x,y,r_frame,map3,0,0,0)
   gameover
   EndIf

   steuerung

   Flip
   Until level <> 3
               FreeImage map3
End Function

Function level4()
Cls
Print "Das war's! Spiel geschafft ^^"
Delay 2000
End
End Function

Function gameover()                  ; Bei Bodenkontakt oder zu schnellem Landen Explosion
   DrawImage explosion,x,y            ; laden und Spiel beenden
   Flip
   blabla = PlaySound(sfx_explosion)
   Delay 500
   Cls
   SetFont(LoadFont("Tahoma",30,1))
   Locate 120,240
   Color 255,220,255
   Print "Versagt!"
   Delay 2000
   End
End Function

Function geschafft()               ; Bei erfüllten Levelbedingungen das nächste Level einleiten
   Delay 200
   Cls
   SetFont(LoadFont("Tahoma",30,1))
   Locate 100,140
   Color 255,220,255
   Print "Level " + level + " geschafft!"
   Delay 1000
   level = level + 1
End Function


Ich hoffe, der Code ist nicht zu ungeordnet. Je länger man das Spiel spielt, desto langsamer wird der Computer. Beendet man es nach dem ersten Level oder währenddessen, merkt man nichts, nach dem zweiten oder dritten Level verlangsamt es den PC jedoch gewaltig.

Ich hoffe auf Hinweise, die mir helfen könnten.
  • Zuletzt bearbeitet von Klip am Do, Jan 13, 2005 17:15, insgesamt einmal bearbeitet

Hubsi

BeitragDo, Jan 13, 2005 17:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Kein Wunder:Code: [AUSKLAPPEN]
SetFont(LoadFont("Tahoma",14,1))
Du hast das mehrmals im Code. Alles was ein Load oder Create beinhaltet verbraucht Speicher. Darum immer alles nur einmal laden und beliebig oft setzen, malen, was auch immer Wink
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Jan_

Ehemaliger Admin

BeitragDo, Jan 13, 2005 17:11
Antworten mit Zitat
Benutzer-Profile anzeigen
kein Wunder!

SetFont(LoadFont("Tahoma",90,1)) = 5-10 MB Speicher, und so oft wie du das Aufrufst!

Kleiner Tip:
Code: [AUSKLAPPEN]

Global Font_Tahoma_90=LoadFont("Tahoma",90,1)
Global Font_Tahoma_30=LoadFont("Tahoma",30,1)
Global Font_Tahoma_20=LoadFont("Tahoma",20,1)
Global Font_Tahoma_18=LoadFont("Tahoma",18,1)
SetFont(Font_Tahoma_90)

DAs dürfte dein Problem lösen.
between angels and insects

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragDo, Jan 13, 2005 17:17
Antworten mit Zitat
Benutzer-Profile anzeigen
1.
deine Loadfont Routine steht in der Steuerung drin,
das wird der wunde Punkt sein, da es immer wieder geladen wird!
Lade diese am Anfang Global in eine Var

Code: [AUSKLAPPEN]
Global Font90 = LoadFont("Tahoma",90,1)
Global Font70 = LoadFont("Tahoma",70,1)
...


und dann nur noch Code: [AUSKLAPPEN]
setfont font90
usw

2. anstatt Locate und Print benutze Text 123,123,"TEXT"
3. Erst alles andere abfragen , bzw ausschliesen bevor diese ImageColli abfrage ausgefüht wird!Code: [AUSKLAPPEN]
If speed < 0.5 Then
    If speed > - 0.5 Then
        If gravity < 0.6 Then
            If ImagesCollide (raumschiff1,x,y,r_frame,landezone,lzx,lzy,0) Then
                geschafft   ; Kollision mit der Landezone
            EndIf
        EndIf
    EndIf
EndIf


Wer viel schreibt kommt auch zu Spät! Smile
[BB2D | BB3D | BB+]

Klip

BeitragDo, Jan 13, 2005 17:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Das funktioniert perfekt.

Vielen Dank für die Hilfe. Ich hätte nicht gedacht, dass ein einfaches Schriftsetzen so viel Speicher verbraucht.

EDIT:
@ Rallimen: Ich werde nachher die If-Schachtelung auch noch probieren, sowie "Text" verwenden, danke.

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragDo, Jan 13, 2005 17:27
Antworten mit Zitat
Benutzer-Profile anzeigen
die einzene Schrift nicht, aber wenn du diese 60 mal, oder mehr, pro sekunde ladest kommen da schnell viele MB´s zusammen!
[BB2D | BB3D | BB+]

Jan_

Ehemaliger Admin

BeitragDo, Jan 13, 2005 17:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Jan_ reicht Hubsi und RAlimen einen Keks und setzt sich auf die zufrieden Kautsch.
between angels and insects

Hubsi

BeitragDo, Jan 13, 2005 18:08
Antworten mit Zitat
Benutzer-Profile anzeigen
*knurps* Danke Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group