Generación de perfiles de aplicaciones de DirectX

Esto muestra cómo medir algunas de las medidas de tiempo de rendimiento más importantes para una aplicación DirectX mediante las herramientas XPerf y GPUView que se incluyen como parte del Kit de herramientas de rendimiento de Windows. Esta no es una guía completa para comprender las herramientas, sino su aplicabilidad específica para analizar el rendimiento de la aplicación DirectX. Aunque la mayoría de las técnicas que se describen aquí son relevantes para todas las aplicaciones de DirectX, es más relevante para las aplicaciones que usan cadenas de intercambio y no para las aplicaciones directX creadas en XAML que usan animaciones SIS/VSIS y XAML. Le guiaremos por las medidas clave del tiempo de rendimiento, cómo adquirir e instalar las herramientas y realizar seguimientos de medidas de rendimiento y analizarlas para comprender los cuellos de botella de la aplicación.

Acerca de las herramientas

XPerf

XPerf es un conjunto de herramientas de análisis de rendimiento basadas en seguimiento de eventos para Windows (ETW) diseñadas para medir y analizar el rendimiento detallado del sistema y la aplicación y el uso de recursos. A partir de Windows 8 esta herramienta de línea de comandos tiene una interfaz gráfica de usuario y se denomina Windows Performance Recorder (WPR) y Windows Analizador de rendimiento (WPA). Puede encontrar más información sobre estas herramientas en la página web de Windows Performance Toolkit (WPT): Windows Performance Toolkit.

Un ETW recopila eventos de kernel solicitados y los guarda en un archivo denominado archivo de registro de seguimiento de eventos (ETL). Estos eventos de kernel proporcionan información extensa sobre una aplicación y características del sistema al ejecutar la aplicación. Los datos se recopilan habilitando la captura de seguimiento, realizando el escenario de aplicación deseado que necesita análisis, deteniendo la captura que guarda los datos en un archivo ETL. A continuación, puede analizar el archivo en la misma máquina o en otra mediante la herramienta de línea de comandos xperf.exe o la herramienta de análisis de seguimiento visual xperfview.exe.

GPUView

GPUView es una herramienta de desarrollo para determinar el rendimiento de la unidad de procesamiento de gráficos (GPU) y la CPU. Examina el rendimiento con respecto al procesamiento del búfer de acceso directo a memoria (DMA) y al resto del procesamiento de vídeo en el hardware de vídeo.

En el caso de las aplicaciones de DirectX que dependen en gran medida de la GPU, GPUView es una herramienta eficaz para comprender la relación entre el trabajo realizado en la CPU y la GPU. Para obtener más información sobre GPUView, consulta Uso de GPUView.

De forma similar a XPerf, primero se toma un seguimiento ETW iniciando el servicio de seguimiento, realizando el escenario que necesita análisis para la aplicación en consideración, deteniendo el servicio y guardando la información en un archivo ETL. GPUView presenta los datos presentes en el archivo ETL en un formato gráfico.

Después de instalar la herramienta GPUView , se recomienda leer el tema "Pantalla principal de GPUView" en el menú "Ayuda de GPUView ". Contiene información útil sobre cómo interpretar la interfaz de usuario de GPUView .

Instalación de las herramientas

Tanto XPerf como GPUView se incluyen en Windows Performance Toolkit (WPT).

XPerf se incluye como parte del Kit de desarrollo de software (SDK) de Windows para Windows. Descargue windows SDK.

GPUView está disponible en windows Assessment and Deployment Kit (Windows ADK). Descargue Windows ADK.

Después de la instalación, debe agregar los directorios que contienen XPerf y GPUView a la variable "Path" del sistema.

Haga clic en el botón Inicio y escriba "Variables del sistema". Se abre el ventana Propiedades del sistema. Haga clic en "Editar las variables de entorno del sistema". Seleccione "Variables de entorno" en el cuadro de diálogo "Propiedades del sistema". La variable "Path" se encuentra en "Variables del sistema". Anexe el directorio que contiene xperf.exe y GPUView.exe a la ruta de acceso. Estos ejecutables se encuentran en el directorio "Windows Performance Toolkit" dentro de "Windows Kits". La ubicación predeterminada es: C:\Archivos de programa (x86)\Windows Kits\10\Windows Performance Toolkit.

