Stockelproblem nicht gelöst

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen

 

Dreamora

BeitragDi, Okt 30, 2007 0:26
Antworten mit Zitat
Benutzer-Profile anzeigen
1. WaitTimer raus. Der hat in nem Spiel nix zu suchen
2. Flip 1 (oder 0)
3. Frameunabhängige Programmierung
4. Fixe Logic Rate
5. Dem User die möglichkeit geben die gewünschte FPS Zahl zu setzen (-> wird dann für 4 genutzt)

Wenn man bei 2 Flip 0 nimmt und Fixe Logic Rate kann man potentiell das ganze auch so machen, dass man den rest des Frames mit Delay dynamisch auffüllt.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

mabox

BeitragDi, Okt 30, 2007 9:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Was ist Fixe Logic Rate? Hab sie Forensuche angeschmissen und in Google gesucht aber nichts gefunden.

Aber schon mal vielen Dank für die Tips!
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage
 

Dreamora

BeitragDi, Okt 30, 2007 12:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Fixed Logic Rate heisst dass du den Fortschritt der Welt nur mit einer fixen Rate (X mal pro Sekunde) berechnest, nicht soviel wie du irgendwie kannst, obwohl es dir nichts bringt.

Das wird zb auch bei Physiksystemen (Update Rate) genutzt.
Häufig macht man auch UI Updates und Effekte die viel Performance kosten beim Update auf der Basis.

Timed Programming / Timed Update Logic wären andere mögliche Bezeichnungen.
Und die Forensuche musst du primär auf blitzbasic.com anschmeissen.
Hier wirst du nur wenige Artikel dazu finden, wie man solche Dinge sinnvollerweise macht, da es nur etwa 3 User hat, die hier Spiele entwickeln die sie auch verkaufen, sprich nur höchstens 3 User die sich aktiv mit solchen Problemen auseinander setzen müssen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

mabox

BeitragMi, Okt 31, 2007 0:15
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Sorry noch ne andere Frage: wie sucht man auf www.blitzbasic.com ???

2. Ich bin noch ein ziemlicher Noob und kann auch nicht sehr gut Englisch, weshalb ich die Tuts oder Beispiele warscheinlich nicht ganz verstehe Sad
Ist das Fixed Logic Rate denn so kompliziert, dass es nur bei ganz professionellen Spielen angewendet wird??? Ich will nur was kleines programmieren was auf (fast) allen rechnern laufen soll.........
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage
 

Dreamora

BeitragMi, Okt 31, 2007 0:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Indem du in die Community gehst und dort die Suchfunktion nimmst.

Und nein, prinzipiell ist es ganz simpel.
Du führst den Update der Spiellogik einfach nur X mal pro Sekunde aus, das wars.
Heisst du führst für die verschiedenen Logik Blöcke falls nötig verschiedene Zeitvariablen (seit dem letzten Update) und die Zeitdifferenzen zwischen den Updates (1000 / Frequenz der Updates) und rufst die Funktionen entsprechend nur auf wenn die nötige Zeit vergangen ist.

Der schwierige Punkt hier kommt dann rein wenn du Kollision und Physik hast, weil du dann gegebenen falls mit einem Accumulator die Ungenauigkeiten des MS Timers zu kompensieren. Aber das sollte kein Problem sein.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

mabox

BeitragMi, Okt 31, 2007 12:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Dreamora hat Folgendes geschrieben:

Und nein, prinzipiell ist es ganz simpel.
Du führst den Update der Spiellogik einfach nur X mal pro Sekunde aus, das wars.
Heisst du führst für die verschiedenen Logik Blöcke falls nötig verschiedene Zeitvariablen (seit dem letzten Update) und die Zeitdifferenzen zwischen den Updates (1000 / Frequenz der Updates) und rufst die Funktionen entsprechend nur auf wenn die nötige Zeit vergangen ist.


Genau das macht doch Waittimer() oder??
sry wenn das falsch ist bin Noob.
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage
 

Dreamora

BeitragMi, Okt 31, 2007 12:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein das macht waittimer eben nicht

Waittimer stopt die gesamte Programm Ausführung.
Es erlaubt auch nur eine Frequenz für ALLE Arten von Logik

