Kleines Programm ist schon sehr langsam
Übersicht

![]() |
entresBetreff: Kleines Programm ist schon sehr langsam |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hast du ein Code: [AUSKLAPPEN] SetBuffer Backbuffer() im Code? (wenn nicht, mach schnell)
Das könnte die Erklärung für das Flackern sein ![]() |
||
Twitter
Download Jewel Snake! Windows|Android |
Lador |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Tankbuster hat Folgendes geschrieben: Hast du ein Code: [AUSKLAPPEN] Ah ich bin so ein TROTTEL -.-
SetBuffer Backbuffer() im Code? (wenn nicht, mach schnell)
Das könnte die Erklärung für das Flackern sein ![]() 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! |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group