Leistungsverwaltung

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Maikson_18

Betreff: Leistungsverwaltung

BeitragMo, Dez 21, 2009 1:51
Antworten mit Zitat
Benutzer-Profile anzeigen
hey an alle

ich wollt mal fragen ob man irgendwie die Prozessorleistung verwalten kann?
weil mein Programm irgendwie 80% von meinem Prozessor schluckt aber nur 9 mb Arbeitsspeicher

oder liegst nur daran das ichs vieleicht nen bisschen blöd programmiert habe?


is allerdings noch nich ganz fertig :S


mfg Maikson


Code: [AUSKLAPPEN]
Global xmax=800,ymax=600
Graphics xmax,ymax,32,0
SeedRnd MilliSecs()
Global xball=xmax/2
Global yball=ymax/2
SeedRnd MilliSecs()
Global start=0
Global leben=3
Global xstein2, ystein2
Global geschindigkeit=2
Global score=0

Type Stein
   Field xstein
   Field ystein
End Type



Global frametimer = CreateTimer(60)
SetBuffer BackBuffer()

;Deklaration von Ball
Global ball = LoadImage("bigball.bmp")
MidHandle ball

;Deklaration von Wand
Global wand = LoadImage("wand.bmp")
Global wand2 = LoadImage("wand2.bmp")

;Deklaration von Stein
Global stein = LoadImage("stein.bmp")



;Hauptschleife
Repeat
WaitTimer (frametimer)
   
   Locate 60,60
   Print "Leben:" + leben
   
   Locate xmax-150,60
   Print "Score:" + score
   
   
   ;Spielersteuerung
   If KeyDown(205) Then xball=xball+3
   If KeyDown(203) Then xball=xball-3
   If KeyDown(208) Then yball=yball+3
   If KeyDown(200) Then yball=yball-3

   
   
   DrawImage ball,xball,yball
   
   ;Senkrechte wand
   For i=0 To 1
      For j=0 To ymax/40
         If i=0 Then x=0 Else x=xmax-40
         DrawImage wand,x,j*40
      Next
   Next
   
   ;Waagerecht Wand
   For i=0 To 1
      For j=0 To (ymax+80)/40
         If i=0 Then y=0 Else y=ymax-40
         DrawImage wand2,(j*40)+40,y
      Next
   Next
   
   
   If start=30 Then
   DrawStein()
   start=0
   EndIf
   
   
   For s.Stein = Each Stein
      s\ystein=s\ystein+geschindigkeit
      DrawImage stein,s\xstein,s\ystein
   Next
   
   ;Kollision mit linker wand
   If xball <50 Then
      tod()
   EndIf
   
   ;Kollision mit linker wand
   If xball > xmax-50 Then
      tod()
   EndIf
   
   ;Kollision mit oberer wand
   If yball < 50 Then
      tod()
   EndIf
   
   ;Kollision mit unterer wand
   If yball > ymax-50 Then
      tod()
   EndIf
   
   ;Kollision mit Stein
   For s.Stein = Each Stein
   If ImagesCollide(ball,xball,yball,0,stein,s\xstein,s\ystein,0)  Then
   tod()
   EndIf
   Next
   
   
   ;Scorezählung
   Scorezaehlung()
         
   
start=start+1
Flip
Cls
Until KeyHit(1);Schleifenende Durch Esc drücken


Function DrawStein()
   s.Stein = New Stein
   s\xstein#=Rnd (50,750)
   s\ystein=0
End Function

Function tod()
   Locate 300,300
   Print "Du bist gestorben"
   leben=leben-1
   xball=xmax/2
   yball=ymax/2
   Delay(2000)
   For s.Stein = Each Stein
      Delete s.Stein
   Next   
End Function


Function ScoreZaehlung()
   For s.Stein = Each Stein
      If s\ystein>ymax-20 Then
      score=score+2
      Delete s.Stein
      EndIf
      
   Next
End Function
      

WaitKey
End

Goodjee

BeitragMo, Dez 21, 2009 1:52
Antworten mit Zitat
Benutzer-Profile anzeigen
https://www.blitzforum.de/foru...hp?t=25242
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/
 

Maikson_18

BeitragMo, Dez 21, 2009 2:02
Antworten mit Zitat
Benutzer-Profile anzeigen
mh ich denk mal das wohl punkt 1 zu mir passt Sad