Timed Programming blockt aber nichts.
Jeder Logikbereich kann auch mit einer eigenen Frequenz laufen


Wofür man den Timer jedoch nutzen kann ist für genaue Zählung der Ticks.
Wenn zb alle Blöcke ein vielfaches von 1/200 sekunde nutzen, dann kannst du einen timer mit frequenz 200 erzeugen und timerticks nutzen um zu sehen ob genügend ticks vergangen sind.
Das wird erstaunlicherweise von so gut wie niemandem genutzt.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

mabox

BeitragMi, Okt 31, 2007 12:47
Antworten mit Zitat
Benutzer-Profile anzeigen
OK ich glaube ich fange langsam an es zu verstehen.
Vielen dank!
Ich werde mich mal reinarbeiten.

mfg
Maurits
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage

Markus2

BeitragMi, Okt 31, 2007 13:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Diese Frage ist noch offen Wink
Bist du sicher das es konstant 16 ms sind ???
Woran siehst du das denn ?

mabox

BeitragMi, Okt 31, 2007 15:46
Antworten mit Zitat
Benutzer-Profile anzeigen
daran:
Code: [AUSKLAPPEN]
timer = CreateTimer (60)
Global graph_x = 1280
Global graph_y = 800

Graphics graph_x, graph_y,32,1
SetBuffer BackBuffer()


;wird später zum rechteck erstellen benötigt (timer)
Global counter
Global ms%=MilliSecs()
Global timescale
Global fallgeschwindigkeit# = 200
Global max_speed# = 5
Global min_speed# = 2
Global Punkte
Global fpsrate,loops, fpstime
;Global bildle = LoadImage ("unbenannt.jpg")
;MaskImage bildle,255,255,255

Global ycor = graph_y-30   ;y Koordinate spieler
Global xcor = graph_x/2-25 ;x koordinate spieler
Color 255,255,255

;das ist der rechteck type mit seinen "feldern"(eigenschaften)
Type rechteck
   Field grosse
   Field speed
   Field rechteck_x
   Field rechteck_y
End Type



