Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 20.08.2003, 12:25 Titel: |
|
|
Manuel87 hat Folgendes geschrieben: |
Weil wennst du mit zb float arbeitest dann kann es passieren das die Zeitunterschiede so klein werden wenn der rechner zu schnell ist dass die float negativ werden oder so! Wir ist mal soetwas passiert! Dann hab ich eine Obergrenze gelegt und jetzt functionierts super! |
Wenn du richtig rechnest dann kann float doch nur höchstens gleich 0 werden, aber niemals in den negativen Bereich gelangen? Da du nur dividierst/multiplizierst ...
Aber warum machen wir es nicht einfach wie in JLI2 wie in Kapitel22 beschrieben "Ressourcenmanagement und Timing"? Die Lösung finde ich noch die Beste und performancesprende anstatt dauernd Werte neu zu berechnen. Christian wird schon wissen, warum er es so macht!  _________________ The source of all power is in its destiny... |
|
Nach oben |
|
 |
Hazel JLI MVP


Alter: 40 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 20.08.2003, 12:32 Titel: |
|
|
Ich kenne Christian's Lösung nicht... kann mich mal wer aufklären? :) _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
 |
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 20.08.2003, 13:59 Titel: |
|
|
Hazel, ich hab die Methode doch schon erläutert, ich mache es momentan genau so. Aber die Framerate wird da auch jede Sekunde berechnet.
Zitat: | ...ich checke jeden Durchlauf mit QueryPerformanceCounter ob ne Sekunde um ist, und setzt dann die Framerate. Alle Bewegungen und Animgeschw. werden dann durch die Framerate dividiert. |
Das Problem ist z.b. beim scrolling:
ScrollGeschwindigkeit ist 125
Meine Framerate schwankt zw. 83-85
bei 85 fps wird der Hintergrund dann um 1 px/Durchlauf verschoben;
bei 83 fps um 2 px/Durchlauf und das merkt man extrem.
Dieses Problem hat man im Grund eh nur wenn man long Werte verwenden muß, bei Spritebewegungen, usw. funkts super.
Ich glaub ich werde mir für das Scrolling eben eine fixe Framerate am Anfang berechnen. |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 20.08.2003, 14:08 Titel: |
|
|
Und wieso benutzt du für das Scrolling nicht die gleiche Methode wie bei den Sprites und arbeitest mit float-Werten?
Christian |
|
Nach oben |
|
 |
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 20.08.2003, 14:16 Titel: |
|
|
naja, die rects zum kopieren muß ich wohl in longs angeben...ich werde ja schwer ein halbes pixel kopieren können. |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 20.08.2003, 14:32 Titel: |
|
|
Ich meinte es auch eher so:
125 Pixel pro Sekunde bedeutet, dass du dich
bei 85 FPS: 125 / 85 = 1,5058823529 Pixel pro Durchlauf bewegst und
bei 83 FPS: 125 / 83 = 1,5421686746 Pixel pro Durchlauf bewegst.
Jetzt addierst du zu der Position deines Rechtecks, die du in floats speicherst 1,5... pro Durchlauf hinzu und baust dann das Rechteck zusammen: r.left = (int)(fPosition + 0.5f); usw.
Ich denke, das sollte gehen. |
|
Nach oben |
|
 |
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 20.08.2003, 14:55 Titel: |
|
|
wieso fPosition + 0.5f ??
bei 85 fps kommt 1.47 raus.
fCurPos += fCurStep;
bei 85 fps: offset von (int)1.47 -> 1
bei 83 fps: offset von (int)1.50 -> 2
ich sehe den Unterschied nicht, okay, wenn ich 0.5f dazuzähle, komm ich immer auf 2, aber das ist erstens zu schnell, und zweitens sicher auch nicht mehr zu verwenden, wenn man stärkere Framerateschwankungen hat. |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 20.08.2003, 15:36 Titel: |
|
|
Naja, du sollst den Wert fPos immer um 1,5.....erhöhen und dann casten,
dann hast du beim ersten mal
iPos = fPos + .5f = 2 // bei fPos = 1,5....
beim 2. mal
iPos = fPos + .5f = 4 // bei fPos = 3,01....
beim 3. mal
iPos = fPos + .5f = 5 // bei fPos = 4,52.... (Aha!!)
usw. Du könntest auch die +.5 weglassen, je nachdem, was besser aussieht. Das die Scrollschritte unterschiedlich gross sind, sollte man bei dieser Geschwindigkeit nicht sehen... |
|
Nach oben |
|
 |
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 20.08.2003, 15:58 Titel: |
|
|
ok, danke Christian, jetzt versteh ich langsam...
ich muß das heut am Abend mal in der Praxis testen, melde mich dann nochmal.
allerdings glaube ich, dass man selbst bei solchen Geschwindigkeiten einen Unterschied sehen wird, wenn für 2-3 Durchläufe statt 1px 2px gescrollt wird...naja, mal sehen... |
|
Nach oben |
|
 |
