Detección de hardware y configuración del sistema

Un servicio por capas que captura un snapshot de hardware y SO en el arranque y lo expone a calidad adaptativa, analíticas e informes de errores.

Para qué sirve este sistema

Todo juego que se publique necesita saber en qué está corriendo. El modelo de GPU, el presupuesto de VRAM, la RAM del sistema, las pantallas conectadas con sus frecuencias de refresco, el idioma, la zona horaria y el soporte de ray tracing son datos que condicionan los presets de calidad, los eventos de analíticas y los informes de fallos. Recopilarlos de forma fiable y coherente es código repetitivo que cada proyecto reinventa.

El módulo de System Configuration de Serenity lo resuelve una sola vez. Captura un snapshot estructurado durante la pipeline de inicialización, lo mantiene en memoria durante toda la sesión y lo expone a través de interfaces tipadas que el resto del framework ya sabe cómo consumir.

El problema en Unity

Unity expone la información de hardware a través de APIs estáticas dispersas — SystemInfo, Screen, Display y QualitySettings — distribuidas en varios namespaces sin una estructura acordada. Cada proyecto acaba con una clase de utilidad diferente, un conjunto diferente de campos y un momento distinto para realizar la recopilación. Cuando llega un informe de fallo, el contexto de hardware está incompleto o directamente ausente. Cuando la calidad adaptativa necesita saber cuánta VRAM hay disponible, accede a SystemInfo directamente y se acopla a la API de Unity.

Sin un módulo dedicado, la detección de hardware se duplica, es incoherente y no se puede testear. Los campos se recopilan en el momento equivocado, el idioma se lee de forma diferente en distintas partes del código y los cambios de resolución durante una sesión pasan desapercibidos hasta el siguiente reinicio.

Cómo lo aborda Serenity

Serenity expone la configuración del sistema a través de ISystemConfigurationService, que combina ISystemConfigurationProvider para leer el snapshot e ISystemConfigurationSnapshotStore para persistirlo. El snapshot en sí está descrito por ISystemConfigurationSnapshot, una interfaz estructurada que cubre GpuName, GpuMemoryMB, SystemMemoryMB, SupportsRayTracing, SupportsComputeShaders, PrimaryDisplayWidth, PrimaryDisplayHeight, PrimaryDisplayRefreshRate, un array Displays de entradas DisplayInfo, Language, CultureName, RegionDisplayName, TimeZoneId, OperatingSystem, DeviceModel y la marca de tiempo UTC CollectedAtUtc.

Los cambios de resolución en tiempo de ejecución los gestiona IResolutionChangeDetector, que almacena un estado de referencia e informa de cambios significativos mediante HasMeaningfulChange. Los ajustes se controlan a través de ISystemConfigurationSettings, cubriendo cuándo recopilar (arranque, cambio de foco, cambio de resolución, polling), qué campos incluir, el modo de detección de ray tracing, la fuente de la frecuencia de refresco, el índice de pantalla principal y la sincronización opcional con Game Settings mediante SnapshotKeyMap.

Cómo encaja en Serenity

System Configuration vive en el namespace Serenity.SystemConfiguration y sigue la estructura por capas de la foundation. La capa de Dominio define DisplayInfo, enums como RayTracingDetectionMode, RefreshRateSourceMode, CultureListSourceMode y PlatformMask, además de value objects como SnapshotKeyMap. La capa de Aplicación posee las interfaces de servicio y snapshot, el snapshot store, el detector de cambios de resolución, el contrato de ajustes y la CollectSystemConfigurationTask que se ejecuta durante la pipeline de inicialización. La capa de Infraestructura proporciona las implementaciones de Unity — UnitySystemConfigurationService, UnitySystemConfigurationSnapshot y UnityResolutionChangeDetector — detrás de las interfaces de aplicación para que puedan reemplazarse sin tocar a los consumidores.

System Configuration coopera con la Initialization Pipeline, que dispara la tarea de recopilación en el arranque antes de que cualquier otro sistema necesite datos de hardware. Coopera con Game Graphics, que lee el snapshot para seleccionar el preset de calidad inicial. Coopera con Game Settings a través del SyncMap, de modo que los valores del snapshot pueden escribirse directamente en claves de ajustes. Coopera con el Event Dispatcher y los servicios de logging para contexto de telemetría e informes de fallos.

Flujo de trabajo práctico

  1. Configura ISystemConfigurationSettings para seleccionar qué campos incluir — hardware, información de pantalla, cultura — y cuándo recopilar.
  2. Establece CollectOnStartup en true para que la pipeline de inicialización ejecute CollectSystemConfigurationTask antes de que arranque cualquier otro sistema.
  3. Activa opcionalmente CollectOnFocusChange y CollectOnResolutionChange para refrescar el snapshot cuando cambie el entorno.
  4. Inyecta ISystemConfigurationService donde la calidad adaptativa, las analíticas o los informes de fallos necesiten contexto de hardware.
  5. Usa IResolutionChangeDetector si algún sistema necesita reaccionar a cambios de pantalla entre snapshots.
  6. Configura SyncMap en ISystemConfigurationSettings para volcar valores del snapshot — VRAM, resolución, frecuencia de refresco — en claves de Game Settings de forma automática.

Qué incluye

  • Interfaz de servicio ISystemConfigurationService que combina provider y snapshot store
  • Snapshot estructurado ISystemConfigurationSnapshot con nombre de GPU, VRAM, RAM, soporte de ray tracing y compute shaders
  • Lista de pantallas mediante DisplayInfo cubriendo ancho, alto, frecuencia de refresco y flag de primaria para cada monitor conectado
  • Campos de idioma y zona horaria Language, CultureName, RegionDisplayName y TimeZoneId en cada snapshot
  • Detección de cambios de resolución mediante IResolutionChangeDetector con CacheCurrent y HasMeaningfulChange
  • Disparadores de recopilación configurables: arranque, cambio de foco, cambio de resolución e intervalo de polling
  • Sincronización con Game Settings mediante SnapshotKeyMap para que los datos de hardware fluyan a claves de ajustes sin puentes manuales
  • Infraestructura de Unity reemplazable detrás de interfaces de dominio para testabilidad y flexibilidad de plataforma

Cuándo usarlo

  • Proyectos que necesitan contexto de hardware fiable para presets de calidad adaptativa desde el primer frame.
  • Juegos que envían analíticas o informes de fallos y necesitan un payload de hardware coherente y estructurado.
  • Proyectos con múltiples salidas de pantalla donde la frecuencia de refresco y la resolución deben seguirse por monitor.
  • Bases de código que quieren idioma y zona horaria capturados en el arranque sin duplicar llamadas a SystemInfo por todo el proyecto.

Sistemas relacionados

Usa Serenity cuando quieras una detección de hardware y SO que se recopile una sola vez en el arranque, se almacene en un snapshot tipado y ya esté conectada a calidad adaptativa y analíticas — sin código repetitivo ni llamadas dispersas a SystemInfo por todo el código.

Volver a la página principal