danke für den link

denn werd ich mich mal an die optimierung machen Rolling Eyes

Midimaster

BeitragMo, Dez 21, 2009 3:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Aus dem Dokument dort wirst Du wenig neues erfahren...Hauptthema ist dort die richtige Verwendung von DELAY() und WAITTIMER().

Und das sieht bei Dir schon gut aus!

Irgendwas verbrät richtig Leistung bei Dir. Du könntest Zeitmessungen mit Millisecs() durchführen:

StartZeit=Millisecs()
...code blabla
text 0,0, "Zeitverbrauch Total=" + (Millisecs() - StartZeit)

Die Zeile...

StartZeit=Millisecs()

...gehört vor "LOCATE 60,60"


Die Auswertungzeile...

text 0,0, "Zeitverbrauch Total=" + (Millisecs() - StartZeit)

...direkt nach der Zeile "start=start+1"


So wie Du es schilderst wird der Zeitverbrauch bei ca 14msec liegen.

So, nun kannst Du ans Eingrenzen gehen, füge direkt vor das "For s.Stein = Each Stein" ( jenes, wo gemalt wird) einen neuen Testpunkt

text 0,20, "Zeitverbrauch Messpunkt B=" + (Millisecs() - StartZeit)

Nun weißt Du, ob der obere oder der untere Abschnitt mehr Zeit verbraucht. Waren es z.B. bei Messpunkt B 4msec und bei TOTAL 14, so hat der erste Teil Deines Codes 4msec, der zweite aber die restlichen 10 msec verbraucht.


Tipp:
Verschieb mal den CLS oben in die Zeile nach LOCATE, so dass er mitgemessen wird. CLS könnte endlos lange dauern. Auch PRINT könnte problematisch sein. Ersetze es durch TEXT. Schalte für einen Perfomancetest einfach CLS kurz mal aus.

Verschieb den WaitTimer() auf kurz vor den FLIP, so dass er nicht mitgemessen wird. Schreib mal FLIP 0

Tipp 2:
Wenn Du ohne CLS auskommst, musst Du auch die Wand nicht immer wieder neu zeichnen. Das Spielfeld reinigst Du vielleicht mit einem schwarzen RECT?

Tipp 3:
Bringt wahrscheinlich keinen Zeitvorteil, aber reicht so:

Code: [AUSKLAPPEN]
   ;Senkrechte wand
    For j=0 To ymax Step 40
        DrawImage wand,0,j
        DrawImage wand,xmax-40,j
    Next

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Dez 21, 2009 3:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Die richtige Verwendung bei BlitzBasic/Blitz3D mit einem Frametimer bedeutet auch die Verwendung von Flip 0 nicht jedoch Flip oder Flip 1.

Erst nach dieser Kombination kann ein Programm recourcenschonend arbeiten. Die erste Bedingung ist ja bereits gemacht. Fehlt also nur noch eine 0 hinter Flip.

Wenn das Programm dann immer noch zu viel Recourcen verschleudert, muß man weiter sehen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

N0X

BeitragMo, Dez 21, 2009 12:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich weiß nicht ob das eine Verbesserung bringt, aber ich würde Funktionen grundsätzlich nicht in der Hauptschleife schreiben, lieber am Ende vom Code.
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

mpmxyz

BeitragMo, Dez 21, 2009 12:31
Antworten mit Zitat
Benutzer-Profile anzeigen
@N0X: Was erzählst du denn für einen Unsinn?
Funktionen nehmen kaum Leistung weg.
Es könnte höchstens etwas bringen, wenn eine Funktion ca. 1000000 pro Sekunde genutzt wird, ihren Inhalt direkt in den Code zu schreiben.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Jamagin

BeitragMo, Dez 21, 2009 13:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde sagen du ersetzt die LOCATE durch Text... bringt auch mehr Speed. Hab mir dein Proggi angeguckt und habe das Cls nach Repeat hingeschrieben und das Cls unten entfernt. Es läuft bei mir mit 62 FPS. Bei Gameover fahren die FPS in den Keller und dann wieder auf 62. Die Punkte und Das Bildschirmleben sollten dann aber auch neuinitialisiert werden!

lg. Jamagin Cool
Bevor du etwas neues beginnst, erledige das alte

Tankbuster

BeitragMo, Dez 21, 2009 13:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Bei Gameover fahren die FPS in den Keller und dann wieder auf 62. Die Punkte und Das Bildschirmleben sollten dann aber auch neuinitialisiert werden!

Ist ja auch logisch, da in der Funktion tod() ein Delay 2000 steht.
Twitter
Download Jewel Snake!
Windows|Android

Jamagin

Betreff: delay

BeitragMo, Dez 21, 2009 13:30
Antworten mit Zitat
Benutzer-Profile anzeigen
huuu! delay ist böse! Wäre besser zu lösen, wenn man einfach auf einen Tastendruck oder mousehit(1) warten sollte!

In der Function Scorezaehlung reicht ein Delete s und nicht Delete s.Stein und danach ein Exit damit die Schleife wieder verlassen wird!
Und wieder anstelle von Locate in der Tod() Function ein Text 300, 300, "Du bist gesto...!" : Flip bringt mehr Speed, da LOCATE langsaaaaam ist...!

Code: [AUSKLAPPEN]

Function tod()
   Text 300, 300, "Du bist gestorben": Flip
   leben=leben-1
   xball=xmax/2
   yball=ymax/2

   While Not MouseHit(1) Wend                ; NEUE ZEILE EINGEFÜGT !!

   For s.Stein = Each Stein
      Delete s                                             ; Es reicht Delete s
   Next   
End Function



lg. Jamagin Cool
Bevor du etwas neues beginnst, erledige das alte

NightPhoenix

BeitragMo, Dez 21, 2009 14:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Noch ein Tipp von mir:
Nutze die TABulator Taste um Zeilen zu verschieben (einzurücken) anstatt die Leertaste. Das geht bedeutend schneller und ist viel übersichtlicher.

Code: [AUSKLAPPEN]
Global xmax=800,ymax=600
Graphics xmax,ymax,32,0
SeedRnd MilliSecs()
Global xball=xmax/2
Global yball=ymax/2
SeedRnd MilliSecs()
Global start=0
Global leben=3
Global xstein2, ystein2
Global geschwindigkeit=2
Global score=0

Type Stein
   Field xstein
   Field ystein
End Type



Global frametimer = CreateTimer(40)
SetBuffer BackBuffer()

;Deklaration von Ball
Global ball = LoadImage("bigball.bmp")
MidHandle ball

;Deklaration von Wand
Global wand = LoadImage("wand.bmp")
Global wand2 = LoadImage("wand2.bmp")

;Deklaration von Stein
Global stein = LoadImage("stein.bmp")



;Hauptschleife
Repeat
WaitTimer (frametimer)
Cls
   
   Text 60,60,"Leben:" + leben
   
   Text xmax-150,60,"Score:" + score
   
   
   ;Spielersteuerung
   If KeyDown(205) Then xball=xball+3
   If KeyDown(203) Then xball=xball-3
   If KeyDown(208) Then yball=yball+3
   If KeyDown(200) Then yball=yball-3

   
   
   DrawImage ball,xball,yball
   
   ;Senkrechte wand
   For i=0 To 1
      For j=0 To ymax/40
         If i=0 Then x=0 Else x=xmax-40
         DrawImage wand,x,j*40
      Next
   Next
   
   ;Waagerecht Wand
   For i=0 To 1
      For j=0 To (ymax+80)/40
         If i=0 Then y=0 Else y=ymax-40
         DrawImage wand2,(j*40)+40,y
      Next
   Next
   
   
   If start=30 Then
   DrawStein()
   start=0
   EndIf
   
   
   For s.Stein = Each Stein
      s\ystein=s\ystein+geschwindigkeit
      DrawImage stein,s\xstein,s\ystein
   Next
   
   ;Kollision mit linker wand
   If xball <50 Then
      tod()
   EndIf
   
   ;Kollision mit linker wand
   If xball > xmax-50 Then
      tod()
   EndIf
   
   ;Kollision mit oberer wand
   If yball < 50 Then
      tod()
   EndIf
   
   ;Kollision mit unterer wand
   If yball > ymax-50 Then
      tod()
   EndIf
   
   ;Kollision mit Stein
   For s.Stein = Each Stein
   If ImagesCollide(ball,xball,yball,0,stein,s\xstein,s\ystein,0)  Then
   tod()
   EndIf
   Next
   
   
   ;Scorezählung
   ScoreZaehlung()
         
   