Manuel87 Mini JLI'ler
Anmeldedatum: 28.07.2003 Beiträge: 33
Medaillen: Keine
|
Verfasst am: 21.08.2003, 19:58 Titel: |
|
|
TheMillenium hat Folgendes geschrieben: |
Wenn du richtig rechnest dann kann float doch nur höchstens gleich 0 werden, aber NIEMALS in den negativen Bereich gelangen? Da du nur dividierst/multiplizierst ...
|
Das sagt dir die Mathematik! Ja! An sowas hab ich auch mal geglaubt! Aber bei float kann es passieren das eine Zahl die Mathematisch nicht kleiner als null sein darf kleiner als null werden! Da float so aufgebaut ist das es nicht jede zahl exakt darstellen kann! manchmal ist es ein bisschen größer manchmal ein bisschen kleiner aber eben nicht immer exakt! So kann es vorkommen wenn eine Zahl gegen null versucht wird darzustellen das diese zahl negative wird! Wäre zuminderst meine erklärung dafür! Fact ist das es passieren kann! ... es ist mir nämlich passiert. Sobald ich dann die obergrenze eingeführt hab war der fehler eliminiert! also sag NIEMALS NIEMALS!
Grüße Manuel |
|
Nach oben |
|
 |
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 21.08.2003, 20:46 Titel: |
|
|
Nein geht nicht. Dann hast du das ganze falsch programmiert.
Wenn float gegen 0 geht, kann es nur 0 werden. Nie in den negativen Bereich. C++ baut völlig mathematisch korrekt auf. Glaub mir. _________________ The source of all power is in its destiny... |
|
Nach oben |
|
 |
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 22.08.2003, 13:23 Titel: |
|
|
Ich hab mir das jetzt nochmal angeschaut, und bin draufgekommen, dass ich es in der letzten version eh schon mit floats versucht habe.
Da hab ich eine fWorldPos und eine iWorldPos, und mach dann:
fWorldPos += CurSpeed / Framerate;
iWorldPos = (int)fWorldPos;
dann berechne ich mir aufgrund von iWorldPos und den Bildschirmmaßen den nächsten Bilschirm und das CopyRect.
Das komische ist, das es jetzt eigentlich eh flüssig läuft, nur als ich den Thread eröffnet hab, hatte ich ziemlich extreme Schwankungen(selber Code). Kann es sein, wenn man grad beim proggen is, und das Programm dauern startet, dass irgendwann die Performance leidet?
Vielleicht stimmen bei mir auch irgendwelche Einstellungen nicht, z.B. droppt die Performance im Window-Mode bei mit derartig, dass es einfach unspielbar ist.
Noch ne Frage: seht ihr irgendwelche Vor-/Nachteile bei den Methoden 'Multiplikator jeden Durchlauf ausrechen' und 'Framerate jede Sekunde definieren'?
-chewie |
|
Nach oben |
|
 |
Manuel87 Mini JLI'ler
Anmeldedatum: 28.07.2003 Beiträge: 33
Medaillen: Keine
|
Verfasst am: 25.08.2003, 20:36 Titel: |
|
|
TheMillenium hat Folgendes geschrieben: | Nein geht nicht. Dann hast du das ganze falsch programmiert.
Wenn float gegen 0 geht, kann es nur 0 werden. Nie in den negativen Bereich. C++ baut völlig mathematisch korrekt auf. Glaub mir. |
Da hast du sicher recht! Und ich hab mir das ganze ja auch nur in ein logfile schreiben lassen! Und als ich dann eine Obergrenze festgellegt habe war das problem weg!
Ich versuchs dir nochmal zu erklären
ich hab zwei werte:
wert1 ist um eine sehr kleine zahl größer als wert2!
und ich brauch die differenz wert1-wert2! Mathematisch muss das ergebniss größer als null sein! aber
wenn wert1 (da float nicht jede zahl exact darstellen kann) abgerundet wird und zwar um mehr als die sehr kleine zahl von oben dann bekommst du eine negative zahl okay!
Ich weiß schon wovonich rede! aber du kannst es ja selber ausprobieren bevor du mich blöd anmachst!  |
|
Nach oben |
|
 |
|