Framerate begrenzen mit GetTickCount und Sleep nicht gut?



  • @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