50 % Auslasstung bei Jump and Run

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

Lars

Betreff: 50 % Auslasstung bei Jump and Run

BeitragFr, März 12, 2010 20:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Allerseits!

Ich programmiere gerade ein Jump and Run spiel.
Die Ausslastung ist immer auf 50 %. Ich habe einen dualcore prozessor a 2,66 Gz pro Kern.
Ich weiß das BB3D nur einen davon ansprechen kann, aber trotzdem finde ich 50% etwas extrem.
Ich habe mir auch schon Tuturial "Hurra 100% Auslasstung" und ein par andere Beiträge durchgelesen, aber irgendwie löst das nicht mein Problem.

Hier ist der Code:
Code: [AUSKLAPPEN]
Global timer = CreateTimer (60)
Graphics 270, 400,0,2


SetBuffer BackBuffer()

;variabeln

Dim box(1)
Dim boxx(1,5)
Dim boxy(1,5)
Dim hohe (20,2)
Dim wx(xmeng)
Dim wy(ymeng)
Dim mapx%(220)
Dim mapy%(108)
Dim map%(xmeng,ymeng)

Global figur
Global figurx = 175
Global figury = -100
Global collision
Global background1
Global speed#
Global blub
Global nullv = -250
Global nullvoy = -400
Global border1
Global font1
Global style1
Global game
Global wert%


Const ymeng = 1200
Const xmeng = 440





boxx (1,1) =175
boxy (1,1) =-100
boxx (1,2) =175
boxy (1,2) =270
boxx (1,3) =175
boxy (1,3) =170
boxx (1,4) =160
boxy (1,4) =100



;laden

box(1) = LoadImage ("media/box1.bmp")
figur = LoadImage ("media/figur.bmp")
background1 = LoadImage ("media/background1.bmp")
border1= LoadImage ("media/border1.bmp")
font1 = LoadFont ("Arial",18,1)

;consruieren

While Not KeyHit(1)


startf()

While Not game = 1

menuef()

Flip
Wend
 
startf()

zufallf()

;hauptschleife

While Not KeyHit(1)

  spielf()

   
  WaitTimer timer 
  Flip
Wend 

Wend
End

Function menuef()

         menuezeichnenf()

         If KeyHit(59) Then game=1
         If KeyHit(1) Then End

End Function

Function menuezeichnenf()
     
         TileBlock background1
         DrawImage border1,0,-400
         
         SetFont font1 Color 0,0,0
         Text 5,-400, "Rekord: " + nullvoy/16
         Text 5,-300, "Spielen = F1"

End Function 


Function startf()

         Cls         

         figurx = 175
         figury = -135
         collision = 0
         speed# = 7
         blub = 0 
         nullv = -250
         nullvoy =400
         game = 0
         Origin 0,400

         For gx=0 To xmeng Step 44
             For gy=0 To ymeng Step 1
             map%(gx,gy) = 0
             Next
         Next


 
         


End Function

       
Function spielf()


                   
         collisionf()
         bewegungf()
         jumpf()
         nullpunktf()
         seitenf()
         zeichnenf()
       

       

End Function


Function collisionf()

         figurxc1=figurx
         figuryc1=figury+37

         figurxc2=figurx+26
         figuryc2=figury+37   

         rgb1 = ReadPixel(figurxc1, figuryc1)
         rgb2 = ReadPixel(figurxc2, figuryc2)
               
         g1 = (rgb1 And $FF00) / $100
         g2 = (rgb2 And $FF00) / $100
         r1 = (rgb1 And $FF0000) / $100
         r2 = (rgb2 And $FF0000) / $100
         b1 = (rgb1 And $FF) / $100
         b2 = (rgb2 And $FF) / $100


         If g1 > 240 And r1 < 10 And b1 < 10 Then collision = 1 
         If g2 > 240 And r2 < 10 And b2 < 10 Then collision = 1
         
End Function


Function bewegungf()
                               
         If KeyDown(203) Then figurx=figurx-2
         If KeyDown(205) Then figurx=figurx+2
   
         Cls
                   
End Function


Function jumpf()

         
         If collision = 1
         speed=5
         blub=1
         EndIf

         

         If blub=1

         ge#=0.1

         figury=figury-speed
       
         speed=speed - ge#

         collision = 0

         If speed <= -2.5 Then speed = -2.5 
       
         EndIf
         

End Function


Function nullpunktf()

         

         If figury <= nullv And figury>=nullv-100
         nullv=nullv-1
         
         
         nullvoy=nullvoy+1
         
         Origin 0,nullvoy

         EndIf

         If figury <= nullv-100
         nullv=nullv-3
         
         
         nullvoy=nullvoy+3
         
         Origin 0,nullvoy

         EndIf

         

         
                         

End Function


Function seitenf()
 
         If figurx > 280 Then figurx= -9
         If figurx < -10 Then figurx= 279 


End Function

       
 