;;Hauptschleife -------------------------
Repeat
   
   
   Geschwindigkeitsnormung()
   rechtecke_erstellen()
   rechtecke_machen_lassen()
   
   Rect xcor,ycor,50,2 ;rechteck
   If xcor >= graph_x-55 Then xcor = graph_x-55
   If xcor <= 5 Then xcor = 5
   
   If KeyDown(203) Then xcor = (xcor -5-(.1*timescale));Links
   If KeyDown(205) Then xcor = (xcor +5+(.1*timescale));Rechts
   
   Text 10,10,fallgeschwindigkeit
   Text 10,25,"maximaler speed: " + Floor (max_speed#)
   Text 10,40,"minimaler speed: " + Floor (min_speed#)
   Text 10,55,"Punkte: " + Punkte
   Text 10,70,"Frames: " + fps()
   Text 10,85, "timescale: " + timescale
   
   
   
 
   WaitTimer timer
   Flip 0
   Cls
Until KeyHit(1)
;---------------------------------------


;hier werden die rechtecke in zeitichen abständen erstellt
Function rechtecke_erstellen()
   
   counter = (counter +1+(.1*timescale))
   
   If counter >= fallgeschwindigkeit# Then
      counter = 0
      info.rechteck = New rechteck
      info\grosse = 15

      ;info\speed = Rnd(2,5)
      info\speed = Rnd(Floor (min_speed#), Floor (max_speed#))
      
      info\rechteck_x = Rnd(0,graph_x-info\grosse)
      info\rechteck_y = -5
   End If
   
End Function




Function rechtecke_machen_lassen()
   For info.rechteck = Each rechteck   
      info\rechteck_y = (info\rechteck_y + info\speed+(.1* timescale))
      ;DrawImage bildle,info\rechteck_x ,Floor( info\rechteck_y)
      Rect info\rechteck_x , Ceil( info\rechteck_y) , info\grosse , info\grosse ;Rechteck erstellen
      ;Wenn der rechteck das ander rechteck berührt oder aus dem Bildschirm fährt: löschen
      If RectsOverlap (info\rechteck_x , info\rechteck_y , info\grosse , info\grosse, xcor,ycor,50,2) Then 
         Delete info.rechteck
         fallgeschwindigkeit# = fallgeschwindigkeit# -.8
         max_speed# = max_speed# +.05
         min_speed# = min_speed# +.05
         Punkte = Punkte + 10
      ElseIf info\rechteck_y >graph_y Then
         fallgeschwindigkeit# = fallgeschwindigkeit# -.8
         Delete info.rechteck
         Punkte = Punkte - 5
      EndIf
   Next
End Function


Function Geschwindigkeitsnormung()
   msa%=MilliSecs()
   timescale=msa%-ms%
   ms%=msa%
End Function


Function fps()
   loops = loops+1
   If MilliSecs() - fpstime > 1000 Then
      fpsrate = loops
      loops = 0
      fpstime = MilliSecs()
   End If
   Return fpsrate
   
End Function


Der unterste Wert der (links oben) da steht wenn man das Programm startet.
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage

Markus2

BeitragMi, Okt 31, 2007 19:46
Antworten mit Zitat
Benutzer-Profile anzeigen
So sieht bei mir flüssig aus .
Frame Sync ist an
Schritte der Kästen als gerade Zahl , also OHNE Nachkommastellen

Code: [AUSKLAPPEN]

Global graph_x = 800
Global graph_y = 600

Graphics graph_x,graph_y,16,1
SetBuffer BackBuffer()

Global r

Global ycor = graph_y-30
Global xcor = graph_x/2-25
Color 255,255,255

Type rechteck
 Field grosse
 Field speed
 Field rechteck_x
 Field rechteck_y
End Type

Repeat
   t=MilliSecs()
   Cls
   
   rechtecke_erstellen
   rechtecke_machen_lassen
   
   Rect xcor,ycor,50,2 ;rechteck
   If xcor >= graph_x-55 Then xcor = graph_x-55
   If xcor <= 5 Then xcor = 5
   
   If KeyDown(203) Then
     xcor = xcor -5
   ElseIf KeyDown(205) Then
     xcor = xcor +5
   EndIf
   
   If KeyHit(1) Then Exit
   
   While MilliSecs()-t<10
   Wend
   
   Flip True
Forever
End

Function rechtecke_erstellen()

   If r <10 Then
      info.rechteck = New rechteck
      info\grosse = 15
      info\speed =1+ Int(Rnd(0,4))       
      info\rechteck_x = Rnd(0,graph_x-info\grosse)
      info\rechteck_y = -5
      r=r+1
    End If

End Function

Function rechtecke_machen_lassen()
 For info.rechteck = Each rechteck
  info\rechteck_y = info\rechteck_y + info\speed
  Rect info\rechteck_x ,info\rechteck_y , info\grosse , info\grosse,True ;Rechteck erstellen

  ;Wenn der rechteck das ander rechteck berührt oder aus dem Bildschirm fährt: löschen
  If RectsOverlap (info\rechteck_x , info\rechteck_y , info\grosse , info\grosse, xcor,ycor,50,2) Then
   Delete info.rechteck
   r=r-1
  ElseIf info\rechteck_y >graph_y Then
   Delete info.rechteck
   r=r-1
  EndIf
 Next
End Function

mabox

BeitragMi, Okt 31, 2007 23:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, flüssig läufts aber braucht sehr viel CPU und genau das ist nicht das was ich will (siehe oben)
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage

Markus2

BeitragDo, Nov 01, 2007 1:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Programm bremst wenn es zu schnell ist in einer blöden Schleife .
Mit Delay von ein paar ms dürfte auch Windows noch genug abbekommen bzw. rechnet man das Delay aus .

mabox

BeitragDo, Nov 01, 2007 1:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry aber das versteh ich nicht ganz. Kannst du das genauer erklären?
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage

Markus2

BeitragDo, Nov 01, 2007 2:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Teil hier wartet einfach bis die 10ms rum sind .
Stell es dir einfach wie nen Kurzschluß vor wo viel Strom fließt .

Code: [AUSKLAPPEN]

While MilliSecs()-t<10
Wend


Von der Idee wäre es so besser ,
braucht bei mir dann 30% CPU (also der Rest wo auch was getan wird)
Code: [AUSKLAPPEN]

Delay 10-(MilliSecs()-t)


Heißt also wenn dein Programm 5 ms gebraucht hat wird noch 5 ms gewartet .
Ist der PC zu langsam wird gar nicht gewartet .

mabox

BeitragFr, Nov 02, 2007 0:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Also tut mir wirklich leid aber entweder ich bin einfach zu dumm oder es liegt einfach daran, dass ich noch Noob bin aber eigentlich ist das doch garnicht so kompliziert. Ich versteh es trotzdem nicht.
Vielleicht denkt ihr jetzt, wenn jemand so blöd ist kann man ihm auch nicht mehr helfen, aber ich will dieses Programm unbedingt richtig zum Laufen bringen.
Kann nicht nochmal jemand einen Anlauf unternehmen es mir zu erklären?

@Markus2 Ich versteh nicht was die 10 ms sollen und wie ich mir was als Kurzschluss vorstellen kann???
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage
 

Marek

BeitragFr, Nov 02, 2007 1:09
Antworten mit Zitat
Benutzer-Profile anzeigen
@mabox Das mit dem Kurzschluss meint er so:

While Not Keydown(1)

Wend

Dieses Programm würde ungebremmst durch die Schleife rattern. BlitzBasic versucht dabei so schnell wie möglich zu werden, wie eben Strom in einem Kabel. Wenn man Minus und Pluspol miteinander verbindet, ohne einen Verbraucher dazwischen zu setzten gibts nen Kurzschluss, der Strom fließt so schnell er kann durch das Kabel. So kann man sich das vorstellen Wink Ist im Prinzip dasselbe...

Was man also machen muss, ist einen Verbraucher in die Schleife zu setzten. Grundsätzlic ist jeder Befehl ein Verbraucher. Aber die meisten sind zu schwach, z.B.:

While Not Keydown(1)
a=a+1
Wend

Hier ist das Programm schon langsamer, aber das ist minimal(sogar vernachlässigbar).

Man hat also das Problem, man braucht einen möglichst starken Verbraucher. Dazu gbt es eine ganz simple Lösung:

Delay oder WaitTimer.

Beide basieren auf dem selben Prinzip. Sie "stoppen den Stromfluss" für eine gewisse Zeit, folglich auch kein kurzschluss Wink z.B.:

While not keydown(1)
Delay 10
Wend

Hoffentlich ist das was ich da geschrieben hab verständlich genug^^ MfG Marek
Wer lesen kann ist klar im Vorteil...
  • Zuletzt bearbeitet von Marek am Fr, Nov 02, 2007 1:27, insgesamt einmal bearbeitet

mabox

BeitragFr, Nov 02, 2007 1:26
Antworten mit Zitat
Benutzer-Profile anzeigen
OK vielen Dank!
Das war sehr verständlich, ich glaube ich bekomme es langsam hin.

mfg
Maurits
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage

Markus2

BeitragFr, Nov 02, 2007 1:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Marek hat das schon gut erklärt ,
Delay ist quasi ne Umleitung und läßt den Strom da fließen wo es Sinn macht bzw. sorgt dafür das der Strom nicht einfach nur sinnlos verpuft .

mabox

Betreff: nochwas...

BeitragFr, Nov 02, 2007 21:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab hier nochwas interessantes gefunden (In einem alten Thread)
hectic hat Folgendes geschrieben:
Eine Geschwindigkeitsscallierung mit MilliSecs ist nur dann ungenau, wenn man ein Programm mit Flip 0 betreibt, was eh Sinnlos ist. Alle die sich das Treibermässig ausschalten wissen überhaupt nicht, was die da tun.

Wenn das stimmt ist mein Programm Schwachsinn mit Flip 0
Und mit Flip 1 stockelt es, mit Waittimer wird der PC ausgebremst.

Jetzt sind mittlerweile alle Klarheiten beseitigt. Ich weis jetzt wirklich nicht mehr weiter.

Ich hoffe ihr habt noch eine Antwort für mich Wink
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group