Medidas de tiempo de rendimiento

La mayoría de las aplicaciones esperan ejecutarse sin problemas y responder a la entrada del usuario. Sin embargo, dependiendo del escenario que desee, un aspecto del rendimiento podría ser más importante que otro. Por ejemplo, para una aplicación de lector de noticias que se ejecuta en un equipo de tableta táctil, el aspecto más importante es ver un único artículo a la vez y desplazarse por el mismo o otro artículo. En este escenario, la capacidad de representar todo el contenido de cada fotograma no es necesario. Sin embargo, la capacidad de desplazarse por el artículo sin problemas sobre un gesto táctil es muy importante.

En otra instancia, un juego o una aplicación de representación de vídeo que usa una gran cantidad de problemas de animaciones si se quitan fotogramas. En este caso, la capacidad de presentar contenido en la pantalla sin interuption de la entrada del usuario es muy importante.

Para comprender qué parte de la aplicación es problemática, el primer paso es decidir los escenarios más importantes. Una vez que se comprendan los aspectos básicos de la aplicación y cómo se ejercerán, buscar problemas con las herramientas resulta más fácil.

Algunas de las métricas de tiempo de rendimiento más comunes son las siguientes:

Tiempo de inicio

Tiempo medido desde el inicio del proceso hasta el primer presente que alcanza la pantalla. Esta medida es más útil cuando el sistema está caliente, lo que significa que la medición se toma después de que la aplicación se inicie varias veces.

Tiempo de CPU por fotograma

Hora en la que la CPU procesa activamente la carga de trabajo de la aplicación para un fotograma. Si la aplicación se ejecuta sin problemas, todo el procesamiento necesario para un fotograma se produce dentro de un intervalo de sincronización virtual. Con la frecuencia de actualización del monitor de 60Hz, esto viene a 16 ms por fotograma. Si el tiempo/fotograma de CPU es mayor que 16 ms, es posible que se necesiten optimizaciones de CPU para generar una experiencia de aplicación sin problemas.

Tiempo de GPU por fotograma

Hora en la que GPU procesa activamente la carga de trabajo de la aplicación para un fotograma. Una aplicación está enlazada con GPU cuando el tiempo necesario para procesar un fotograma de datos es superior a 16 ms.

Ser capaz de entender si una aplicación es CPU o GPU enlazada restringirá la parte problemática del código.

Realizar un seguimiento de medición del tiempo de rendimiento

Realice estos pasos para realizar un seguimiento:

  1. Abra una ventana de comandos como administrador.
  2. Cierre la aplicación si ya se está ejecutando.
  3. Cambie los directorios al directorio gpuview dentro de la carpeta Windows Performance Toolkit.
  4. Escriba "log.cmd" para iniciar el seguimiento de eventos. Esta opción registra los eventos más interesantes. Otras opciones disponibles registran un ámbito diferente de los eventos. Por ejemplo, el modo de registro "v" o detallado captura todos los eventos que gpuView conoce.
  5. Inicie el ejemplo y haga ejercicio el ejemplo de una manera que abarque la ruta de acceso de rendimiento que necesita analizar.
  6. Volver a las ventanas de comandos y escriba "log.cmd" de nuevo para detener el registro.
  7. Esto genera un archivo denominado "merged.etl" en la carpeta gpuview . Puede guardar este archivo en otra ubicación y analizarlo en el mismo equipo o en otro equipo. Para ver los detalles de captura de pila, guarde el archivo de símbolos (.pdb) asociado a la aplicación.

Medidas

Nota

Las medidas para la muestra de realización de geometría se toman en una máquina Quad Core con una tarjeta gráfica DirectX11 integrada. Las medidas varían en función de la configuración de la máquina.

 

En esta sección se muestra cómo medir el tiempo de inicio, la CPU y el tiempo de GPU por fotogramas. Puede capturar un seguimiento de rendimiento para el mismo ejemplo en la máquina y ver las diferencias en las distintas medidas.

