Framerate begrenzen mit GetTickCount und Sleep nicht gut?



  • Original erstellt von KXII:
    ich schrieb, daß ich dafür keine genaue erklärung habe. es ist halt so. glaube es oder nicht, mir egal.

    Wie bereits gesagt wurde: Wie ist das denn dann bei Fernsehern? Die Dinger schaffen zwar oft 100Hz, aber glaubst Du wirklich dass jede Spielekonsole bei jedem gut aussehenden Spiel über 100fps schafft?

    Original erstellt von KXII:
    wenn das so ist, dann ist das schön für dich. kennst du den satz aus dem film matrix: "unwissenheit ist ein segen" ? ausserdem sagte ich nie das ich unzufrieden bin. ich sagte nur es sieht besser aus!

    Ich weiß zwar nicht was Du mir mit Zitat sagen willst aber "ignorance is bliss" ist schon um einiges älter als die Matrix.
    Ich wage allerdings ernsthaft zu bezweifeln dass Du bei einem vernünftig programmierten Spiel einen Unterschied merken kannst.

    Original erstellt von KXII:
    genau meine rede, wenn das "zumindest im weitesten sinne" dazugenommen wird. im normalfall nicht. falls du das anders siehst, dann bitte eine genaue erklärung, da dies meine vorstellungskraft übersteigt.

    Beispiel Ego-Shooter mit Multiplayer-Modus: Stell Dir mal Quaak3 würde nicht ruckeln sondern einfach immer "ein bisschen langsamer" laufen. Das wäre wirklich fatal, denn es hieße dass jeder Spieler genau die gleiche Hardware bräuchte um das Spiel halbwegs synchron genießen zu können.

    Original erstellt von KXII:
    Wenn diverse Egoshooter...
    genau meine rede.

    Siehe oben.

    Original erstellt von KXII:
    wieso denn das? wenn die grafik öftes gerendert wird als die logik neuberechnet wird, wieso sollte dann alles im zeitlupenmodus ablaufen? 😕

    Hm, kann es sein dass sich hier irgendwo ein Missverständnis zusammengebraut hat? 😕
    Allerdings: Wenn Die Grafik öfters gerendert wird als die Logik neuberechnet wird was sollte das dann Deiner Meinung nach bringen?

    ich habe mir den absatz nochmal durchgelesen, aber ich erkenne keinen denkfehler. meine programme laufen ohne logikfehler, egal wieviel frames sie haben. bei zuwenig frames wird alles langsamer, aber das ändert, wie gesagt, nichts an der berechenbarkeit von kollisionen.

    Wenn bei zuwenig Frames alles langsamer wird dann hast Du gerade Deine eigene Frage im letzten Absatz beantwortet und solltest mittlerweile verstehen was das Problem daran ist.

    wenn du unbedingt ein programm schreiben willst, das auch bei wenigen frames pro sekunde die sprites immer gleichschnell über den bildschirm laufen (eher springen) lässt, und du dann irgendetwas programmierst das fehlerfaht berechnet wird, dann ist das dein problem. aber mit einer sinnvollen programmierung hat das nichts zu tun.

    siehe oben ("Fehlerhafte Berechnung" ist nicht das Problem, aber wenn mein Programm auf einmal nur mehr in Zeitlupe abläuft dann habe ich was falsch gemacht. Wenn es bei zu wenig FPS einfach nur ein bisschen ruckelt dann passt alles.)

    [quote]aber zurück zum thema...[quote]
    Irgendwie werde ich den Verdacht nicht los dass Du uns missverstehst - poste Doch mal (möglichst in einem neuen Thread; dieser wird zu unübersichtlich) ein bisschen von Deinem Timing-Code!



  • Original erstellt von KXII:
    wieso beziehst du diesen satz auf dich selbst
    ...
    der vorherige abschnitt war eindeutig auf "thetoast" bezogen, weil er sagte, daß er nie mehr fps hat als seine bildwiederholfrequenz. und weil ich mir das nicht vorstellen kann, wollte ich von ihm wissen wieso das so ist.

    Ich wollte untermauern dass thetoast recht hat und man bei aktuellen Spielen fast nie mehr FPS hat als Hz Bildwiederholrate.



  • Hi, also ich habe bis jetzt auch immer die von mir am anfang beschriebene methode angewandt, hatte aber auch einige Probleme. z.B. bei (realistisch)fallenden objekten, erst recht wenn diese auch noch springen (sollen). Die "andere Methode" klingt imho sehr überzeugend, da ja dieses Problem gelöst ist und weniger rechenzeit gebraucht wird. Was ist jedoch, wenn netzwerk spiel zB 25/s die logic aktualisieren soll, dies jedoch nicht schafft. Das würde dann doch heißen, dass das spiel langsamer liefe, was jedoch fatal wäre, oder?

    MfG DasPinsch



  • schau mal hier:
    http://www.bytesandmore.de/rad/

    da gibts ein Snippet mit Zeitmessung oder so, kannst es Dir leicht anpassen



  • @nman

    "Beispiel Ego-Shooter mit Multiplayer-Modus: Stell Dir mal Quaak3 würde nicht ruckeln sondern einfach immer "ein bisschen langsamer" laufen. Das wäre wirklich fatal, denn es hieße dass jeder Spieler genau die gleiche Hardware bräuchte um das Spiel halbwegs synchron genießen zu können."

    nicht für JEDEN spieler wird das spiel dann langsamer, nur für den der einen zu lahmen rechner hat, programmiersystem vorausgesetzt. wenn einer, weil sein rechner lahmt, nur 3 mal pro sekunde daten vom server empfangen und zu ihm senden kann, dann ist das halt so, aber die anderen spieler betrifft das doch nicht. jetzt kommt es halt auf die programmierung an, ob der spieler 3 mal in der sekunde rumhüpft oder 3 mal in der sekunde einen schneckenschritt macht.

    diskutiert ohne mich weiter. es wurden ja schon ein paar ansätze dargestellt die funktionieren. ich mache es so wie ich es die ganze zeit mache und die anderen halt so wie sie es die ganze zeit machen. hauptsache jeder wird glücklich. 🙂

    ich muss jetzt arbeiten!

    [ Dieser Beitrag wurde am 02.07.2003 um 13:56 Uhr von KXII editiert. ]



  • ok, ich glaub ich verstehe so langsam, wieso manchmal doch mehr Logictics notwendig sind. Was ich mache ist aber nur ein simples 2D Spiel, eine kleine WiSim, wo nur Daten angezeigt werden, der MausCursor und ein paar Buttons. Bei dem Spiel ist es tatsächlich sinnlos, mehr LogicTics zu machen. Man kann nur ein paar Sachen kaufen und so.

    [ Dieser Beitrag wurde am 02.07.2003 um 17:12 Uhr von TheToast editiert. ]



  • KXII:

    Wenn die Frames höher als die Wiederholrate ist kommt das hier raus, von Google:

    Der VSync sollte Ihren Augen zuliebe immer eingeschaltet sein. Diese Einstellung synchronisiert das erzeugte Bild der Grafikkarte mit dem Monitor, das heisst die Grafikkarte wartet auf den Monitor bis dieser das aktuelle Bild dargestellt hat, bevor das nächste Bild angezeigt wird. Ist diese Funktion ausgeschaltet, kann die Grafikkarte den Monitor überholen oder diesem hinterherhinken, wodurch Teile von zwei oder mehr Bildern gleichzeitig angezeigt werden können. Diesen Effekt nennt man "Tearing" und fällt meist bei Animationen und besonders bei Drehungen in Spielen auf.
    VSync wird auch gerne als VBlank (= Vertikale Austastlücke = Bildanfang) bezeichnet.
    Achtung! Bei vielen Leuten herrscht die Meinung durch eingeschalteten VSync würde die Performance von Grafikkarten gedrosselt. Dies ist in diesem generellen Stil nicht richtig, denn durch das eingeschaltete V-Sync werden nur Performance-Spitzen oberhalb der Monitor-Wiederholungsrate abgeschnitten. Da nicht die maximale Performance ausgenutzt wird sinken natürlich die Benchmark-Ergebnisse, dieser "Performance-Verlust" ist aber im normalen Betrieb nicht merkbar (oder können Sie 90 Bilder/s von 60 Bilder/s unterscheiden?). Das eingeschaltete V-Sync bringt sogar einen Vorteil durch das "ruhigere" Bild. Um dies zu verdeutlichen hier ein Performance-Diagramm



  • @the toast

    das ist alles nicht neues für mich...

    ich habe früher grafikarten mittels assembler, ports und interrupts direkt angesprochen, und sowohl vsync als auch hsync selber an und ausgeschaltet. ich weiß also ganz genau wovon ich spreche... 🕶

    nichts für ungut!



  • Es ist also richtig, dass mit der methode bei der pro sekunde eine bestimmte anzahl logicupdates durchgeführt werden, und der comp dafür nicht schnell genug ist, das spiel auf dem computer langsamer läuft?? Wär ja irgendwie scheisse, denn vor allem bei netzwerkspielen kommt es ja meistens sehr stark auf geschwindigkeit an 😞 gibt es bereits kommerzielle spiele bei denen das so ist? würd mich mal interessieren..



  • Original erstellt von rapso:
    **die spielgeschwindigkeit bleibt eigentlich immer gleich, egal welcher rechner, das ist das was logicticks ausmacht. du kannst fest davon ausgehen, dass sie alle z.B. 40ms aufgerufen werden und dass das delta 40ms ist!

    um flüssige darstellung zu haben, hat man immer noch animatoren, die man im logictick einstellst.**

    DAS kann ja nicht sein. Vielleicht ist ja der Rechner eben auch zu langsam dafür, alle 40 ms den LT aufzurufen..!! Und dann??

    Und das mit den Animatoren...
    Was ist denn, wenn ich unterwegs - direkt nach dem ersten LT - dem Panzer einen neuen Wegpunkt zuweise - dann müsste ja - sobald der nächste LT kommt, der Panzer etwas "springen"...
    Das wär' ziemlich übel... 😕

    Original erstellt von DasPinsch:
    Es ist also richtig, dass mit der methode bei der pro sekunde eine bestimmte anzahl logicupdates durchgeführt werden, und der comp dafür nicht schnell genug ist, das spiel auf dem computer langsamer läuft?? Wär ja irgendwie scheisse, denn vor allem bei netzwerkspielen kommt es ja meistens sehr stark auf geschwindigkeit an 😞 gibt es bereits kommerzielle spiele bei denen das so ist? würd mich mal interessieren..

    Naja. CCG regelt glaub' ich alle Spieler im NW runter, wenn eine Kiste aufgrund langsamer GraKa o.ä. nicht mitkommt...



  • Original erstellt von Sgt. Nukem:
    Naja. CCG regelt glaub' ich alle Spieler im NW runter, wenn eine Kiste aufgrund langsamer GraKa o.ä. nicht mitkommt...

    Irgendwie dumm wenn ein spieler durch seinen comp das ganze spiel vermiesen kann 🙄


  • Mod

    Original erstellt von Sgt. Nukem:
    Naja. CCG regelt glaub' ich alle Spieler im NW runter, wenn eine Kiste aufgrund langsamer GraKa o.ä. nicht mitkommt...

    Original erstellt von Sgt. Nukem:
    DAS kann ja nicht sein. Vielleicht ist ja der Rechner eben auch zu langsam dafür, alle 40 ms den LT aufzurufen..!! Und dann??

    DAS kann nicht nur, DAS ist so für den logictick, schliesslich rechnet man mit der abstrakten zeit, die das framework vorgibt und nicht mit z.B. GetTickCount oder sowat (siehe mein code snipple in früheren post) , deswegen kann man dann auch zeitlupe einschalten (z.B. bei wiederhollungen bei rennspielen) ohne dass die framerate auch auf 1/4 fällt, weil die logic unabhängig von der darstellung läuft (aber nicht die darstellung von der logic)

    Original erstellt von Sgt. Nukem:
    Und das mit den Animatoren...
    Was ist denn, wenn ich unterwegs - direkt nach dem ersten LT - dem Panzer einen neuen Wegpunkt zuweise - dann müsste ja - sobald der nächste LT kommt, der Panzer etwas "springen"...
    Das wär' ziemlich übel...

    das wär's nicht nur, das ist es, spiel mal nen online shooter mit nem schlechten ping, wenn ein neues datenpaket ankommt, muss der gegenspieler auch irgendwie auf seine neue position gebracht werden, und wenn man zwischen der extrapolierten position und der vom server gegebenen nicht interpoliert, dann springt der.

    alternativ wird, z.B. bei fussballsimulationen, eine quee für die motions gemacht, wenn der spieler also gerade läuft und nun drehen muss damit er nicht ins aus läuft, dann wird das drehen auf die Quee gesteckt und sobald die "renn"-animation vom keyframeanimator durchgespielt wurde, wird die "dreh"-animation gespielt.

    zudem frage ich mich, wie sehr du das springen vom panzer merkst, wenn er gerade mal max. 40ms eine falsche bewegung gemacht hat... falls das überhaupt so ist, denn bei kurzen bewegungen wird in manchen spielen das dargestellt, das bereits in der logic abgelaufen ist. wenn du also im neuen logictick die neue position berechnest, setzt du die alte position als start und die neue als endposition.
    und das ist keineswegs ne schwammige steuerung, da du eh meißt innerhalb von 40ms alles aktualisieren kannst.

    rapso->greets();



  • Aha, also geht's gar nicht um *echte* Zeit in (Milli-)Sekunden o.ä., sondern um eine gedachte Zeit, die also auch variabel ist... 🙄


  • Mod

    das ist die interpretationssache, aber für die logic ist es die echte zeit! wie du aus meinem samplesource gesehen hast, orientiert sie sich an der richtigen zeit, aber die "logic-impulse" werden quasi wie bei einer quarzuhr nur alle zeitlang und in den selben abständen abgegeben.
    die zeit verläuft ja nicht in ms, sondern in ticks, bei einem strategiespiel ist ein panzer dann auch 10pixel/tick schnell und wieviel das pro ms ist interresiert kaum jemanden der das programmiert.

    schliesslich wissen wir ja auch nicht wie hoch der tick dieser welt ist, solange wir uns innerhalb des bezugsystems befinden.

    rapso->greetS();



  • Original erstellt von rapso:
    **das ist die interpretationssache, aber für die logic ist es die echte zeit! wie du aus meinem samplesource gesehen hast, orientiert sie sich an der richtigen zeit, aber die "logic-impulse" werden quasi wie bei einer quarzuhr nur alle zeitlang und in den selben abständen abgegeben.
    die zeit verläuft ja nicht in ms, sondern in ticks, bei einem strategiespiel ist ein panzer dann auch 10pixel/tick schnell und wieviel das pro ms ist interresiert kaum jemanden der das programmiert.

    schliesslich wissen wir ja auch nicht wie hoch der tick dieser welt ist, solange wir uns innerhalb des bezugsystems befinden.

    rapso->greetS();**

    Ja, schon klar.
    Aber ohne diese kleine Detail zu wissen war alles gesagte irgendwie sehr obskur...

    Tjeeee... "ticks" hatte auch schon Carmack in seiner Doom-Engine (25 ticks pro Pixel Lift-Bewegung, oder wie war dat?!) ... 🙂


Anmelden zum Antworten