2010-01-29 26 views
7

En mi libro de OpenGL, que dice lo siguiente:FPS cómo calcular esto?

"Lo que suele ocurrir en un sistema de este tipo es que el marco es demasiado complicado para dibujar en 1/60 de segundo, por lo que cada fotograma se muestra más de una vez. Si, para el ejemplo , toma 1/45 segundos dibujar un cuadro, obtiene 30 fps, y los gráficos están inactivos para 1/30 1/45 = 1/90 segundos por cuadro o un tercio de hora."

En la oración que dice "toma 1/45 segundos dibujar un cuadro, obtienes 30 fps", ¿por qué obtengo solo 30 fps? ¿No sería más correcto 45 fps?

+0

lo siento chicos, aún no lo entiendo, por favor denme más respuestas con una gran explicación! Realmente todavía no entiendo por qué obtengo solo 30 fps, ¡y por qué esto demora 2/60 segundos en actualizarse! (link anon said), ¡gracias de nuevo! – drigoSkalWalker

Respuesta

12

La tarjeta de gráficos normalmente solo amortiguará un fotograma adelante.

Si se tarda 1/45 de segundo en dibujar un cuadro, a la 1/60 de una segunda marca, se volverá a mostrar el cuadro anterior. En la marca 1/45, el siguiente fotograma está listo, pero la tarjeta no tiene un búfer libre para comenzar a renderizar el siguiente, por lo que debe permanecer inactivo hasta 1/30, donde puede enviar ese fotograma y comenzar a trabajar. en el siguiente.

Esto es con VSync habilitado: si lo deshabilita, en lugar de obtener la velocidad de fotogramas de 30 FPS y una tarjeta inactiva 1/3 de las veces, la tarjeta comenzará a volverse a dibujar inmediatamente, y en su lugar, se desgarrará la pantalla.

+1

+1: para la referencia de sincronización V –

+0

¿por qué debe esperar hasta 1/30? gracias en adavance – drigoSkalWalker

+0

Porque es cuando se envía el siguiente fotograma (2/60ths de segundo). Si deshabilita VSync evita la espera, pero luego la imagen que envía la tarjeta formará parte de un marco y parte de otro. –

5

Es correcto. Tendría 45 fps, pero el sistema lo está reduciendo a 30 fps, para lograr un framerate suave en monitores de 60Hz (60 rediseños por segundo).

Debido a que usted necesita dibujar algo cada 1/60 segundos en un monitor de 60 Hz, y no se puede dibujar un "medio-marco", que debe llamar la cuadro anterior. Entonces, si tienes 60 veces por segundo, una vez dibujas el cuadro real, y cada 2 cuadros dibujas el primero, entonces obtienes 30 fps a pesar de que puedes administrar 45 fps.

+0

60 veces/segundo, no cada 60 segundos –

+0

@Jeffrey, ah, error tipográfico corregido, gracias –

0

Así que sí, como han dicho otros, esto se debe a que sus gráficos esperan la sincronización v antes de comenzar a generar el siguiente fotograma.

Eso dijo ...

cuidado, no todos los monitores de refresco a 60Hz. 60 fps vs 30 fps se convierte en 70 fps vs 35 fps en una pantalla de 70 Hz.

Si no desea que su tarjeta espere la sincronización v antes de comenzar con el siguiente fotograma, pero aún así evite el desgarro, utilice triple buffering. La GPU luego hace ping-pongs en 2 búferes mientras se muestra el tercero. El evento v-sync es lo que desencadena el intercambio al buffer posterior "actualmente terminado". Esto todavía no es muy bueno, porque terminas con algunos fotogramas que se quedan en la pantalla más a menudo que otros: con tu renderizado 1/45, un fotograma permanecerá por 1/30s y el siguiente por 1/60, dando un poco de sacudidas .

Por último, con el advenimiento de la representación fuera de pantalla (representación en almacenamientos intermedios no visualizados), en teoría es posible que un controlador no espere la sincronización v antes de comenzar en el siguiente cuadro, si el trabajo inicial de ese próximo el marco pasa por no tocar la superficie de la pantalla. Sin embargo, no creo que haya visto a un conductor ser tan inteligente.