Para analizar el seguimiento en GPUView, abra el archivo "merged.elt" mediante GPUView.exe.

Tiempo de inicio

El tiempo de inicio se mide por el tiempo total empleado desde el inicio de la aplicación hasta que el contenido aparece por primera vez en la pantalla.

La medida de tiempo de inicio se realiza mejor siguiendo los pasos indicados en la sección anterior con estas variaciones:

  • Si toma las medidas de inicio la primera vez que inicia la aplicación, se denomina inicio en frío. Esto puede variar de las medidas tomadas después de iniciar la aplicación varias veces en una pequeña duración de tiempo. Esto se denomina inicio intermedio. Dependiendo de cuántos recursos crea una aplicación al iniciarse, puede haber una gran diferencia entre las dos veces de inicio. Dependiendo de los objetivos de la aplicación, medir uno u otro podría ser deseable.
  • Al registrar información de rendimiento, finalice la aplicación tan pronto como aparezca el primer fotograma en la pantalla.

Cálculo del tiempo de inicio mediante GPUView

  1. En GPUView, desplácese hacia abajo hasta el proceso pertinente, en este caso GeometryRealization.exe.

    Captura de pantalla que muestra un ejemplo de procesos en GPUView.

  2. La cola de CPU de contexto representa la carga de trabajo de gráficos puesta en cola en el hardware, pero no necesariamente procesada por el hardware. Cuando se abre el archivo de seguimiento, muestra todos los eventos registrados entre el momento en que se tomó el seguimiento. Para calcular el tiempo de inicio, seleccione la región de interés, acerque la parte inicial de la primera cola de CPU de contexto (esta es la que muestra la actividad) con Ctrl +Z. Puede encontrar más información sobre los controles GPUView en la sección de ayuda de GPUView "Resumen de los controles GPUView ". En la ilustración siguiente solo se muestra el proceso de GeometryRealization.exe acercado a la primera parte de la cola de CPU de contexto. El color de la cola de CPU de contexto se indica mediante el rectángulo justo debajo de la cola y los mismos paquetes de datos de color en la cola mostrar el trabajo de GPU en cola en el hardware. El paquete de patrón de sombreado en la cola de contexto muestra el paquete presente, lo que significa que la aplicación quiere que el hardware presente el contenido en la pantalla.

    Captura de pantalla que muestra ejemplos de la

  3. El tiempo de inicio es la hora en que se inicia la aplicación por primera vez (en este caso, el módulo de punto de entrada del subproceso de interfaz de usuario SHCORE.dll) hasta que el contexto aparece por primera vez (marcado por un paquete de sombreado). La ilustración aquí resalta el área de interés.

    Nota

    La información actual actual se representa en la cola de volteo y, por lo tanto, el tiempo necesario se extiende hasta que el paquete actual se completa realmente en la cola de volteo.

     

    La barra de estado completa no está visible en la ilustración siguiente, que también muestra el tiempo transcurrido entre las partes resaltadas. Este es el tiempo de inicio de la aplicación. En este caso para la máquina mencionada anteriormente, salió a alrededor de 240 ms.

    Captura de pantalla que muestra áreas de interés relacionadas con el tiempo de inicio en

Tiempo de CPU y GPU por fotograma

Hay algunas cosas que hay que pensar al medir el tiempo de CPU. Busque las áreas del seguimiento en las que ha ejecutado el escenario que se va a analizar. Por ejemplo, en el ejemplo de realización de geometría uno de los escenarios analizados es la transición entre la representación 2048 y las primitivas 8192, todas no realizadas (como en, la geometría no se tesela cada fotograma). El seguimiento muestra claramente la diferencia en la actividad de CPU y GPU antes y después de la transición en el número de primitivos.

Se analizan dos escenarios para calcular el tiempo de CPU y GPU por fotograma. Son los siguientes.

  • Transición de la representación de primitivos no realizados 2048 a 8192 primitivos no realizados.
  • La transición de la representación 8192 realizó primitivos a 8192 primitivos no realizados.