start=start+1
Flip 0
Until KeyHit(1);Schleifenende Durch Esc drücken
End




Function DrawStein()

   s.Stein = New Stein
   s\xstein#=Rnd (50,750)
   s\ystein=0
   
End Function

Function tod()
   Text 300,300,"Du bist gestorben"
   leben=leben-1
   xball=xmax/2
   yball=ymax/2
   
   For s.stein = Each Stein
      Delete s.stein
   Next   
   
End Function


Function ScoreZaehlung()

   For s.stein = Each Stein
      If s\ystein>ymax-20 Then
         score=score+2
         Delete s.stein
      EndIf
   Next
   
End Function


- Timer auf 40FPS gesetzt
- Delay heraus genommen
- Flip 0 statt Flip 1 (Flip 0 ist schneller)
- Print durch wesentlich schnelleres Text ersetzt
- Funktionen ans Ende des Codes platziert (spart kein Speed, aber erhöht Übersicht)

Das wäre erstmal eine grobe Optimierung.
Übrigens hieß deine Globale "geschwindigkeit" "geschindigkeit", hab's gerändert. Wink

Geht es jetzt schneller?

MfG.

Jamagin

Betreff: leistung

BeitragMo, Dez 21, 2009 14:26
Antworten mit Zitat
Benutzer-Profile anzeigen
@nightphoenix

das hab ich eh schon vorgeschlagen! Cool

Warum 2x Seedrnd Millisecs() *grübel*
Und die Kollisionsabfrage kannst auch auf 2 reduzieren!

Code: [AUSKLAPPEN]

If xball < 50 or xball > xmax - 50 then tod()
if yball < 50 or yball > ymax - 50 then tod()


lg. Jamagin Cool
Bevor du etwas neues beginnst, erledige das alte
 

Maikson_18

BeitragMo, Dez 21, 2009 14:30
Antworten mit Zitat
Benutzer-Profile anzeigen
danke für die ganzen antworten Smile
das mit dme flip 0
hat ich schon geändert ich glaub daran lags hatte denn nur noch 4% auslastung

und die anderen tipps von euch sind echt klasse Smile

ich werd die mal alle durcharbeiten und in zukunft daran denken Smile

nen dickes danke an alle

Mfg Maikson

Jamagin

Betreff: fps und co

BeitragMo, Dez 21, 2009 14:39
Antworten mit Zitat
Benutzer-Profile anzeigen
bitte! Exclamation

Immer schön zu helfen!

lg. Jamagin Cool
Bevor du etwas neues beginnst, erledige das alte

TimBo

BeitragMo, Dez 21, 2009 14:50
Antworten mit Zitat
Benutzer-Profile anzeigen
N0X hat Folgendes geschrieben:
Also ich weiß nicht ob das eine Verbesserung bringt, aber ich würde Funktionen grundsätzlich nicht in der Hauptschleife schreiben, lieber am Ende vom Code.


ääähm man kann Function sowie End Function nicht mal in im Mainloop ausführen.

Grüße
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

Jamagin

Betreff: noch was zu functions....

BeitragMo, Dez 21, 2009 14:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich schreibe meine Funktionen in eine eigene Datei und Include dann...

Ist am übersichtlichsten!!!


lg. Jamagin Cool
Bevor du etwas neues beginnst, erledige das alte
 

Maikson_18

BeitragMo, Dez 21, 2009 15:00
Antworten mit Zitat
Benutzer-Profile anzeigen
das hab ich jetz auch gemacht ^^
hab ich grad ebend hier im forum bei hilfe entdeckt dass das geht

TimBo

BeitragMo, Dez 21, 2009 15:17
Antworten mit Zitat
Benutzer-Profile anzeigen
du kannst sogar sowas machen

BlitzBasic: [AUSKLAPPEN]
Repeat

Include "bufferchange.bb"
Until KeyHit(1)


und in der Include dann sowas:
BlitzBasic: [AUSKLAPPEN]
WaitTimer(Timer)
Flip(0):Cls


Grüße
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group