miércoles, 14 de enero de 2015

Rendimiento: Profiling y configuración gráfica

Después de pegarme mucho con ello creo que ya tengo una versión más o menos definitiva del sistema de cámara. Y he aprendido pequeñas cosas sobre dos campos: rendimiento y problemas de precisión. Este artículo va dedicado al rendimiento.

En el último artículo sobre los arreglos de la cámara mostraba mi preocupación por una caída de rendimiento ante las novedades que probaba, así que me plantee volver hacia cosas más sencillas, porque no podía dejar un juego corriendo a 15FPS. Y había veces que volviendo a soluciones anteriores iba mejor, otras no. No acababa de ver clara una relación causa efecto. Entonces empecé a hacer profiling de la aplicación con la herramienta que trae Unity y que básicamente te mide en qué gastas el tiempo de CPU y GPU. Y obtuve unas gráficas como estas:

Profiling chip nvidia

Pude ver que la mayor parte del tiempo (70%) se iba en una cosa llamada GTX.WaitForPresent. Después de preguntarle a google, vi que casi siempre se relaciona este valor con el vSync, aunque no parecía del todo claro. Hice otra prueba: correr el juego usando la gráfica integrada Intel, en lugar de la nvidia, es decir una caca de gráfica y no la buena. Sorprendentemente el rendimiento era mejor en la gráfica mala. El siguiente gráfico es el de Intel, tenía unos 40 fps, mientras que con la de nvidia tenía unos 20 fps. Y muy relacionado con ello estaba el GTX.WaitForPresent, que en la Intel sigue presente, pero con un 25% de cpu en lugar de un 70%.



Profiling chip Intel


Probé a quitar el vSync en Unity. Por cierto, voy a hacer una pequeña pausa para quejarme de una cosa de Unity: las opciones están desperdigadas por diferentes pantallas sin un orden comprensible. Buscas cosas como el vSync, la versión de DirectX a usar o calidad gráfica, entonces se te ocurre ir al menú “graphics” donde literalmente no hay nada, después vas a Quality y ahí se encuenta el vSync y algunas opciones sobre sombras y antialiasing, y en el menú “player” está la versión de DirectX o si quieres usar forward rendering o deferred lighting. Las primeras veces que buscas estas opciones es muy confuso, cada una en una menú distinto y sin saber muy bien porqué, si todas son opciones de configuración gráfica.

Vuelvo a lo que estaba: sin el vSync iba algo mejor, a veces, otras veces seguía teniendo problemas puntuales con el maldito GTX.WaitForPresent. Sin embargo si activaba el uso de DirectX 11 todo va como un cohete. Paso a 70 FPS en forward rendering y 100 FPS en deferred lighting, todo ello con el vSync desactivado.

Siento si alguien ha llegado a este artículo buscando una solución mágica a su problema de rendimiento por el GTX.WaitForPresent, os puedo decir que por ahora usando esa configuración me va bien y puedo seguir trabajando. Me gustaría saber mejor el origen y tener otra solución que no sea tener DirectX 11, porque con eso se me fastidia el ir a móvil. Aunque no he probado a usarlo sobre OpenGL, a lo mejor solo es cosa de DirectX, y recuerdo que en la gráfica de Intel me iba mejor, a lo mejor lo meto en un móvil y va de lujo sin ese problema. Pero todo es dar palos de ciego, tengo una ligera idea de por donde van las cosas pero no certezas. Y es una pena, he leído foros por Internet llenos de gente con el mismo problema y cada uno lo acaba solucionando de una forma, desde poner modo de compatibilidad con windows xp, suspender el ordenador con Unity abierto... Y parece que nos marean la perdiz de un lado a otro, Unity dice que no es un error reproducible, y no se hace cargo, nvidia tampoco da pistas sobre posibles problemas de configuración gráfica al respecto, y hay gente que lleva con el problema meses y no consigue solucionarlo. Es una pena que tengamos que seguir dando palos de ciego a ver si acertamos con algo que lo solucione, seguramente de rebote, sin saber bien el origen del problema para poder tomar las decisiones oportunas.

Y como conclusión final para mi juego: el problema de rendimiento no estaba en los algoritmos que usase para la cámara, daba la casualidad de que empecé a sufrir los problemas de rendimiento al hacer esos cambios, pero no era la causa, así que me siento más libre para seguir por donde quería con la cámara.

No hay comentarios :

Publicar un comentario