En ambos casos, se observó que la velocidad de fotogramas se redujo drásticamente. Medir el tiempo de CPU y GPU, la relación entre los dos, así como algunos otros patrones del seguimiento, puede proporcionar información útil sobre las áreas problemáticas de la aplicación.

Cálculo de la CPU y el tiempo de GPU cuando se representan primitivas 2048 no realizadas

  1. Abra el archivo de seguimiento mediante GPUView.exe.

  2. Desplácese hacia abajo hasta el proceso de GeometryRealization.exe.

  3. Seleccione un área para calcular el tiempo de CPU y acercarla con CTRL + Z.

    Captura de pantalla que muestra un área seleccionada para calcular la hora de C P U en la

  4. Mostrar información de sincronización virtual alternando entre F8. Mantener el zoom hasta que sea fácil ver claramente un vsync de datos. Las líneas azules son donde las horas de sincronización virtual. Normalmente, se producen una vez cada 16 ms (60 fps), pero si DWM encuentra un problema de rendimiento, se ejecuta más lentamente para que se produzcan una vez cada 32 ms (30 fps). Para obtener una sensación de tiempo, seleccione de una barra azul a la siguiente y, a continuación, examine el número de ms notificados en la esquina inferior derecha de la ventana GPUView .

    Captura de pantalla que muestra un ejemplo de horas de sincronización virtual.

  5. Para medir el tiempo de CPU por fotograma, mida el tiempo que tardan todos los subprocesos implicados en la representación. Es posible que valga la pena restringir el subproceso que se espera que sea más relevante desde el punto de vista del rendimiento. Por ejemplo, en el ejemplo de realización de geometría, el contenido está animando y debe representarse en la pantalla cada fotograma que convierte el subproceso de la interfaz de usuario en el importante. Una vez que determine qué subproceso se va a examinar, mida la longitud de las barras de este subproceso. Promediar algunos de estos rendimientos produce tiempo de CPU por fotograma. En la ilustración siguiente se muestra el tiempo empleado en el subproceso de la interfaz de usuario. También muestra que esta vez se ajusta bien entre dos sincronizaciones virtuales consecutivas, lo que significa que alcanza 60FPS.

    Captura de pantalla que muestra el tiempo empleado en el subproceso de U I.

    También puede comprobar si examina la cola de volteo para el período de tiempo correspondiente que muestra que DWM puede presentar cada fotograma.

    Captura de pantalla que muestra un ejemplo de

  6. El tiempo de GPU se puede medir de la misma manera que el tiempo de CPU. Acercar el área pertinente como en el caso de medir el tiempo de CPU. Mida la longitud de las barras de la cola de hardware de GPU con el mismo color que el color de la cola de CPU de contexto. Siempre que las barras se ajusten dentro de las sincronizaciones virtuales consecutivas, la aplicación se ejecuta sin problemas en 60FPS.

    Captura de pantalla que muestra un ejemplo de la

