D3D Crash: solución al problema de drivers
He estado experimentando con Unreal Engine 5 para VFX y las simulaciones de Niagara Fluids son increíbles, pero también demandantes. Un fallo recurrente en mi GPU (D3D Crash), me hizo creer que mi hardware había llegado a su límite. Afortunadamente hay una solución.
El error en cuestión proviene directamente de los drivers de controlador de gráficos Direct3D (D3D) viéndose de la siguiente forma:
Direct3D es una API para la programación de gráficos en 3D. Tiene el objetivo de facilitar el trazado de entidades tridimensionales, así como sus transformaciones y texturas. El crash D3D es entonces un fallo a escala de GPU.
Lo interesante de este error es que, a pesar de ser un fallo de GPU, puede ser causado por diversos factores. Estos factores pueden ser tanto de software como de hardware por igual.
Arreglando D3D Crash en Unreal Engine
Para un error que puede ocurrir por diferentes causas, lo normal es que existan diferentes formas de afrontar la solución. A continuación listaré cuatro de ellas; dos sencillas y dos especializadas.
1. Limitar la taza de FPS en Unreal Engine.
Así es, es posible limitar la taza de FPS dentro del editor de Unreal Engine. Podemos hacer esto de dos formas distintas, pero ambas son bastante sencillas al final.
Método Command Line
Dentro de nuestro proyecto en Unreal Engine debemos escribir y ejecutar el comando “t.MaxFPS 30”. Podemos fijar la taza de FPS según nuestra preferencia personal, en este caso 30.
Método Project Settings
Yendo a la pestaña Edit > Project Settings y colocando en la barra de búsqueda emergente “Fixed Frame Rate”. Marcaremos la opción Use Fixed Frame Rate y a continuación fijaremos la taza de FPS deseada.
Cualquiera de estas opciones bastará para limitar la taza de FPS de nuestro proyecto.
Pro Tip: dentro de Edit > Editor Preferences > General > Performance marca la casilla Show Frame Rate and Memory. Ahora debes ser capas de visualizar métricas generales de rendimiento en la esquina superior derecha del editor. Utiliza este life-hack sabiamente en tus proyectos.
Esta solución es la más sencilla al problema. Limitar la taza de FPS del proyecto ayuda a reducir las operaciones por ciclo que Unreal Engine ejecuta. De esta forma se evita desbordar a la GPU de información y prevenir el D3D Crash.
¿Cuál es mejor opción? En realidad ambas son idénticas. La diferencia está en que el método Command Line limita los FPS a la sesión actual y el proyecto volverá a la normalidad cuando se reinicie.
2. Cambio de RHI a DirectX 11
Unreal Engine hace uso de la RHI DirectX 12 por defecto. La Rendering Hardware Interface (RHI) es la interfaz que el código de renderizado utiliza para comunicarse con las implementaciones de plataforma en Direct3D, OpenGL, etc.
En ocasiones aparecen problemas y crashes en la GPU por software que hace uso de DirectX 12 sin soporte para el mismo. Te aconsejo revisar las especificaciones de tu GPU y sistema operativo para comprobar la compatibilidad con DirectX 12.
Si no tienes soporte para la RHI DirectX12 deberás cambiar a DirectX 11. Dentro de Edit > Project Settings ingresa en la barra de búsqueda “Targeted RHIs”; en el apartado Platform – Windows > Default RHI selecciona DirectX 11. Deberás reiniciar el proyecto para efectuar los cambios.
Existe una desventaja para Unreal Engine 5 cuando hacemos downgrade a DirectX 11. Mientras que los features como Lumen tienen soporte para DirectX 11, Nanite (virtualización de polígonos) requiere de soporte basado en DirectX 12. Un alma por otra.
3. GPU Overclocking
Espera, no te emociones de más, no vamos a hacer overclocking, sino a quitarlo. Esta es una de las soluciones no tan sencillas.
En ocasiones queremos potencia y hacemos overclocking a nuestras GPU o vienen con el de fábrica y nosotros ni por enterados. Esto puede ser o muy bueno o muy malo dependiendo de tu contexto.
D3D Crash puede ser causado (en este contexto) debido a que acelerar las frecuencias de la GPU aumenta la rapidez de las operaciones y disminuyendo así el margen de TDR del sistema operativo.
La solución a nivel técnico para esto es restaurar las frecuencias de nuestra GPU hasta los estándares base. Esto requiere documentación y soporte del fabricante, además de un clavado a internet y algo de paciencia.
La solución a nivel lógico: no hagas overclocking a tu GPU, créeme, en la mayoría de los casos no lo vale.
4. Aumenta el TDR de tu sistema operativo
Esta es quizá la mejor de las cuatro soluciones propuestas, ya que es la que Unreal Engine propone de forma oficial en su documentación.
El Timeout Detection and Recovery (TDR) es una característica de Windows que detecta problemas de respuesta de una GPU y se recupera reiniciándola.
Esta función previene a las aplicaciones de bloquearse por el uso excesivo de memoria. Si una aplicación demora el render más del tiempo establecido, Windows reinicia el driver de la GPU. Esto resulta en un crasheo de la aplicación.
La solución propuesta es aumentar el TDR de nuestro sistema operativo. Al hacer esto ampliaremos el tiempo de render que Unreal Engine (y otras aplicaciones) pueden demorar en presentar respuesta. Esto previene y evita muchos de los crasheos D3D, sin embargo, no es el único factor de los mismos como ya hemos visto.
Para aumentar el TDR de nuestro equipo vamos a hacer uso del registro del sistema. Es aquí cuando se vuelve complicado. Modificar el registro del sistema puede causar errores irreversibles si no se maneja con cuidado.
Aquí encontrarás la guía oficial de Epic Games para implementar esta solución. Por favor, sigue cuidadosamente las instrucciones.
Siguientes pasos
Estas son las soluciones propuestas más útiles que he encontrado para D3D Crash. En mi caso, limitar los FPS y hacer el downgrade de RHI fue suficiente para permitirme trabajar con Niagara Fluids.
Experimenta con las distintas soluciones propuestas en este post y si consigues otras formas de solucionar el problema sería genial que lo compartieras.
Si estás interesado en VFX te enseño a crear fog estilizado con Unreal Engine o una galaxia de partículas con Unity.
Espero que este post te sea de ayuda. Sigue practicando tus habilidades, experimenta mucho, rompe las cosas y vuelve a intentarlo una y otra vez.