Kleines Programm ist schon sehr langsam

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

entres

Betreff: Kleines Programm ist schon sehr langsam

BeitragSo, Sep 16, 2007 14:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry dass ich euch wieder stören muss, aber ich bin echt am verzweifeln...

Ich habe ein bereits recht einfaches Programm geschrieben was als Basis für einen kleinen Shooter diienen soll. Aber ich habe jetzt schon sehr starke Performanceschwierigkeiten...
Diese gehen zwar einigermaßen in Ordnung wenn ich das Programm in Vollbild starte, aber dann habe ich ein sehr starkes flimmern...

Das Programm besteht aus drei Dateien. Sprite.bb für meine Spriteklasse, engine.bb für den Rahmen des programms und KleinerShooter.bb für das Hauptprogramm.

Engine.bb
Code: [AUSKLAPPEN]

;Datum:   07.09.2007
;Aufgabe: Einfache 2D-Engine


;Globale Konstanten
Const scUp    = 200
Const scLeft  = 203
Const scRight = 205
Const scDown  = 208


;Globale Spielvariablen
Global gPause   = False
Global gRunning = True
Global gWidth    = 640
Global gHeight   = 480


Function GRunMainLoop()
;Vergangene Zeit
   Local ms
   Local frameTimer=CreateTimer(30)
   
   SetBuffer BackBuffer()

   GInit()
   
   ms = MilliSecs()
   
   Repeat       
      ;Zuständer werden aktualisiert
      GUpdate( MilliSecs() - ms )      
      Repeat       
         ;Bildschirm wird gezeichnet
         GRender()
         Flip
         FlushKeys
         
         ;Neue zeit wird aufgenommen
         ms = MilliSecs()          
      Until Not gPause    
      WaitTimer(frameTimer)
      ;Delay 5
   Until Not gRunning
End Function




Sprite.bbCode: [AUSKLAPPEN]
Type Sprite
   Field image      ; Bild. Kann animiert sein.
   Field isAnimated ; Wahrheitswert über Animation
   Field x#         ; Koordinaten als Float
   Field y#         ;
   Field frame      ; Aktuelles Frame
   Field frame_max  ; Anzhal der Frames
   Field duration   ; Dauer eines Einzelbildes
   Field curTime    ; Aktuelle Ziet
   Field isActive     ; Flag ob Sprite Aktiv ist
End Type

