Stockelproblem nicht gelöst
Übersicht

Gehe zu Seite Zurück 1, 2, 3 Weiter
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Diese Frage ist noch offen ![]() Bist du sicher das es konstant 16 ms sind ??? Woran siehst du das denn ? |
||
![]() |
mabox |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@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 ![]() 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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 . |
||
![]() |
maboxBetreff: nochwas... |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
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
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group