Solución de problemas
En esta página se enumeran los problemas comunes que interfieren con Azure Remote Rendering y las maneras de resolverlos.
El cliente no se puede conectar al servidor
Asegúrese de que los firewalls (en el dispositivo, dentro de los enrutadores, etc.) no bloqueen los puertos mencionados en los Requisitos del sistema.
Error al cargar modelo
Al cargar un modelo (por ejemplo, a través de un ejemplo de Unity), se produce un error aunque la configuración de blobs sea correcta, es probable que el almacenamiento de blobs no esté vinculado correctamente. La manera de vincular correctamente se explica en el capítulo sobre la vinculación de una cuenta de almacenamiento. Tras una vinculación correcta, los cambios pueden tardar hasta 30 minutos en surtir efecto.
No se puede vincular la cuenta de almacenamiento a la cuenta de ARR
A veces, durante la vinculación de una cuenta de almacenamiento la cuenta de Remote Rendering no aparece en la lista. Para corregir este problema, vaya a la cuenta de ARR en el Azure Portal y seleccione Identidad en el grupo de Configuración de la izquierda. Asegúrese de que estado se estableció Encendido.
No se puede cargar el modelo a través de un token de SAS
Si la aplicación cliente no puede cargar un modelo desde el almacenamiento a través de un token SAS válido, podría deberse a que el nivel de acceso de red pública configurado en el almacenamiento de blobs. Cargar un modelo de ARR desde el token de SAS solo funciona si se ha configurado con la opción "Habilitado desde todas las redes":
Si limitar a los puntos de conexión privados es un requisito, la cuenta de almacenamiento debe estar vinculada y el modelo debe cargarse a través de la ruta de acceso de código que no es de SAS, como se describe aquí.
Error "Disconnected: VideoFormatNotAvailable
"
Compruebe que la GPU admita la descodificación de vídeo de hardware. Consulte Equipo de desarrollo.
Si está trabajando en un equipo portátil con dos GPU, es posible que la GPU que se ejecuta de forma predeterminada no proporcione la funcionalidad de descodificación de vídeo de hardware. Si es así, intente forzar la aplicación para que use la otra GPU. En general, se puede cambiar la GPU usada en la configuración del controlador de GPU.
Error al recuperar el estado de la sesión o conversión
El envío de comandos de la API de REST con demasiada frecuencia hace que el servidor limite y devuelva un error finalmente. El código de estado HTTP en caso de limitación es 429 ("demasiadas solicitudes"). Como regla general, debería haber un retraso de entre 5 y 10 segundos entre las llamadas subsiguientes.
Tenga en cuenta que este límite no solo afecta a las llamadas a API REST cuando se realizan directamente, sino también a sus homólogos de C#/C++, como Session.GetPropertiesAsync
, Session.RenewAsync
o Frontend.GetAssetConversionStatusAsync
. Algunas funciones también devuelven información cuando se guardan para intentarse de nuevo. Por ejemplo, RenderingSessionPropertiesResult.MinimumRetryDelay
especifica cuántos segundos hay que esperar antes de intentar otra comprobación. Cuando está disponible, es mejor usar este valor devuelto, ya que permite realizar comprobaciones con la mayor frecuencia posible, sin limitaciones.
Si experimenta una limitación en el lado del servidor, cambie el código para que realice las llamadas con menos frecuencia. El servidor restablecerá el estado de limitación cada minuto, por lo que podrá volver a ejecutar el código después de un minuto.
Códec H265 no disponible
Hay dos razones por las que el servidor puede rechazar la conexión con un error codec not available
.
El códec H265 no está instalado:
En primer lugar, asegúrese de instalar Extensiones de vídeo HEVC como se menciona en la sección Software de los requisitos del sistema.
Si sigue teniendo problemas, asegúrese de que la tarjeta gráfica es compatible con H265 y tiene instalado el controlador gráfico más reciente. Consulte la sección Equipo de desarrollo de los requisitos del sistema para obtener información específica del proveedor.
El códec está instalado, pero no se puede usar:
La razón de este problema es una configuración de seguridad incorrecta en los archivos DLL. Este problema no se manifiesta al intentar ver vídeos codificados con H265. La reinstalación del códec tampoco soluciona el problema. En su lugar, realice los pasos siguientes:
Abra una instancia de PowerShell con derechos de administrador y ejecute el comando:
Get-AppxPackage -Name Microsoft.HEVCVideoExtension*
(Tenga en cuenta que el carácter "*" se debe a que, para algunas versiones de instalación de paquetes, el nombre es
HEVCVideoExtensions
en lugar deHEVCVideoExtension
). Ese comando debería generar el objetoInstallLocation
del códec, similar al siguiente:InstallLocation : C:\Program Files\WindowsApps\Microsoft.HEVCVideoExtension_1.0.23254.0_x64__5wasdgertewe
Abra esa carpeta en el Explorador de Windows.
Debería contener las subcarpetas x86 y x64. Haga clic con el botón derecho en una de las carpetas y elija Propiedades.
- Seleccione la pestaña Seguridad y, después, seleccione el botón Opciones avanzadas.
- Seleccione Cambiar en Propietario.
- Escriba Administradores en el campo de texto.
- Seleccione Comprobar nombres y luego en Aceptar.
Repita los pasos anteriores para la otra carpeta.
Repita también los pasos anteriores en cada archivo DLL de ambas carpetas. Debe haber cuatro archivos DLL en total.
Para comprobar que la configuración ahora es correcta, siga estos pasos con cada archivo DLL:
- Seleccione Propiedades > Seguridad > Editar
- Recorra la lista de todos los Grupos/Usuarios y asegúrese de que cada uno tenga el derecho Lectura y ejecución establecido (deben tener la marca de verificación en la columna Permitir)
Calidad de vídeo baja
La calidad de vídeo puede verse afectada por la calidad de la red o la falta del códec de vídeo H265.
- Consulte los pasos para identificar problemas de red.
- Consulte los requisitos del sistema para instalar el controlador de gráficos más reciente.
El vídeo grabado con MRC no refleja la calidad de la experiencia en directo
Se puede grabar un vídeo en HoloLens a través de Captura de realidad mixta (MRC). Sin embargo, el vídeo resultante tiene una calidad peor que la experiencia en directo por dos motivos:
- La velocidad de fotogramas de vídeo se limita a 30 Hz en lugar de 60 Hz.
- Las imágenes de vídeo no se someten al paso de procesamiento de reproyección de la fase final, por lo que el vídeo parece más entrecortado.
Ambas limitaciones son inherentes de la técnica de grabación.
Pantalla negra tras cargar el modelo correctamente
Si está conectado al entorno de ejecución de representación y ha cargado un modelo correctamente, pero después solo ve una pantalla negra después, puede deberse a distintas causas.
Se recomienda realizar las comprobaciones siguientes antes de realizar un análisis más exhaustivo:
- ¿El códec H265 está instalado? Aunque debería haber una reserva para el códec H264, hemos detectado casos en los que esta reserva no funcionó correctamente. Consulte los requisitos del sistema para instalar el controlador de gráficos más reciente.
- Al usar un proyecto de Unity, cierre Unity, elimine las carpetas temporales library y obj del directorio del proyecto, y cargue o cree el proyecto de nuevo. En algunos casos, los datos almacenados en caché provocaron el fracaso del ejemplo sin ningún motivo aparente.
Si estos dos pasos no ayudan, debe averiguar si el cliente recibe fotogramas de vídeo. La consulta se puede realizar mediante programación, como se explica en el capítulo Consultas de rendimiento del lado del servidor. El objeto FrameStatistics struct
tiene un miembro que indica el número de fotogramas de vídeo que se han recibido. Si este número es mayor que 0 y aumenta con el tiempo, el cliente recibe fotogramas de vídeo reales del servidor. Por lo tanto, debe ser un problema en el lado cliente.
El valor de escalado en la configuración de conversión no se aplica al modelo
Si un modelo se muestra en Presentación o Inicio rápido con escalado sin cambios, aunque se aplica un escalado como parte de los parámetros de geometría de la configuración de conversión, es probable que esto se deba a la característica integrada de escalado automático del ejemplo. Es decir, la muestra escala el modelo para que se ajuste mejor al frustum de la vista, independientemente de su escalado de entrada.
En el caso de Presentación, el escalado automático se puede deshabilitar especificando un MaxSize
de cero en la sección del modelo Transform
dentro del archivo models.xml. Este enfoque controlado por datos requiere que el modelo se cargue a través del XML en primer lugar, ya que en todos los demás casos, el MaxSize
tiene como valor predeterminado 1 medidor. También hay una propiedad MinSize
que tiene como valor predeterminado 0,5 metros, lo que hace que todos los modelos más pequeños se escalen verticalmente.
Para obtener más información sobre las formas de cargar modelos en Presentación, vea el capítuloAdición de recursos de modelos 3D a la presentación de ARR de la documentación de presentación.
Problemas comunes del lado cliente
El modelo supera los límites de la VM seleccionada, específicamente el número máximo de primitivos:
Vea los límites de tamaño de servidor específicos.
El modelo no está dentro del tronco de la cámara:
En muchos casos, el modelo se muestra correctamente pero se encuentra fuera del tronco de la cámara. Un motivo habitual es que el modelo se ha exportado con una dinamización muy descentrada y el plano de recorte lejano de la cámara lo ha recortado. Ayuda a consultar el cuadro de límite del modelo mediante programación y a visualizar el cuadro con Unity como un cuadro de línea o imprimir sus valores en el registro de depuración.
Además, el proceso de conversión genera un archivo JSON de salida junto con el modelo convertido. Para depurar los problemas de posicionamiento de modelos, vale la pena examinar la entrada boundingBox
de la sección outputStatistics:
{
...
"outputStatistics": {
...
"boundingBox": {
"min": [
-43.52,
-61.775,
-79.6416
],
"max": [
43.52,
61.775,
79.6416
]
}
}
}
El cuadro de límite se describe como una posición min
y max
en el espacio 3D, en metros. Por lo tanto, una coordenada de 1000,0 significa que está a 1 kilómetro del origen.
Puede haber dos problemas con este cuadro de límite que den lugar a una geometría invisible:
- El cuadro puede estar muy alejado del centro, de modo que el objeto se recorte por completo debido al recorte del plano lejano. En este caso, los valores
boundingBox
tendrían el siguiente aspecto:min = [-2000, -5,-5], max = [-1990, 5,5]
, con un gran desplazamiento en el eje x como ejemplo aquí. Para resolver este tipo de problema, habilite la opciónrecenterToOrigin
en Configuración de la conversión de modelos. - El cuadro puede centrarse, pero los órdenes de magnitud ser demasiado grandes. Esto significa que, aunque la cámara se inicie en el centro del modelo, su geometría se recorta en todas las direcciones. En este caso, los valores de
boundingBox
típicos tendrían el siguiente aspecto:min = [-1000,-1000,-1000], max = [1000,1000,1000]
. El motivo de este tipo de problema suele ser una discrepancia en la escala de unidades. Para compensarla, especifique un valor de escalado durante la conversión o marque el modelo de origen con las unidades correctas. El escalado también se puede aplicar al nodo raíz al cargar el modelo en tiempo de ejecución.
La canalización de representación de Unity no incluye los enlaces de representación:
Azure Remote Rendering se enlaza a la canalización de representación de Unity para realizar la composición de fotogramas con el vídeo y para volver a proyectarla. Para comprobar que estos enlaces existen, abra el menú Window > Analysis > Frame debugger. Habilite esta opción y asegúrese de que existen dos entradas de HolographicRemotingCallbackPass
en la canalización:
Para corregirlo, asegúrese de que se usa el recurso HybridRenderingPipeline proporcionado:
.. como se describe con más detalle en la Canalizaciones de representación de Unity.
El patrón de tablero de damas se representa después de cargar el modelo
Si la imagen representada tiene este aspecto:
A continuación, el representador alcanza los límites del polígono para el tamaño de configuración estándar. Para mitigarlo, cambie al tamaño de configuración prémium o reduzca el número de polígonos visibles.
La imagen representada en Unity está al revés
Asegúrese de seguir el tutorial de Unity: Ver modelos remotos exactamente. Una imagen al revés indica que Unity debe crear un destino de representación fuera de la pantalla. Este comportamiento no se admite en la actualidad y ocasiona un gran impacto en el rendimiento de HoloLens 2.
Los motivos de este problema podrían ser MSAA, HDR o la habilitación del procesamiento posterior. Asegúrese de que el perfil de baja calidad esté seleccionado y establecido como predeterminado en Unity. Para ello, vaya a Editar > Configuración del proyecto... > Calidad.
Cuando se usa el complemento OpenXR en Unity 2020, hay versiones de la URP (Canalización de representación universal) que crean este destino de representación fuera de la pantalla adicional, independientemente de que se habilite el procesamiento posterior. Por consiguiente, es importante actualizar la versión de la URP manualmente como mínimo a la 10.5.1. Este proceso de actualización se describe en los requisitos del sistema.
El código de Unity que usa la API de Remote Rendering no se compila
Uso de Depurar al compilar para el Editor de Unity
Cambie el tipo de compilación de la solución Unity a Depuración. Al probar ARR en el editor de Unity, el objeto UNITY_EDITOR
de definición solo está disponible en las compilaciones de tipo "Depuración". Esta configuración no está relacionada con el tipo de compilación usado para aplicaciones implementadas, donde debe preferir compilaciones de "Versión".
Errores de compilación al compilar ejemplos de Unity para HoloLens 2
Detectamos errores falsos al intentar compilar ejemplos de Unity (inicio rápido, ShowCaseApp, etc.) para HoloLens 2. Visual Studio notifica que no puede copiar algunos archivos, aunque están ahí. Si ve este problema:
- Quite todos los archivos temporales de Unity del proyecto y vuelva a intentarlo. Es decir, cierre Unity, elimine la biblioteca y carpetas obj temporales del directorio del proyecto, y cargue o cree el proyecto de nuevo.
- Asegúrese de que los proyectos se encuentran en un directorio en el disco con una ruta de acceso razonablemente corta, ya que el paso de copia a veces parece tener problemas con nombres de archivo largos.
- Si eso no ayuda, podría deberse a que MS Sense interfiere con el paso de copia. Para configurar una excepción, ejecute este comando del Registro desde la línea de comandos (requiere derechos de administrador):
reg.exe ADD "HKLM\SOFTWARE\Policies\Microsoft\Windows Advanced Threat Protection" /v groupIds /t REG_SZ /d "Unity"
Se producen errores en las compilaciones Arm64 para proyectos de Unity porque falta AudioPluginMsHRTF.dll
AudioPluginMsHRTF.dll
para Arm64 se agregó al paquete de Windows Mixed Reality (com.unity.xr.windowsmr.metro) en la versión 3.0.1. Asegúrese de que tiene instalada la versión 3.0.1 o una versión posterior a través del administrador de paquetes de Unity. En la barra de menús de Unity, vaya a Ventana > Administrador de paquetes y busque el paquete Windows Mixed Reality.
El complemento Cinemachine
de Unity no funciona en modo de posición remota
En el modo de posición remota, el código de enlace de Unity de ARR crea implícitamente una cámara de proxy que realiza la representación real. En este caso, la máscara de selección de la cámara principal se establece en 0 ("nothing") para desactivar eficazmente la representación para ella. Sin embargo, algunos complementos de terceros (como Cinemachine
) que controlan la cámara, pueden depender de al menos algunos bits de capa que se establecen.
Para ello, el código de enlace permite cambiar mediante programación la máscara de bits de la capa para la cámara principal. Concretamente, se requieren los pasos siguientes:
- Cree una nueva capa en Unity que no se use para representar ninguna geometría de escena local. En este ejemplo, supongamos que la capa se denomina "Cam".
- Pase esta máscara de bits a ARR para que ARR la establezca en la cámara principal:
RemoteManagerUnity.CameraCullingMask = LayerMask.GetMask("Cam");
- Configure las propiedades de
Cinemachine
para usar esta nueva capa:
El modo de posición local no se ve afectado por este problema, ya que, en este caso, el enlace de ARR no redirige la representación a una cámara proxy interna.
Una aplicación basada en C++ nativo no se compila
Error "Library not found" (No se encuentra la biblioteca) en la aplicación para UWP o DLL de UWP
Dentro del paquete NuGet de C++, hay un archivo microsoft.azure.remoterendering.Cpp.targets
que define qué tipo binario se va a usar. Para identificar UWP
, las condiciones del archivo comprueban ApplicationType == 'Windows Store'
. Por lo tanto, debe asegurarse de que este tipo esté establecido en el proyecto. Eso sucedería al crear una aplicación o DLL de UWP a través del asistente para proyectos de Visual Studio.
Hologramas inestables
En caso de que parezca que los objetos representados se mueven con movimientos de cabeza, es posible que experimente problemas de reproyección de fases con demora (LSR). Consulte la sección sobre la reproyección de fases con demora para obtener instrucciones sobre cómo enfocar esta situación.
Otra causa de los hologramas inestables (hologramas con tambaleo, deformación, vibración o saltos) puede ser una conectividad de red deficiente, en particular, un ancho de banda de red insuficiente o una latencia demasiado alta. Un buen indicador de la calidad de la conexión de red es el valor de estadísticas de rendimientoServiceStatistics.VideoFramesReused
. Los fotogramas reutilizados indican situaciones en las que un fotograma de vídeo antiguo necesitaba reutilizarse en el lado cliente porque no había ningún nuevo fotograma de vídeo disponible (por ejemplo, debido a la pérdida de paquetes o a variaciones en la latencia de red). Si ServiceStatistics.VideoFramesReused
suele ser mayor que cero, significa que hay un problema de red.
Otro valor que se debe examinar es ServiceStatistics.LatencyPoseToReceiveAvg
. Debe estar siempre por debajo de 100 ms. Si se ven valores más altos, podría significar que está conectado a un centro de datos que está demasiado lejos.
Para obtener una lista de posibles mitigaciones, consulte las instrucciones sobre la conectividad de red.
El contenido local (UI, ...) en HoloLens 2 se representa significativamente con más artefactos de distorsión que sin ARR.
Este artefacto se debe a una configuración predeterminada que equilibra entre la calidad de la proyección de contenido local y el rendimiento en tiempo de ejecución. Consulte el capítulo sobre los Modos de posición de reproyección para ver cómo se puede cambiar el modo de proyección para que el contenido local se represente en el mismo nivel de calidad de reproyección que sin ARR.
Z-fighting
Si bien ARR ofrece la funcionalidad de mitigación de Z-fighting, Z-fighting todavía puede mostrarse en la escena. Esta guía pretende solucionar estos problemas restantes.
Pasos recomendados
Use el siguiente flujo de trabajo para mitigar Z-fighting:
Pruebe la escena con la configuración predeterminada de ARR (mitigación de Z-fighting activada).
Deshabilite la mitigación de Z-fighting mediante su API.
Cambie el plano de cámara de cera y lejos a un intervalo más cercano.
Solucione los problemas de escena mediante la sección siguiente.
Investigación del Z-fighting restante
Si se han agotado los pasos anteriores y el Z-fighting restante es inaceptable, es necesario investigar la causa subyacente del Z-fighting. Como se indica en la página de la característica de mitigación de Z-fighting, hay dos razones principales para el Z-fighting: la pérdida de precisión de profundidad en el extremo del rango de profundidad y las superficies que forman una intersección siendo coplanarias. La pérdida de precisión de profundidad es una eventualidad matemática y solo puede mitigarse siguiendo el paso 3 anterior. Las superficies coplanarias indican un defecto del recurso de origen y se corrigen mejor en los datos de origen.
ARR tiene una característica para determinar si las superficies podrían luchar z: Resaltado de tablero de verificación. También puede determinar visualmente lo que provoca el Z-fighting. En la primera animación que hay a continuación se muestra un ejemplo de pérdida de precisión de profundidad en la distancia y en la segunda, un ejemplo de superficies prácticamente coplanarias:
Compare estos ejemplos con z-fighting para determinar la causa principal o, opcionalmente, siga este flujo de trabajo paso a paso:
- Coloque la cámara sobre las superficies de Z-fighting para mirar directamente la superficie.
- Mueva lentamente la cámara hacia atrás, alejándose de las superficies.
- Si el Z-fighting es visible todo el tiempo, las superficies son perfectamente coplanarias.
- Si el Z-fighting es visible la mayor parte del tiempo, las superficies son prácticamente coplanarias.
- Si el Z-fighting solo es visible desde lejos, la causa es la falta de precisión de profundidad.
Las superficies coplanarias pueden tener varias causas:
La aplicación de exportación duplicó un objeto debido a un error o a distintos enfoques de flujo de trabajo.
Compruebe estos problemas con la aplicación correspondiente y el soporte técnico de la aplicación.
Las superficies se duplican y se voltean para que aparezcan dos caras en los representadores que usan la selección frontal o posterior.
La importación mediante la conversión del modelo determina la lateralidad principal del modelo. Se presupone que el valor predeterminado es la bilateralidad. La superficie se representa como una pared delgada con iluminación físicamente correcta desde ambos lados. La unilateralidad puede estar implícita en el recurso de origen o bien puede aplicarse de forma explícita en la conversión del modelo. Además, pero opcionalmente, el modo unilateral se puede establecer en "normal".
Los objetos forman una intersección en los recursos de origen.
Los objetos transformados de forma que algunas de sus superficies se superpongan también crean Z-fighting. Las partes de transformación del árbol de la escena en la escena importada de ARR también pueden ocasionar este problema.
Las superficies se han creado de forma intencionada para tocarse, como las marcas o el texto en las paredes.
Artefactos gráficos que usan la representación estéreo de múltiples pasadas en aplicaciones de C++ nativas
En algunos casos, las aplicaciones de C++ nativas personalizadas que usan un modo de representación estéreo de varias pasadas para el contenido local (que se representan en el ojo izquierdo y derecho en pasadas independientes), después de llamar a BlitRemoteFrame, pueden desencadenar un error de controlador. El error provoca problemas de rasterización no deterministas, lo que provoca que triángulos individuales o partes de los triángulos del contenido local desaparezcan de forma aleatoria. Por motivos de rendimiento, se recomienda representar el contenido local con una técnica de representación estéreo de pasada única más moderno, por ejemplo, con SV_RenderTargetArrayIndex.
Errores de descarga del archivo de conversión
El servicio de conversión puede detectar errores al descargar archivos de Blob Storage debido a las limitaciones del sistema de archivos. A continuación se indican casos de error específicos. Puede encontrar información completa sobre las limitaciones del sistema de archivos de Windows en la documentación Asignar nombres a archivos, rutas de acceso y espacios de nombres.
Rutas de acceso y nombres de archivo en conflicto
En Blob Storage, es posible crear un archivo y una carpeta con el mismo nombre que otras entradas del mismo nivel. El sistema de archivos de Windows no lo permite. En consecuencia, el servicio emite un error de descarga en ese caso.
Longitud de la ruta de acceso
Hay límites de longitud de rutas de acceso impuestos por Windows y el servicio. Las rutas de acceso de archivo y los nombres de archivo de Blob Storage no deben superar los 178 caracteres. Por ejemplo, dado un blobPrefix
de models/Assets
que tiene 13 caracteres:
models/Assets/<any file or folder path greater than 164 characters will fail the conversion>
El servicio de conversión descarga todos los archivos especificados en el blobPrefix
, no solo los archivos usados en la conversión. Los archivos o carpetas que causan problemas pueden ser menos obvios en estos casos, por lo que es importante comprobar todo lo contenido en la cuenta de almacenamiento en blobPrefix
. Consulte las entradas de ejemplo siguientes para ver lo que se descarga.
{
"settings": {
"inputLocation": {
"storageContainerUri": "https://contosostorage01.blob.core.windows.net/arrInput",
"blobPrefix": "models/Assets",
"relativeInputAssetPath": "myAsset.fbx"
...
}
}
}
models
├───Assets
│ │ myAsset.fbx <- Asset
│ │
│ └───Textures
│ | myTexture.png <- Used in conversion
│ |
| └───MyFiles
| myOtherFile.txt <- File also downloaded under blobPrefix
|
└───OtherFiles
myReallyLongFileName.txt <- Ignores files not under blobPrefix
HoloLens2 "Hacer una foto" (MRC) no muestra ningún contenido local o remoto
Este problema suele producirse si un proyecto se actualiza de WMR a OpenXR y el proyecto ha accedido a la configuración de la clase HolographicViewConfiguration (Windows.Graphics.Holographic). Esta API no se admite en OpenXR y no se debe tener acceso a ella.