Function Sprite_New.Sprite(image, x#, y#)
   obj.Sprite     = New Sprite
   obj\image      = image
   obj\isAnimated = False
   obj\x          = x
   obj\y          = y
   obj\frame      = 0
   obj\frame_max  = 1
   obj\duration   = 0
   obj\curTime    = 0
   obj\isActive   = True
   
   MaskImage obj\image, 255, 0, 255
   
   Return obj
End Function

Function Sprite_NewAnimated.Sprite(image, x#, y#, start, count, dur)
   obj.Sprite     = New Sprite
   obj\image      = image
   obj\isAnimated = False
   obj\x          = x
   obj\y          = y
   obj\frame      = start
   obj\frame_max  = count
   obj\duration   = dur
   obj\curTime    = dur
   obj\isActive   = True
   
   MaskImage obj\image, 255, 0, 255
   
   Return obj
End Function

Function Sprite_SetMask(obj.Sprite)
   MaskImage obj\image, 255, 0, 255
End Function

Function Sprite_Update(obj.Sprite, ms)
   obj\curTime = obj\curTime - ms
   ;Wenn Zeitintervall durchbrochen: Neues Frame
   If obj\curTime <= 0 Then
      obj\curTime = obj\curTime + obj\duration
      obj\frame = (obj\frame + 1) Mod obj\frame_max
   EndIf
End Function


Function Sprite_Paint(obj.Sprite)
   
   If obj\isActive Then    
      DrawImage obj\image, obj\x, obj\y, obj\frame
   EndIf
      
End Function


Function Sprite_CollisionPixel(spr.Sprite, x, y)
   ;!TODO: Optimieren
   If spr\isActive And x>=spr\x And y>=spr\y And x<=(spr\x + ImageWidth(spr\image)) And y<=(spr\y + ImageHeight(spr\image)) Then
      Return True
   Else
      Return False
   End If
End Function




kleinerShooter.bb Code: [AUSKLAPPEN]
Include "Engine.bb"
;Include "Enemy.bb" 
;Include "Timer.bb"
Include "Sprite.bb"

AppTitle "kleiner Shooter"


;Variablen wie u.A. Schüsse usw.
Const bulletsMax = 25
Global bullets.Sprite[bulletsMax]

Global cursor = 0
Global backGround = 0

GRunMainLoop()

End


Function GInit()
   Graphics 640, 480;, 32, 1 ; Im Vollbild schneller, aber flimmern
   
   cursor = LoadImage("visier.bmp")
   backGround = LoadImage("bg.bmp")
   MidHandle cursor
   MaskImage cursor, 255,0,255
   HidePointer
   
   Local bulletImage = LoadImage("Bullet.bmp")
   
   ;Kugeln initialsieren und auf inaktiv setzen
   For i = 1 To bulletsMax
      bullets[i] = Sprite_New(bulletImage, 0,0)
      bullets[i]\isActive = False 
   Next
End Function

Function GUpdate(ms)
   ;DEBUG
   ;DebugLog "Update"
   
   
   ;Gehe Kugeln durch und wenn aktiv aktualisieren.
   For i=1 To bulletsMax
      If bullets[i]\isActive Then
         bullets[i]\x = bullets[i]\x + (640.0 * ms)/1000.0
         
         ;wenn Kugel ausserhalb des Bildschirms dann inaktiv
         If bullets[i]\x > 640 Then
            bullets[i]\isActive = False 
         EndIf
      EndIf
   Next
   
   ;Wenn Space gedrückt ist schießen
   If MouseDown(1) Then
      For i=1 To bulletsMax
         If Not bullets[i]\isActive Then
            bullets[i]\isActive = True
            ;DEBUG
            bullets[i]\x = MouseX()
            bullets[i]\y = MouseY()
            ;DebugLog i
            
            Exit
         EndIf
      Next
   EndIf
   
   If KeyDown(1) Then
      gRunning = False
   EndIf
End Function

Function GRender()
   DrawBlock backGround, 0,0
   ;Kugeln zeichnen wenn aktiv
   For i=1 To bulletsMax
      If bullets[i]\isActive Then
         DrawImage bullets[i]\image, bullets[i]\x, bullets[i]\y
      EndIf
   Next
   
   ;Pointer zeigen
   DrawImage cursor, MouseX(), MouseY()
End Function



Hier noch die Bilder. Müssen noch umbenannt werden.

http://www.pandafile.com/uploa...visier.bmp
http://www.pandafile.com/uploads/89383602_bg.bmp
http://www.pandafile.com/uploa...bullet.bmp

Tankbuster

BeitragSo, Sep 16, 2007 14:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du ein Code: [AUSKLAPPEN]
SetBuffer Backbuffer()
im Code? (wenn nicht, mach schnell)
Das könnte die Erklärung für das Flackern sein Wink
Twitter
Download Jewel Snake!
Windows|Android
 

Lador

BeitragSo, Sep 16, 2007 14:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, vielleicht liegt es ja daran, dass du einen Timer mit 30 drinnen hast. Das würde bei mir dann schon nur halb so schnell laufen. Lass einfach mal das Code: [AUSKLAPPEN]
WaitTimer (frameTimer)
weg. Außerdem sind 2 Repeat-Schleifen nicht wirklich das beste, da sie auch sehr langsam sind (also mehrere).

MFG Lador

entres

BeitragSo, Sep 16, 2007 14:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Tankbuster hat Folgendes geschrieben:
Hast du ein Code: [AUSKLAPPEN]
SetBuffer Backbuffer()
im Code? (wenn nicht, mach schnell)
Das könnte die Erklärung für das Flackern sein Wink
Ah ich bin so ein TROTTEL -.-


Ich hab den Fehler gemacht dass ich das setBuffer vor dem GInit() gesetzt habe und im GInit wird erst der Grafikmodus eingeschaltet...

Das heißt die Setbuffer Option wird dann wieder zerstört... okay, das nächste mal weiss ich worauf ich achten muss ^^;


Danke für die Hilfe!

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group