Function zeichnenf()

         
         
         TileBlock background1

         DrawImage box(1),boxx(1,1),boxy(1,1)

         DrawImage border1,0,-nullvoy
         
         SetFont font1 Color 0,0,0
         Text 5,-nullvoy, "Höhe: " + nullvoy/16

     
         For gx=0 To xmeng Step 44
             
             For gy=0 To ymeng
 
                 If map%(gx,gy) = 1 Then DrawImage box(1), gx, gy*(-1)

             Next

         Next 
           
         DrawImage figur,figurx,figury
         
         
End Function


Function zufallf()

         gy=0   
         a=0

         Repeat   
         a=0
         x=0
               SeedRnd MilliSecs()+gy

         For a=0 To 5
             zwy = Rnd(0,9)
             zwx = Rnd(0,5)
               
             y=gy+zwy*12
             x=zwx*44
             
             map%(x,y)=1
         Next
               

         gy=gy+109

         Until gy>=1090                 
               

End Function


Ich hoffe auf Hilfe!
LG Lars

mpmxyz

BeitragFr, März 12, 2010 20:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Es wird höchstwahrscheinlich am Flip ohne 0 liegen.
Der Grund dafür steht etwas weiter unten in dem "Hurra 100% Auslastung"-Thread.
(Das Warten auf den Bildschirm funktioniert nicht optimal.)
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

Lars

BeitragFr, März 12, 2010 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn ich flip 0 mache dann klappt das spiel nicht mehr richtig!

Xeres

Moderator

BeitragFr, März 12, 2010 20:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Davon abgesehen ist deine Programmstruktur undurchsichtig.
Du benutzt mehr als eine Hauptschleife (bzw. verschachtelte), in startf() steht als erstes CLS, trotzdem rufst du die Funktion zwei mal auf - dass macht wenig Sinn.
Die Funktion bewegungf() steht nochmal CLS - was darin wohl gar nichts verloren haben dürfte. Was da wie in welcher Reihenfolge abläuft ist mir nicht klar, du verwendest Kurze, immer weiter verschachtelte Funktionen mit relativ Aussagelosen Namen und Variablen; blub würde ich niemals verwenden...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Midimaster

BeitragFr, März 12, 2010 20:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich finds gar nicht so schlecht....

Der Code sieht unschön aus (rein optisch), ist aber im Grunde gut aufgebaut. Damit es auch andere lesen können, würde ich an deiner Stelle mal folgendes machen:

1.
Die Constanten kommen ganz nach oben. Sonst muss man zum Verständnis der Zeile
BlitzMax: [AUSKLAPPEN]
Dim wx(xmeng) 


erst auf die Suche gehen...

2. auch bei den While/Wend-Schleien schön einrücken. Und die Ifs einrücken...

3. zwischen den Funktionen kannst du 3 Leerzeilen machen, aber die Leerzeilen in den Funktionen stören doch sehr. Ebenso in den If-Abfragen. Hier mal der Vergleich :

Code: [AUSKLAPPEN]


Function bewegungf()
                               
         If KeyDown(203) Then figurx=figurx-2
         If KeyDown(205) Then figurx=figurx+2
   
         Cls
                   
End Function


Function jumpf()

         
         If collision = 1
         speed=5
         blub=1
         EndIf

         

         If blub=1

         ge#=0.1

         figury=figury-speed
       
         speed=speed - ge#

         collision = 0

         If speed <= -2.5 Then speed = -2.5
       
         EndIf
         

End Function


Function nullpunktf()

         

         If figury <= nullv And figury>=nullv-100
         nullv=nullv-1
         
         
         nullvoy=nullvoy+1
         
         Origin 0,nullvoy

         EndIf

         If figury <= nullv-100
         nullv=nullv-3
         
         
         nullvoy=nullvoy+3
         
         Origin 0,nullvoy

         EndIf

         

         
                         

End Function



wird so zu :

BlitzMax: [AUSKLAPPEN]

Function bewegungf()
If KeyDown(203) Then figurx=figurx-2
If KeyDown(205) Then figurx=figurx+2
Cls
End Function



Function jumpf()
If collision = 1
speed=5
blub=1
EndIf
If blub=1
ge#=0.1
figury=figury-speed
speed=speed - ge#
collision = 0
If speed <= -2.5 Then speed = -2.5
EndIf
End Function



Function nullpunktf()
If figury <= nullv And figury>=nullv-100
nullv=nullv-1
nullvoy=nullvoy+1
Origin 0,nullvoy
EndIf
If figury <= nullv-100
nullv=nullv-3
nullvoy=nullvoy+3
Origin 0,nullvoy
EndIf
End Function


So kann dir jeder helfen....



Performance-Probleme:

Den Perfomance-Problemen kommst du am besten mit einigen Messpunkten auf die Schliche:


BlitzMax: [AUSKLAPPEN]
Function spielf()
Local Zeit0%, Zeit1%, Zeit2%,Zeit3%, Zeit4%, Zeit5%, Zeit6%
Zeit0=MilliSecs()
collisionf()
Zeit1=MilliSecs()-Zeit0
bewegungf()
Zeit2=MilliSecs()-Zeit0
jumpf()
Zeit3=MilliSecs()-Zeit0
nullpunktf()
Zeit4=MilliSecs()-Zeit0
seitenf()
Zeit5=MilliSecs()-Zeit0
zeichnenf()
Zeit6=MilliSecs()-Zeit0
Print " Messpunkte Z1=" + Zeit1 + " Z2=" + Zeit2 + " Z3=" + Zeit3 + " Z4=" + Zeit4 + " Z5=" + Zeit5 + " Z6=" + Zeit6 + " "
End Function


Schreib mal, was dabei rauskommt....
 

Lars

BeitragFr, März 12, 2010 23:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Z1 und Z2 wechseln blitzschnell zwischen 0 und 1

Midimaster

BeitragFr, März 12, 2010 23:57
Antworten mit Zitat
Benutzer-Profile anzeigen
ich brauch schon alle zahlen bis Z6!
 

Lars

BeitragSa, März 13, 2010 0:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh ja tschuldigung war mir nicht aufgefallen weil ab Z2 alle aus dem bildausschnitt gingen.
Z1-Z5=0-1 und Z6=3-4
Liegt also an der letzten function (zeichnen)
Allerdings habe ich auch mal nur das menü seperat durchlaufen lassen und das zieht auch 50%.

Midimaster

BeitragSa, März 13, 2010 0:45
Antworten mit Zitat
Benutzer-Profile anzeigen
naja, das menü zieht mehr, weil es ohne TIMER zu schnell läuft

probier mal, was besser kommt:

BlitzMax: [AUSKLAPPEN]
While Not game = 1
menuef()
Flip 0
WaitTimer Timer
Wend


oder...

BlitzMax: [AUSKLAPPEN]
While Not game = 1
menuef()
Delay 14
Flip 0
Wend

In jede Schleife mit einem FLIP gehört immer ein Rücksprung ans Betriebsystem mittels DELAY oder WAITTIMER.


die 3 msec in der Hauptschleife sind erstmal OK so. Da lohnt sich noch keine Optimierung. Obwohl da schon Potential wäre. Die Grundsatzfrage lautet: Muss der Bildschirm so oft neu aufgebaut werden? Ich schau mir den Code heute Nacht mal an und zeig Dir da ein paar Stellen auf, wo und wie man "sparen" könnte.


BlitzMax oder BB?

Sag, mal... du hast den Code im Forum bei BlitzMax reingestellt. Gehört der nicht eigentlich bei BB rein? Da ist eine Zeile SetBuffer BackBuffer() in deinem Code?!? Und die DIMs??? Ja, das ist BB!

Performance-Verbesserung

Also mit den "Delay 15"-Zeilen komme ich ihm Menü nur noch auf unter 5% Auslastung und im Spiel auf 35%:

BlitzBasic: [AUSKLAPPEN]
While Not KeyHit(1)
startf()
While Not game = 1
menuef()
Delay 15
Flip 0
Wend
startf()
zufallf()
;hauptschleife
While Not KeyHit(1)
spielf()
Delay 15
Flip 0
Wend
Wend


Schon ein erster Schritt...

Um die Performance auch im Spiel zu reduzieren, füge ich eine GLOBALE Variable Action% ein, die immer dort auf TRUE gesetzt wird, wo sich was verändert:
BlitzBasic: [AUSKLAPPEN]
Function startf()
Cls
figurx = 175
Action=True
....

BlitzBasic: [AUSKLAPPEN]
Function bewegungf()
If KeyDown(203) Then
figurx=figurx-2
Action=True
EndIf
If KeyDown(205) Then
figurx=figurx+2
Action=True
EndIf
End Function

BlitzBasic: [AUSKLAPPEN]
Function jumpf()
....
If blub=1
ge#=0.1
figury=figury-speed
Action=True
...
EndIf
End Function


Aus diese Variable Aktion% lies die Funktion SpielF() ab, ob sie was zeichnen muss:
BlitzBasic: [AUSKLAPPEN]
Function spielf()
bewegungf()
If Action=True Then
collisionf()
jumpf()
nullpunktf()
seitenf()
zeichnenf()
Action=False
EndIf
End Function

Dadurch wird nur noch dann etwas gezeichnet, wenn sich der Bildschirm geändert hat. Am Ende wird die Action% auf 0 zurückgesetzt.

Das einzige CLS, das bei mir überlebt, wandert übrigens in die Zeichenroutine:
BlitzBasic: [AUSKLAPPEN]
Function zeichnenf()
Cls
TileBlock background1
DrawImage box(1),boxx(1,1),boxy(1,1)
....


Übrig bleibt eine Belastung von unter 5%
 

Lars

BeitragSo, März 14, 2010 18:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Cool das ist ja super! Danke!

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group