Deshabilitar la sincronización vertical para glxgears

85

A veces es necesario comprobar si la aceleración 3D de Linux está realmente funcionando (además de la glxinfosalida). Esto se puede hacer rápidamente con la glxgearsherramienta. Sin embargo, los FPS a menudo se limitan a la frecuencia de actualización vertical de la pantalla (es decir, 60 fps). Por lo tanto, la herramienta se vuelve más o menos inútil, ya que incluso un renderizado de software puede producir glxgears de 60FPS fácilmente en las CPU modernas.

Me resultó bastante difícil obtener una solución rápida y fácil para esto, respondo mi propia pregunta. Ojalá te ahorre tiempo.

mschmoock
fuente

Respuestas:

119

La vblank_modevariable de entorno hace el truco. A continuación, debería obtener varios cientos de FPS en hardware moderno. Y ahora puede comparar los resultados con otros.

$>   vblank_mode=0 glxgears
mschmoock
fuente
3
Exactamente lo que estaba buscando. Obtuve 59.984 FPS, que es la frecuencia de actualización. Configuración vblank_mode=0Ahora obtengo 1375.257 FPS en un antiguo controlador de video Intel i965 que ejecuta OpenBSD 5.6.
Clint Pachl
33
Probablemente valga la pena mencionar que esto solo funciona para los controladores de video de código abierto de Mesa
ali_m
1
Funciona para mí al usar Radeon / Intel híbrido con Mesa
Mark K Cowan
este tipo de trabajo funciona pero congela toda la computadora, lo que requiere un pkill TTY separado en mi máquina (arch)
phil294
73

Si está utilizando los controladores de código cerrado de NVIDIA, puede variar el modo de sincronización vertical sobre la marcha utilizando la __GL_SYNC_TO_VBLANKvariable de entorno :

~$ __GL_SYNC_TO_VBLANK=1 glxgears
Running synchronized to the vertical refresh.  The framerate should be
approximately the same as the monitor refresh rate.
299 frames in 5.0 seconds = 59.631 FPS

~$ __GL_SYNC_TO_VBLANK=0 glxgears
123259 frames in 5.0 seconds = 24651.678 FPS

Esto me funciona en Ubuntu 14.04 usando los controladores 346.46 NVIDIA.

ali_m
fuente
También funciona en los controladores Ubuntu 16.04, 387.26 NVIDIA.
Alejo Bernardin
Parece que obtengo resultados similares en todas mis máquinas. Todos están un poco por encima de los 20 mil FPS. ¿Es este un límite de tarjetas Nvidia?
Aaron Franke
Obtuve 47 mil FPS en una GTX1050
drescherjm
Funcionó con 13k FPS para una GTX 1050 Ti en Ubuntu 18.04.
fegemo
También funciona en el Jetson Nano. Consigo unos 2650 FPS.
robotrovsky
28

Para gráficos Intel y controladores de gráficos de código abierto AMD / ATI

Busque la sección "Dispositivo" /etc/X11/xorg.confque contiene una de las siguientes directivas:

  • Driver "intel"
  • Driver "radeon"
  • Driver "fglrx"

Y agregue la siguiente línea a esa sección:

Option     "SwapbuffersWait"       "false"

Y ejecute su aplicación con vblank_modela variable de entorno configurada en 0:

$ vblank_mode=0 glxgears

Para gráficos Nvidia con el controlador propietario de Nvidia

$ echo "0/SyncToVBlank=0" >> ~/.nvidia-settings-rc

Se puede realizar el mismo cambio en la nvidia-settingsGUI desmarcando la opción en X Screen 0 / OpenGL Settings / Sync to VBlank. O, si solo desea probar la configuración sin modificar su ~/.nvidia-settings-rcarchivo, puede hacer algo como:

$ nvidia-settings --load-config-only --assign="SyncToVBlank=0"  # disable vertical sync
$ glxgears  # test it out
$ nvidia-settings --load-config-only  # restore your original vertical sync setting
nocnokneo
fuente
1
Para Nvidia, puede ejecutar nvidia-settings --load-config-only --assign="SyncToVBlank=0"para simplemente cambiar la configuración de la pantalla X (y evitar modificar el archivo de configuración o ejecutar la GUI). Después de ejecutar glxgears, puede ejecutar nvidia-settings --load-config-onlypara restaurar la configuración de configuración, lo que probablemente desee hacer ya que es una configuración persistente para la pantalla X en ejecución (es decir, no solo para el shell).
Michael Krebs
13

Poniendo todas las otras respuestas juntas, aquí hay una línea de comando que funcionará:

env vblank_mode=0 __GL_SYNC_TO_VBLANK=0 glxgears

Esto tiene las ventajas de funcionar tanto para controladores Mesa como para NVidia, y no requiere ningún cambio en los archivos de configuración.

Krellan
fuente
6

Deshabilitar la casilla de verificación Sincronizar con VBlank en nvidia-settings (pestaña Configuración de OpenGL) me soluciona el problema.

neutro
fuente
5

Encontré una solución que funciona en la tarjeta intel y en la tarjeta nvidia usando Bumblebee.

> exportar vblank_mode = 0
glxgears
...
optirun glxgears
...
exportar vblank_mode = 1

olmerg
fuente
2

Para los controladores Intel, también existe este método

Deshabilitar la sincronización vertical (VSYNC)

El controlador Intel utiliza Triple Buffering para la sincronización vertical, esto permite un rendimiento completo y evita el desgarro. Para desactivar la sincronización vertical (por ejemplo, para la evaluación comparativa) use este .drirc en su directorio de inicio:

<device screen="0" driver="dri2">
    <application name="Default">
        <option name="vblank_mode" value="0"/>
    </application>
</device>
kevinf
fuente
3
Esta es una respuesta de solo enlace. Vincular a alguna documentación está muy bien, pero no lo suficiente como para constituir una respuesta por sí mismo (también los enlaces mueren, las páginas alojadas externamente cambian, etc.). ¿Podría resumir los puntos clave de su respuesta?
ali_m