Cálculo de la CPU y el tiempo de GPU cuando se representan 8192 primitivos no realizados

  1. Si sigue los mismos pasos de nuevo, el seguimiento muestra que todo el trabajo de CPU de un fotograma no cabe entre una sincronización virtual y la siguiente. Esto significa que la aplicación está enlazada a la CPU. El subproceso de interfaz de usuario está saturando la CPU.

    Captura de pantalla que muestra un ejemplo del subproceso de interfaz de usuario que satura la interfaz de usuario de C P U.

    Al examinar la cola de volteo, también está claro que DWM no puede presentar todos los fotogramas.

    Captura de pantalla que muestra un ejemplo de la D W M no puede presentar todos los fotogramas.

  2. Para analizar dónde se invierte el tiempo, abra el seguimiento en XPerf. Para analizar el tiempo de inicio en XPerf, busque primero el intervalo de tiempo en GPUView. Pase el mouse sobre la izquierda del intervalo y la derecha y tome nota de la hora absoluta que se muestra en la parte inferior de la ventana GPUView . A continuación, abra el mismo archivo .etl en XPerf y desplácese hacia abajo hasta el gráfico "Muestreo de CPU por CPU", haga clic con el botón derecho y seleccione "Seleccionar intervalo..." Esto permite escribir en el intervalo de interés que se detectó examinando el seguimiento de GPU.

    Captura de pantalla que muestra el muestreo de C P U por C P U en

  3. Vaya al menú Seguimiento y asegúrese de que está activada la opción "Cargar símbolos". Además, vaya a Seguimiento:> configurar rutas de acceso de símbolos y escriba la ruta de acceso del símbolo de la aplicación. Un archivo de símbolos contiene información de depuración sobre un ejecutable compilado en una base de datos independiente (.pdb). Este archivo se conoce normalmente como PDB. Puede encontrar más información sobre los archivos de símbolos aquí: Archivos de símbolos. Este archivo se puede encontrar en la carpeta "Depurar" del directorio de la aplicación.

  4. Para obtener el desglose de dónde se invierte el tiempo en la aplicación, haga clic con el botón derecho en el intervalo seleccionado en el paso anterior y haga clic en Tabla de resumen. Para obtener información general sobre cuánto tiempo se invierte en cada archivo dll, desactive "Stack" en el menú "Columnas". Tenga en cuenta que la columna "Count" aquí muestra cuántos ejemplos están dentro de la dll o función especificadas. Dado que se toma aproximadamente una muestra por ms, este número se puede usar como una mejor estimación para cuánto tiempo se invierte en cada dll/función. Al comprobar la "Pila" en el menú Columnas se proporcionará el tiempo inclusivo invertido en cada función del gráfico de llamadas. Esto ayudará a desglosar aún más los puntos del problema.

  5. La información de seguimiento de la pila para primitivos no realizados de 2048 revela que el 30 % del tiempo de CPU se invierte en el proceso de realización de geometría. De eso alrededor del 36 % del tiempo se está dedicando en teselación de geometría y estrobozación.

  6. La información de seguimiento de la pila de primitivos no realizados de 8192 revela que alrededor del 60 % del tiempo de CPU (4 núcleos) se invierte en la realización de la geometría.

    Captura de pantalla que muestra información de seguimiento de pila para la hora de C P U.

Cálculo del tiempo de CPU cuando se representan 8192 primitivos

Es claro que los perfiles de la aplicación están enlazados a la CPU. Para reducir el tiempo empleado por la CPU, las geometrías se pueden crear una vez y almacenarse en caché. El contenido almacenado en caché se puede representar cada fotograma sin incurrir en el costo de teselación de geometría por fotograma. Al examinar el seguimiento en GPUView para la parte realizada de la aplicación, es claro que DWM puede presentar cada fotograma y el tiempo de CPU se ha reducido drásticamente.

Captura de pantalla que muestra un ejemplo de un seguimiento en GPUView que muestra que D W M puede presentar cada fotograma.

En la primera parte del gráfico se muestran 8192 primitivos. El tiempo de CPU correspondiente por fotograma puede ajustarse a dos sincronizaciones virtuales consecutivas. En la parte posterior del gráfico, esto no es cierto.

Si se busca en XPerf, la CPU está inactiva durante el tiempo más largo, con aproximadamente el 25 % del tiempo de CPU dedicado a la aplicación de realización de geometría.

Captura de pantalla de gpuview.

Resumen

Tanto GPUView como XPerf y herramientas eficaces para analizar el rendimiento de las aplicaciones de DirectX. Este artículo es un manual para usar estas herramientas y comprender las medidas básicas de rendimiento y las características de la aplicación. Además de comprender el uso de herramientas, es primero importante comprender la aplicación que se está analizando. Comience con la búsqueda de respuestas a preguntas como cuál es la aplicación que intenta lograr? ¿Qué subprocesos del sistema son más importantes? ¿Qué inconvenientes están dispuestos a hacer? Al analizar seguimientos de rendimiento, empiece por examinar lugares problemáticos obvios. ¿Está enlazada la CPU o la GPU de la aplicación? ¿La aplicación puede presentar cada fotograma? Las herramientas junto con una comprensión de la aplicación pueden proporcionar información muy útil para comprender, encontrar y finalmente resolver problemas de rendimiento.