Ir al contenido

Laboratorios

Cada mejora se prueba antes de adoptarla: una hipótesis, una configuración base, una candidata y mediciones repetidas.

  1. Abre un laboratorio con un título y una hipótesis. Si quieres, indica el perfil y el override de la base y de la candidata.

    Ventana de terminal
    ./gpuvm.ps1 lab-new -Title 'Más hilos' -Hypothesis '10 hilos suben los FPS sin afectar al host' `
    -BaselineProfile max-performance -CandidateProfile max-performance `
    -CandidateOverride @{ vm = @{ cpu = @{ count = 10 } } }
  2. Mide la base varias veces. Antes de cada medición puedes ejecutar guest/collect-info.ps1 dentro de la VM: guarda el estado de la GPU, del CPU y del plan de energía, y un dxdiag.

    Ventana de terminal
    ./gpuvm.ps1 lab-add -Lab 002 -Variant baseline -Metric 'Time Spy GPU' -Value 10210 -Unit pts
  3. Aplica la candidata y vuelve a medir con -Variant candidate. Usa -LowerIsBetter para métricas como la latencia, y -Notes para observaciones.

    Ventana de terminal
    ./gpuvm.ps1 lab-add -Lab 002 -Variant candidate -Metric 'Time Spy GPU' -Value 10480 -Unit pts
  4. Compara: promedios por métrica y la diferencia en %.

    Ventana de terminal
    ./gpuvm.ps1 lab -Lab 002
  5. Ciérralo como adopted, rejected o inconclusive con una conclusión. Si se adopta, lleva la configuración candidata al perfil que corresponda en profiles/.

    Ventana de terminal
    ./gpuvm.ps1 lab-close -Lab 002 -Status adopted -Conclusion '+2,6 % en GPU; se pasa a max-performance'

-Lab acepta el número del laboratorio (el inicio del nombre de su carpeta). ./gpuvm.ps1 lab sin -Lab lista todos los laboratorios con su estado y su cantidad de resultados.

Cada laboratorio es una carpeta labs/NNN-nombre/ con lab.json (hipótesis, variantes, resultados y conclusión) y notes.md (procedimiento y observaciones). Desde el repositorio están en labs/; con la app instalada van a %ProgramData%\GpuVM\labs. La variable de entorno GPUVM_LABS_ROOT los lleva a otra carpeta.

Los laboratorios 001 a 007 están abiertos; el 008 y el 009 se adoptaron.

# Laboratorio Hipótesis Candidata
001 Selección de GPU en Windows 10 Con dos GPU particionables (una RTX 4060 y una UHD 730 integrada), Windows 10 podría darle a la VM la integrada; desactivar la UHD 730 antes de encender la VM garantiza que reciba la RTX 4060. Mismo perfil (balanced); paso manual.
002 Streaming con Sunshine y pantalla virtual Con la pantalla virtual como única pantalla (video de Hyper-V desactivado), Sunshine captura lo que dibuja la GPU y codifica con NVENC; Moonlight muestra la VM a 1080p60 con latencia baja. Mismo perfil (balanced).
003 Audio en la VM La generación 2 no tiene tarjeta de sonido; sin un dispositivo de audio virtual, Sunshine transmite video sin sonido. Un driver de audio virtual lo resuelve. Mismo perfil (balanced).
004 Latencia en Moonlight Sin V-Sync en Moonlight la latencia total baja alrededor de un cuadro (~16 ms a 60 FPS) sin tirones visibles. streaming.client: vsync: false, performanceOverlay: true
005 Bitrate y codec El tráfico entre host y VM no sale a la red física: 60 Mbps y HEVC mejoran la nitidez sin sumar latencia de codificación y decodificación. streaming.client: codec: HEVC, bitrateKbps: 60000
006 Reserva de CPU En un host con Windows 10/11 el hipervisor usa el planificador root, donde la reserva y el peso por VM no hacen nada; solo importa la cantidad de procesadores virtuales. 6 hilos le dejan al host más margen que 8 con los mismos FPS en juegos. vm.cpu.count: 6
007 NVENC en Sunshine Los valores por defecto de Sunshine ya son preset 1, two-pass a cuarto de resolución y latencia antes que consumo. Una sola pasada, sin aumento de VBV y sin codificación dividida deberían bajar aún más el tiempo de codificación a 1080p. streaming.sunshine: nvenc_twopass: disabled, nvenc_vbv_increase: 0, nvenc_split_encode: disabled
008 Tiempo de arranque del stream Con la pantalla de Hyper-V apagada, la configuración de pantalla por sesión de Sunshine (ensure_only_display) solo agrega trabajo: cada cambio lo obliga a volver a probar todos los codificadores antes del primer cuadro. Desactivarla reduce el tiempo hasta el primer cuadro. streaming.sunshine: dd_configuration_option: disabled
009 Captura de juegos en pantalla completa exclusiva Desktop duplication (ddx) no recibe cuadros nuevos de la pantalla virtual mientras un juego está en pantalla completa exclusiva, así que el stream queda en negro. Windows.Graphics.Capture (wgc), con Sunshine en la sesión del usuario, sí lo captura. streaming.sunshine: capture: wgc
010 Aislamiento de red ACLs en el puerto del switch virtual de la VM, aplicadas por el equipo, mantienen a la VM lejos del equipo y de la red local sin quitarle internet, DHCP ni DNS; reglas con estado dejan pasar las conexiones de Moonlight. vm.network.isolation: true
011 Audio sin Steam: VB-CABLE Sunshine captura la salida de VB-CABLE (estéreo o 16 canales) y lleva el sonido de la VM sin Steam Streaming Speakers. streaming.audio: vbcable
012 Audio con un altavoz USB propio Un dispositivo de audio USB servido por GpuVM dentro de la VM y conectado con usbip-win2 lo maneja el driver de Windows, así que Sunshine captura sonido real. streaming.audio: usb

Los laboratorios 004 a 012 usan max-performance en las dos variantes.

Lo que encontraron los laboratorios hasta ahora

Sección titulada «Lo que encontraron los laboratorios hasta ahora»
  • 002: en la primera prueba real (VM con Windows 10 22H2) Sunshine se instaló, se emparejó solo y detectó NVENC, pero Moonlight quedó en negro: Sunshine capturaba la pantalla de Hyper-V en lugar de la virtual. La solución (poner output_name en la pantalla virtual y dd_configuration_option = ensure_only_display) ahora se aplica sola en cada Encender y abrir. Pendiente: Sunshine dice “Display device configuration API is temporarily unavailable” y no cambia la resolución.
  • 003: se eligió VB-CABLE Pack45 frente al Virtual Audio Driver del proyecto VDD (beta, exige test signing), Scream (exige Secure Boot apagado) y Steam Streaming Speakers (obliga a instalar Steam y no tiene versión fija). Se reemplazó por el altavoz USB propio de GpuVM después de que el laboratorio 011 mostró que VB-CABLE le llega mudo a Sunshine dentro de una VM; consulta Audio.
  • 004: medido con el medidor de punta a punta de tools/latency (1080p, 60 FPS, 40 pulsaciones en la VM win10). Mediana de 38,9 ms con V-Sync frente a 33,8 ms sin V-Sync: unos 5 ms menos, menos de un cuadro, y el p95 baja a la mitad (231,5 → 122 ms). Parte del p95 y de las muestras perdidas vienen del propio medidor. Con V-Sync, el overlay de Moonlight mostró 57,12 FPS recibidos, 1 ms de red y 0,32 ms de decodificación. 120 y 144 FPS todavía no se miden de forma confiable: el stream quedó en negro porque la frecuencia cambió con la sesión anterior de Sunshine todavía abierta; las herramientas ahora la cierran entre variantes. Sigue abierto.
  • 006: se rehízo. El host informa el planificador root (Hypervisor scheduler type is 0x4), y Microsoft documenta que los límites, pesos y reservas solo aplican con el planificador clásico o el core, así que comparar 30 % con 100 % de reserva no podía mostrar diferencia. Ahora compara 8 con 6 procesadores virtuales. Todavía sin resultados.
  • 007: se rehízo. La primera candidata (preset 1, quarter_res, latencia antes que consumo) era igual a los valores por defecto de Sunshine. La nueva apaga el two-pass, el aumento de VBV y la codificación dividida. Todavía sin resultados.
  • 008 (adoptado): abrir sin cambiar resolución ni FPS pasó de 22–27 s hasta el primer cuadro (26,8 s medidos) a 2,1 s. Cambiar de modo todavía cuesta 10–15 s (13,3 s para 120 FPS después de 60). Con ensure_only_display, el log de Sunshine mostraba “Encoder reenumeration is required” en cada sesión. connect ahora pone dd_configuration_option = disabled cuando GpuVM ya apagó la pantalla de Hyper-V. Consulta Streaming.
  • 009 (adoptado): Un juego en pantalla completa exclusiva a 800×600 se veía en negro con ddx (Sunshine no recibía cuadros nuevos y reenviaba el último) y se veía con wgc. Se adoptó como opción por VM, apagada por defecto (Opciones → Captura): wgc no muestra los avisos de administrador de Windows (escritorio seguro). Sin cambio de seguridad: con wgc Sunshine corre como el usuario que inició sesión (elevado) en vez de SYSTEM. Consulta Modos de captura.
  • 010 (adoptado): con las reglas, desde la VM no se alcanzó ningún puerto TCP del equipo (antes 4) ni ninguna prueba al router (antes 3), ni por IPv4 ni por IPv6; internet, DNS, DHCP y Sunshine siguieron funcionando y el tiempo de conexión no cambió (0,35 ms). Activado por defecto (Opciones → Red).
  • 011 (rechazado): las dos salidas de VB-CABLE le llegan a Sunshine como silencio digital dentro de la VM mientras el medidor de Windows muestra sonido; Moonlight no recibió nada. El sonido que parecía funcionar venía de Steam Streaming Speakers (0,265 en Moonlight).
  • 012 (adoptado): el altavoz de GpuVM, Altavoces (GpuVM Audio), se capturó al mismo nivel que el medidor de Windows (0,356) y llegó a Moonlight a 0,351, más que el 0,265 de Steam, sin errores de transferencia. Los drivers de usbip-win2 están firmados por Microsoft y no agrega certificados. Consulta Audio.