JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Framebremse
Gehe zu Seite Zurück  1, 2
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 20.08.2003, 12:25    Titel: Antworten mit Zitat

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! Very Happy
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 20.08.2003, 12:32    Titel: Antworten mit Zitat

Ich kenne Christian's Lösung nicht... kann mich mal wer aufklären? :)
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Chewie
Super JLI'ler



Anmeldedatum: 17.07.2003
Beiträge: 382

Medaillen: Keine

BeitragVerfasst am: 20.08.2003, 13:59    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 20.08.2003, 14:08    Titel: Antworten mit Zitat

Und wieso benutzt du für das Scrolling nicht die gleiche Methode wie bei den Sprites und arbeitest mit float-Werten?

Christian
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Chewie
Super JLI'ler



Anmeldedatum: 17.07.2003
Beiträge: 382

Medaillen: Keine

BeitragVerfasst am: 20.08.2003, 14:16    Titel: Antworten mit Zitat

naja, die rects zum kopieren muß ich wohl in longs angeben...ich werde ja schwer ein halbes pixel kopieren können.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 20.08.2003, 14:32    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Chewie
Super JLI'ler



Anmeldedatum: 17.07.2003
Beiträge: 382

Medaillen: Keine

BeitragVerfasst am: 20.08.2003, 14:55    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 20.08.2003, 15:36    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Chewie
Super JLI'ler



Anmeldedatum: 17.07.2003
Beiträge: 382

Medaillen: Keine

BeitragVerfasst am: 20.08.2003, 15:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Manuel87
Mini JLI'ler



Anmeldedatum: 28.07.2003
Beiträge: 33

Medaillen: Keine

BeitragVerfasst am: 21.08.2003, 19:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 21.08.2003, 20:46    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Chewie
Super JLI'ler



Anmeldedatum: 17.07.2003
Beiträge: 382

Medaillen: Keine

BeitragVerfasst am: 22.08.2003, 13:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Manuel87
Mini JLI'ler



Anmeldedatum: 28.07.2003
Beiträge: 33

Medaillen: Keine

BeitragVerfasst am: 25.08.2003, 20:36    Titel: Antworten mit Zitat

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! Mad
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Gehe zu Seite Zurück  1, 2
Seite 2 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum