2010-01-29 9 views
7

W mojej książce OpenGL, to mówi tak:FPS jak to obliczyć?

„Co się często zdarza na takim systemie jest to, że rama jest zbyt skomplikowany rysować w 1/60 sekundy, więc każda klatka jest wyświetlana więcej niż jeden raz. Jeśli na przykład trwa 1/45 sekundy, aby narysować ramkę, otrzymasz 30 klatek na sekundę, a grafika będzie bezczynna przez 1/30 1/45 = 1/90 sekundy na ramkę lub jedna trzecia z czas."

W zdaniu, które mówi "trwa 1/45 sekundy, aby narysować ramkę, otrzymasz 30 fps", dlaczego otrzymam tylko 30 fps? Nie lepiej mieć 45 fps?

+0

Przepraszam, nie rozumiem jeszcze, proszę, daj mi więcej odpowiedzi z doskonałym wyjaśnieniem! Naprawdę nie rozumiem, dlaczego dostaję tylko 30 fps, i dlaczego to zajmuje 2/60 sekund, aby odświeżyć! (link anon powiedział), dzięki jeszcze raz !! – drigoSkalWalker

Odpowiedz

12

Karta graficzna zwykle buforuje tylko jedną klatkę do przodu.

Jeśli zajmie 1/45 sekundy, aby narysować ramkę, to przy znaku 1/60 sekundy druga ramka zostanie wyświetlona ponownie. Przy znaku 1/45 następna klatka jest zrobiona - ale karta nie ma wolnego bufora, aby rozpocząć renderowanie następnej, więc musi siedzieć bezczynnie do 1/30, gdzie może wysłać tę ramkę i zacząć pracę na następnym.

Jest to z włączoną opcją VSync - jeśli ją wyłączysz, zamiast uzyskać 30 klatek na sekundę FPS i bezczynną kartę 1/3 czasu, karta zacznie odświeżać się natychmiast, a zamiast niej pojawi się ekran.

+1

+1: dla odniesienia do synchronizacji V –

+0

dlaczego to musi czekać do 1/30? dzięki w adavance. – drigoSkalWalker

+0

Ponieważ to wtedy wysyłana jest następna klatka (2/60th sekundy). Jeśli wyłączysz VSync, unikniesz oczekiwania, ale obraz wysyłany przez kartę będzie częścią jednej ramki i części drugiej. –

5

To prawda. Otrzymasz 45 fps, ale system zwalnia go do 30 fps, aby uzyskać płynne klatek na sekundę w monitorach 60Hz (60 przerysowań na sekundę).

Ponieważ trzeba zwrócić coś co 1/60 sekundy na monitorze 60Hz i nie można narysować „half-frame”, trzeba zwrócić poprzedni ramkę. Więc jeśli 60 razy na sekundę raz narysujesz prawdziwą klatkę, a co dwie klatki, którą narysujesz pierwszą, otrzymasz 30 klatek na sekundę, mimo że możesz zarządzać 45 klatkami na sekundę.

+0

60 razy/sekundę, nie co 60 sekund –

+0

@Jeffrey, ah, poprawiony literówka, dziękuję –

0

Tak, tak, jak powiedzieli inni, wynika to z faktu, że grafika czeka na v-sync przed rozpoczęciem generowania następnej klatki.

To powiedziawszy ...

Uwaga, nie wszystkie monitory odświeżania na 60Hz. 60 fps vs 30 fps staje się 70 fps vs 35 fps na wyświetlaczu 70 Hz.

Jeśli nie chcesz, aby dostać kartę czekać na Synchronizacja przed rozpoczęciem następnej klatki, ale nadal uniknąć rozdarcia, użyj potrójne buforowanie. GPU następnie wyświetla ping-pong do 2 buforów, gdy wyświetlana jest trzecia. Zdarzenie v-sync wyzwala zamianę na "obecnie gotowy" bufor powrotny. To wciąż nie jest świetne, ponieważ kończy się to niektórymi klatkami, które pozostają na ekranie częściej niż inne: z renderingiem 1/45, ramka pozostanie na 1/30, a druga na 1/60, dając trochę szarpaności .

Ostatnio, wraz z pojawieniem się poza ekranem renderingu (rendering do buforów niewyspecjalizowanych wyświetlany), to teoretycznie możliwe, że kierowca nie czekać na v-sync przed rozpoczęciem następnego kadru, czy wczesne prace, które obok ramka nie dotyka powierzchni ekranu. Wydaje mi się, że nigdy nie widziałem, żeby kierowca był tak inteligentny.