FPS begrenzen
-
ceplusplus@loggedoff schrieb:
VSync fällt weg, denn dann ist der input-lag viel zu hoch.
bist du dir sicher dass 16.6ms zuviel lag sind? welches spiel ist es?
, müsste der Timer auf ~1ms oder noch genauer gehen
wenn es nur um die limitierung der fps geht, brauchst du keinen wirklichen timer, mach ne simple schleife die sich die gewuenschte zeit loopt.
-
@TGGC
Ich habe es nun getestet. Mit Treiber-VSync (60 Hz) habe ich einen erheblichen Inputlag, welcher den Shooter unspielbar macht. Begrenze ich mit "FPS Limiter 0.2" die FPS auf 60, habe ich diesen Inputlag nicht. Keine Ahnung, vielleicht liegt es am Spiel, oder sollte man direkt im D3D das PresentationInterval entsprechend setzen (EDIT: Nein, selber Effekt wenn D3D Vsync und im Treiber aus)?@rapso
Eine Schleife? Also loopen und ständig abfragen, ob die gewünschte Zeit erreicht ist? Aber die gewünschte Zeit berechne ich doch mit der Zeit, die der gameloop schon gefressen hat... Wie erfahre ich das dann?
-
Wenn du die FPS messen willst reicht ein Timer mit einer Genauigkeit von 1ms vollkommen aus (unter Windows GetTickCount() oder timeGetTime()) da du ja sowieso nur einen Counter brauchst der nach 1000ms immer zurückgesetzt wird. Anyway, 1000 FPS sind in nem fertigen Spiel total sinnfrei, das ist höchstens interessant für Performance Vergleiche wobei die FPS dann sowieso nur bedingt aussagekräftig sind und man evtl. besser die Zeit/Frame misst (dafür kannst du unter Windows dann z.B. QueryPerformanceCounter() verwenden). Im fertigen Spiel wirst du VSync auf jeden Fall aktiviert haben um Tearing zu vermeiden.
Außerdem solltest du mal drüber nachdenken deine Inputbehandlung einfach in einem separaten Thread zu machen...
-
Das ist nicht mein Spiel. Source nicht vorhanden.
ceplusplus@loggedoff schrieb:
Ich möchte für ein älteres Spiel die FPS begrenzen, ...
-
ceplusplus@loggedoff schrieb:
Eine Schleife? Also loopen und ständig abfragen, ob die gewünschte Zeit erreicht ist? Aber die gewünschte Zeit berechne ich doch mit der Zeit, die der gameloop schon gefressen hat... Wie erfahre ich das dann?
du kannst rausfinden wie schnell deine cpu ist, du kannst dann rausfinden wieviele schleifendurchlaeufe du brauchst um eine ms zu blockieren und dann machst du das einfach jedes frame.
du kannst das auch ueber eine config datei oder eine tastenkombination einstellbar machen.
-
Und wie finde ich heraus, wie lange ein gameloop schon gebraucht hat, um zu wissen, wie lange ich dann noch warten muss?
Ich denke, es geht noch besser als mit einer Schleife, nicht?
Einstellbar sollen die FPS mit einer Zahl sein, das soll dann so stimmen.
-
ceplusplus@loggedoff schrieb:
Und wie finde ich heraus, wie lange ein gameloop schon gebraucht hat, um zu wissen, wie lange ich dann noch warten muss?
Du guckst vorher auf die Uhr?
-
@rapso hat halt gemeint, "brauchst du keinen wirklichen timer, mach ne simple schleife".
Also doch ein timer...
-
wenn dir die 1-3ms Auflösung nicht reichen die du über timeGetTime() haben kannst, dann nimm QueryPerformanceCounter.
-
Jo passt habs hinbekommen.
Thema erledigt.