Compartilhar via


Solucionar problemas

Esta página lista os problemas comuns que interferem no Azure Remote Rendering e maneiras de resolvê-los.

O cliente não pode se conectar ao servidor

Seus firewalls (em dispositivos, roteadores etc.) não podem bloquear as portas mencionadas nos Requisitos do sistema.

Falha ao carregar o modelo

Quando o carregamento de um modelo (por exemplo, por meio de um exemplo do Unity) falha, embora a configuração de blob esteja correta, é provável que o armazenamento de blob não esteja vinculado corretamente. A vinculação apropriada é explicada no capítulo Vinculação de uma conta de armazenamento. Após corrigir a vinculação, pode levar até 30 minutos até que as alterações entrem em vigor.

Às vezes, durante a vinculação de uma conta de armazenamento, a conta do Remote Rendering não é listada. Para corrigir esse problema, vá para a conta do ARR no portal do Azure e selecione Identidade no grupo Configurações à esquerda. Verifique se Status está definido como Ativo. Depurador de quadros do Unity

Não é possível carregar o modelo por meio de um token SAS

Se o aplicativo cliente não conseguir carregar um modelo do armazenamento através de um token SAS válido, isso pode ser causado pelo nível de acesso à rede pública configurado no armazenamento de blobs. Carregar um modelo ARR a partir de um token SAS só funciona se ele tiver sido configurado com a opção "Habilitado de todas as redes": Captura de tela das configurações do portal do Microsoft Azure para o nível de acesso à rede pública no armazenamento de blobs.

Se limitar a pontos de extremidade privados for um requisito, a conta de armazenamento deverá ser vinculada e o modelo deverá ser carregado através do caminho de código não SAS, conforme descrito aqui.

Erro 'Disconnected: VideoFormatNotAvailable'

Verifique se sua GPU é compatível com a decodificação de vídeo por hardware. Confira PC de Desenvolvimento.

Se você estiver trabalhando em um laptop com duas GPUs, é possível que a GPU em que você está executando por padrão não forneça a funcionalidade de decodificação de vídeo por hardware. Se esse for o caso, tente forçar seu aplicativo a usar a outra GPU. A alteração da GPU usada geralmente é possível nas configurações do driver de GPU.

Recuperar falhas de status de sessão/conversão

Enviar comandos de API REST com muita frequência faz com que o servidor limite a taxa de solicitações e, eventualmente, retorne uma falha. Em caso de limitação, o código de status HTTP é 429 ("muitas solicitações"). Como regra geral, deve haver um atraso de 5 a 10 segundos entre as chamadas subsequentes.

Esse limite afeta não só as chamadas diretas à API REST, mas também suas contrapartes em C#/C++, como Session.GetPropertiesAsync, Session.RenewAsync ou Frontend.GetAssetConversionStatusAsync. Algumas funções também retornam informações quando ele é salvo para tentar novamente. Por exemplo, RenderingSessionPropertiesResult.MinimumRetryDelay especifica o número de segundos de espera antes de tentar outra verificação. Quando disponível, o uso de um valor retornado como esse é o melhor, pois permite que você faça verificações o mais frequentemente possível, sem ter sido limitado.

Caso haja uma limitação no lado do servidor, altere o código para fazer as chamadas com menos frequência. O servidor redefine o estado de limitação a cada minuto, então é seguro reexecutar o código após um minuto.

Codec H265 não disponível

Há dois motivos pelos quais o servidor pode se recusar a se conectar com um erro codec not available.

O codec H265 não está instalado:

Primeiro, instale as Extensões de Vídeo HEVC conforme mencionado na seção Software dos requisitos do sistema.

Se você ainda tiver problemas, verifique se a sua placa gráfica dá suporte para H265 e se você tem o driver gráfico mais recente instalado. Confira a seção PC de desenvolvimento dos requisitos do sistema para obter informações específicas do fornecedor.

O codec está instalado, mas não pode ser usado:

O motivo para esse problema é uma configuração de segurança incorreta nas DLLs. Esse problema não se manifesta ao tentar assistir vídeos codificados com H265. A reinstalação do codec também não corrige o problema. Em vez disso, execute as seguintes etapas:

  1. Abra um PowerShell com direitos de administrador e execute

    Get-AppxPackage -Name Microsoft.HEVCVideoExtension*
    

    (Observe que o '*' é porque, para algumas versões de instalação do pacote, o nome é HEVCVideoExtensions diferente de HEVCVideoExtension). Esse comando deve gerar o InstallLocation do codec, algo como:

    InstallLocation   : C:\Program Files\WindowsApps\Microsoft.HEVCVideoExtension_1.0.23254.0_x64__5wasdgertewe
    
  2. Abra essa pasta no Windows Explorer

  3. Deve haver uma subpasta x86 e outra x64. Clique com o botão direito do mouse em uma das pastas e escolha Propriedades

    1. Selecione a guia Segurança e selecione o botão de configurações Avançado
    2. Selecione Alterar para o Proprietário
    3. Digite Administradores no campo de texto
    4. Selecione Verificar Nomes e OK
  4. Repita as etapas acima para a outra pasta

  5. Além disso, repita as etapas acima em cada arquivo DLL dentro de ambas as pastas. Deve haver ao todo quatro DLLs.

Para verificar se agora as configurações estão corretas, siga as seguintes etapas para cada uma das quatro DLLs:

  1. Selecione Propriedades > Segurança > Editar
  2. Percorra a lista de todos os Grupos/Usuários e verifique se cada um deles tem o direito de Leitura e Execução definido (a marca de seleção na coluna Permitir precisa estar marcada)

Qualidade do vídeo baixa

A qualidade do vídeo pode ser comprometida pela qualidade da rede ou pela ausência do codec de vídeo H265.

O vídeo gravado com a MRC não reflete a qualidade da experiência ao vivo

É possível gravar um vídeo no HoloLens com a MRC (Captura de Realidade Misturada). No entanto, o vídeo resultante tem uma qualidade pior do que a experiência ao vivo por dois motivos:

  • A taxa de quadros de vídeo é limitada a 30 Hz em vez de 60 Hz.
  • As imagens de vídeo não passam pela etapa de processamento de reprojeção de fase tardia, portanto, o vídeo tem menos fluidez.

Ambas são limitações inerentes da técnica de gravação.

Tela preta após o carregamento bem-sucedido do modelo

Se você estiver conectado ao runtime de processamento e tiver carregado um modelo com êxito, mas vir apenas uma tela preta posteriormente, isso poderá ser devido a algumas causas distintas.

É recomendável testar as seguintes possibilidades antes de fazer uma análise mais detalhada:

  • O codec H265 está instalado? Embora deva haver um fallback para o codec H264, vimos casos em que esse fallback não funcionou corretamente. Confira os requisitos do sistema para instalar o driver de vídeo mais recente.
  • Ao usar um projeto do Unity, feche o Unity, exclua as pastas temporárias library e obj no diretório do projeto e carregue/compile o projeto novamente. Em alguns casos, os dados armazenados em cache fizeram com que o exemplo não funcionasse corretamente, sem nenhum motivo óbvio para isso.

Se essas duas etapas não ajudarem, será necessário descobrir se os quadros de vídeo são recebidos pelo cliente ou não. Isso pode ser consultado programaticamente, conforme explicado no capítulo Consultas de desempenho do lado do servidor. O FrameStatistics struct tem um membro que indica quantos quadros de vídeo foram recebidos. Se esse número for maior que 0 e estiver aumentando ao longo do tempo, o cliente receberá quadros de vídeo reais do servidor. Portanto, deve ser um problema no lado do cliente.

O valor de escala nas configurações de conversão não é aplicado ao modelo

Se um modelo aparecer na Demonstração ou Início Rápido sem alterações de escala, apesar de uma escala ter sido aplicada como parte dos parâmetros de geometria das configurações de conversão, isso provavelmente se deve ao recurso de dimensionamento automático interno do exemplo. Ou seja, o exemplo ajusta a escala do modelo para o melhor encaixe no campo de visão, independentemente da escala de entrada.

No caso da Demonstração, o dimensionamento automático pode ser desabilitado especificando um MaxSize de zero na seção Transform do modelo dentro do arquivo models.xml. Essa abordagem controlada por dados exige que o modelo seja carregado por meio do XML em primeiro lugar, porque em todos os outros casos o MaxSize tem como padrão 1 metro. Há também uma propriedade MinSize cujo padrão é 0,5 metro, o que faz com que todos os modelos menores sejam ampliados. Para obter mais informações sobre maneiras de carregar modelos na Demonstração, consulte o capítulo Adicionar ativos de modelo 3D à Demonstração ARR da documentação da Demonstração.

Problemas comuns do lado do cliente

O modelo excede os limites da VM selecionada, especificamente o número máximo de primitivos:

Confira os limites de tamanho de servidor específicos.

O modelo não está dentro do volume da câmera:

Em muitos casos, o modelo é exibido corretamente, mas localizado fora do volume da câmera. Um motivo comum é que o modelo foi exportado com um eixo afastado do centro, de modo que ele é recortado pelo plano de recorte distante da câmera. É útil consultar programaticamente a caixa delimitadora do modelo e visualizar a caixa com o Unity como uma caixa de linha ou, ainda, imprimir os valores dela no log de depuração.

Além disso, o processo de conversão gera um arquivo JSON de saída junto com o modelo convertido. Para depurar problemas de posicionamento de modelo, vale a pena examinar a entrada boundingBox na seção outputStatistics:

{
    ...
    "outputStatistics": {
        ...
        "boundingBox": {
            "min": [
                -43.52,
                -61.775,
                -79.6416
            ],
            "max": [
                43.52,
                61.775,
                79.6416
            ]
        }
    }
}

A caixa delimitadora é descrita como uma posição min e max no espaço 3D, em metros. Portanto, uma coordenada de 1000,0 significa que ela está a um quilômetro de distância da origem.

Pode haver dois problemas com essa caixa delimitadora que resultam em uma geometria invisível:

  • A caixa pode ser muito afastada do centro, portanto, o objeto é completamente recortado devido ao recorte de plano distante. Os valores de boundingBox, nesse caso, teriam a seguinte aparência: min = [-2000, -5,-5], max = [-1990, 5,5], usando um deslocamento grande no eixo x como um exemplo aqui. Para resolver esse tipo de problema, habilite a opção recenterToOrigin na configuração de conversão de modelo.
  • A caixa pode estar centralizada, ser grande demais com uma diferença de várias ordens de magnitude. Isso significa que, embora a câmera seja iniciada no centro do modelo, a geometria dele é recortada em todas as direções. Os valores de boundingBox típicos, nesse caso, seriam semelhantes a estes: min = [-1000,-1000,-1000], max = [1000,1000,1000]. O motivo para esse tipo de problema geralmente é uma incompatibilidade de escala de unidade. Para compensar, especifique um valor de dimensionamento durante a conversão ou marque o modelo de origem com as unidades corretas. O dimensionamento também pode ser aplicado ao nó raiz ao carregar o modelo em runtime.

O pipeline de renderização do Unity não inclui os ganchos de renderização:

O Azure Remote Rendering conecta-se ao pipeline de renderização do Unity para fazer a composição do quadro com o vídeo e para fazer a reprojeção. Para verificar se esses ganchos existem, abra o menu Window > Analysis > Frame debugger. Habilite-o e verifique se há duas entradas para o HolographicRemotingCallbackPass no pipeline:

Pipeline de renderização do Unity

Para corrigir, certifique-se de que o ativo HybridRenderingPipeline fornecido esteja sendo usado: Screenshot of the Unity asset browser and Project Settings dialog. The HybridRenderingPipeline asset is highlighted in the asset browser. An arrow points from the asset to the UniversalRenderPipelineAsset field in project settings.

... conforme descrito em mais detalhes em Pipelines de Renderização do Unity.

O padrão quadriculado é renderizado após o carregamento do modelo

Se a imagem renderizada tiver a seguinte aparência: Captura de tela mostrando uma grade de quadrados pretos e brancos com um menu

o renderizador atingirá os limites do polígono para o tamanho da configuração padrão. Para mitigar, alterne para o tamanho de configuração Premium ou reduza o número de polígonos visíveis.

A imagem renderizada no Unity está de cabeça para baixo

Siga o Tutorial do Unity: exibir modelos remotos à risca. Uma imagem de cabeça para baixo indica que é preciso usar o Unity para criar um destino de renderização fora da tela. No momento, esse comportamento é incompatível e impacta muito o desempenho no HoloLens 2.

Os motivos para esse problema podem ser o MSAA, o HDR ou a habilitação do pós-processamento. Verifique se o perfil de baixa qualidade está selecionado e definido como padrão no Unity. Para fazer isso, acesse Editar > Configurações do Projeto… > Qualidade.

Ao usar o plug-in do OpenXR no Unity 2020, há versões do URP (Pipeline de Processamento Universal) que criam esse destino de renderização extra fora da tela, independentemente do pós-processamento estar habilitado. Portanto, é importante atualizar a versão do URP manualmente para pelo menos 10.5.1 (ou superior). Esse processo de atualização é descrito nos requisitos do sistema.

O código do Unity usando a API do Remote Rendering não é compilado

Usar Depurar ao compilar para o Editor do Unity

Alterne o tipo de build da solução do Unity para Depuração. Ao testar ARR no editor do Unity, a definição UNITY_EDITOR só está disponível em builds de 'Depuração'. Essa configuração não está relacionada ao tipo de compilação usado para aplicativos implantados, em que você deve preferir compilações do tipo "Versão".

Falhas de compilação ao compilar amostras do Unity para o HoloLens 2

Percebemos falhas falsas ao tentar compilar exemplos do Unity (início rápido, ShowCaseApp etc.) para o HoloLens 2. O Visual Studio reclama sobre não conseguir copiar alguns arquivos, embora eles estejam lá. Se você encontrar esse problema:

  • Remova todos os arquivos temporários do Unity do projeto e tente novamente. Ou seja, feche o Unity, exclua as pastas temporárias library e obj no diretório do projeto e carregue/compile o projeto novamente.
  • Verifique se os projetos estão localizados em um diretório no disco com caminho razoavelmente curto, pois a etapa de cópia às vezes parece ter problemas com nomes de arquivo longos.
  • Se isso não ajudar, pode ser que o MS Sense interfira na etapa de cópia. Para configurar uma exceção, execute este comando do Registro por meio da linha de comando (requer direitos de administrador):
    reg.exe ADD "HKLM\SOFTWARE\Policies\Microsoft\Windows Advanced Threat Protection" /v groupIds /t REG_SZ /d "Unity"
    

Builds do Arm64 para projetos do Unity falham porque AudioPluginMsHRTF.dll está ausente

O AudioPluginMsHRTF.dll do Arm64 foi adicionado ao pacote (com.unity.xr.windowsmr.metro) do Windows Mixed Reality na versão 3.0.1. Verifique se você tem a versão 3.0.1 ou posterior instalada no Gerenciador de Pacotes do Unity. Na barra de menus do Unity, navegue até Janela > Gerenciador de Pacotes e procure o pacote de Realidade Misturada no Windows.

O plug-in Cinemachine do Unity não funciona no modo de pose remota

No Modo de pose remota, o código de associação do ARR Unity cria implicitamente uma câmera proxy que executa a renderização real. Nesse caso, a máscara de abate da câmera principal é definida como 0 ("nada") para desativar efetivamente a renderização para ela. No entanto, alguns plug-ins de terceiros (como Cinemachine) que orientam a câmera podem depender da definição de pelo menos alguns bits de camada.

Para isso, o código de associação permite que você altere programaticamente a máscara de bits da camada para a câmera principal. Especificamente, as seguintes etapas são exigidas:

  1. Crie uma camada no Unity que não seja usada para renderizar nenhuma geometria de cena local. Neste exemplo, suponha que a camada se chama "Cam".
  2. Passe essa máscara de bits para o ARR para que ele a defina na câmera principal:
    RemoteManagerUnity.CameraCullingMask = LayerMask.GetMask("Cam");
    
  3. Configure as propriedades Cinemachine para usar essa nova camada: Captura de tela mostrando o painel inspetor do Unity para configurações de câmera no Cinemachine.

O modo de pose local não é afetado por esse problema, já que, nesse caso, a associação de ARR não redireciona a renderização para uma câmera proxy interna.

O aplicativo nativo baseado em C++ não é compilado

Erro "biblioteca não encontrada" para o aplicativo UWP ou DLL

Dentro do pacote NuGet do C++, há um arquivo microsoft.azure.remoterendering.Cpp.targets que define qual variante binária deve ser usada. Para identificar UWP, as condições no arquivo, verifique ApplicationType == 'Windows Store'. Portanto, é preciso garantir que esse tipo esteja definido no projeto. Isso deve ocorrer ao criar um aplicativo UWP ou DLL por meio do assistente de projetos do Visual Studio.

Hologramas instáveis

Caso os objetos renderizados pareçam estar se movendo em conjunto com os movimentos de cabeça, você talvez esteja enfrentando problemas com LSR (reprojeção de fase tardia). Veja a seção sobre Reprojeção de fase tardia para obter diretrizes sobre como abordar essa situação.

Outro motivo para hologramas instáveis (com oscilações, distorções, tremulações ou saltos) pode ser uma conectividade de rede ruim, em particular uma largura de banda de rede insuficiente ou uma latência muito alta. Um bom indicador para a qualidade da sua conexão de rede é o valor ServiceStatistics.VideoFramesReused das estatísticas de desempenho. Quadros reutilizados indicam situações em que um quadro de vídeo antigo precisou ser reutilizado no lado do cliente porque nenhum novo quadro de vídeo estava disponível, por exemplo, devido à perda de pacotes ou devido a variações na latência de rede. Se ServiceStatistics.VideoFramesReused é frequentemente maior que zero, isso indica um problema de rede.

Outro valor a ser examinado é ServiceStatistics.LatencyPoseToReceiveAvg. Ele deve estar consistentemente abaixo de 100 ms. Talvez valores mais altos sejam uma indicação de que você está conectado a um data center muito distante.

Para obter uma lista de possíveis mitigações, confira as diretrizes para conectividade de rede.

O conteúdo local (UIs,...) no HoloLens 2 renderiza com significativamente mais artefatos de distorção do que sem o ARR

Esse artefato ocorre devido a uma configuração padrão que aprimora o desempenho do runtime em troca da diminuição da qualidade da projeção de conteúdo local. Consulte o capítulo sobre os modos de pose de reprojeção para ver como o modo de projeção pode ser alterado para que o conteúdo local seja renderizado no mesmo nível de qualidade de reprodução que sem o ARR.

Z-fighting

Embora o ARR ofereça a funcionalidade de mitigação de z-fighting, o z-fighting ainda poderá aparecer na cena. Este guia tem como objetivo solucionar esses problemas restantes.

Siga este fluxo de trabalho para mitigar o z-fighting:

  1. Teste a cena com as configurações padrão de ARR (com o z-fighting ativado).

  2. Desabilite a mitigação de z-fighting por meio da API.

  3. Altere o plano de perto e de longe da câmera para uma faixa mais próxima.

  4. Solucione os problemas da cena de acordo com a próxima seção.

Investigar o z-fighting restante

Se você já seguiu as etapas acima e o z-fighting restante ainda for inadequado, será preciso investigar a causa subjacente desse problema. Conforme mencionado na página do recurso de mitigação de z-fighting, há dois motivos principais para o z-fighting: superfícies coplanares que se interseccionam e perda de precisão de profundidade na extremidade mais distante da faixa de profundidade. A perda de precisão de profundidade é uma eventualidade matemática e só pode ser mitigada seguindo a etapa 3 acima. Superfícies coplanares indicam uma falha no ativo de origem e podem ser corrigidas de modo melhor nos dados de origem.

O ARR tem um recurso para determinar se pode haver z-fighting nas superfícies, o realce de xadrez. Também é possível identificar visualmente o que causa o z-fighting. A primeira animação a seguir mostra um exemplo de perda de precisão de profundidade à distância e a segunda mostra um exemplo de superfícies quase coplanares:

Animação mostra um exemplo de perda de precisão de profundidade à distância. Animação mostra um exemplo de superfícies quase coplanares.

Compare esses exemplos com seu z-fighting para determinar a causa raiz ou, opcionalmente, siga este fluxo de trabalho passo a passo:

  1. Posicione a câmera acima das superfícies de z-fighting para olhar diretamente para a superfície.
  2. Mova lentamente a câmera para trás, afastando-a das superfícies.
  3. Se o z-fighting estiver visível o tempo todo, as superfícies serão perfeitamente coplanares.
  4. Se o z-fighting estiver visível a maior parte do tempo, as superfícies serão quase coplanares.
  5. Se o z-fighting estiver visível somente de longe, a causa será a falta de precisão de profundidade.

Pode haver várias causas para as superfícies coplanares:

  • Um objeto foi duplicado pelo aplicativo de exportação por causa de um erro ou de diferentes abordagens de fluxo de trabalho.

    Verifique esses problemas com o respectivo aplicativo e com o suporte do aplicativo.

  • As superfícies são duplicadas e invertidas para aparecer frente e verso em renderizadores que usam a seleção de frente ou de verso.

    A importação por meio da conversão de modelo determina o lado principal do modelo. A bilateralidade é assumida como o padrão. A superfície é renderizada como uma parede fina com iluminação fisicamente correta de ambos os lados. A unilateralidade pode ser inferida pelos sinalizadores no ativo de origem ou explicitamente forçada durante a conversão do modelo. Além disso, opcionalmente, o modo unilateral pode ser definido como "normal".

  • Objetos interseccionam nos ativos de origem.

    Os objetos transformados de modo que algumas superfícies sobreponham também criam z-fighting. A transformação de partes da árvore de cena na cena importada no ARR também pode criar esse problema.

  • As superfícies são intencionalmente criadas para toque, como decalques ou texto em paredes.

Artefatos gráficos que usam a renderização estéreo de várias passagens em aplicativos C++ nativos

Em alguns casos, os aplicativos C++ nativos e personalizados que usam um modo de renderização estéreo de várias passagens para conteúdo local (renderização para a esquerda e a direita em passagens separadas) depois de chamar BlitRemoteFrame podem disparar um bug de driver. O bug resulta em falhas de rasterização não determinísticas, fazendo com que triângulos individuais ou partes de triângulos do conteúdo local desapareçam aleatoriamente. Por motivos de desempenho, é recomendável renderizar o conteúdo local com uma técnica de renderização estéreo de passagem única mais moderna, por exemplo, usando SV_RenderTargetArrayIndex.

Erros de download do arquivo de conversão

O serviço Conversão pode encontrar erros ao baixar arquivos do armazenamento de blobs devido a limitações do sistema de arquivos. Os casos de falha específicos são listados abaixo. Informações abrangentes sobre limitações do sistema de arquivos do Windows podem ser encontradas na documentação Nomeação de arquivos, caminhos e namespaces.

Caminho de colisão e nome do arquivo

No armazenamento de blobs, é possível criar um arquivo e uma pasta com exatamente o mesmo nome que as entradas irmãs. O sistema de arquivos do Windows não permite isso. Dessa forma, o serviço emite um erro de download nesse caso.

Comprimento do caminho

Há limites de comprimento de caminho impostos pelo Windows e o serviço. Os caminhos e os nomes de arquivo no armazenamento de blob não devem exceder 178 caracteres. Por exemplo, dado um blobPrefix de models/Assets que tem 13 caracteres:

models/Assets/<any file or folder path greater than 164 characters will fail the conversion>

O serviço de Conversão faz download de todos os arquivos especificados em blobPrefix, não apenas dos arquivos usados na conversão. Os arquivos/pasta que causam problemas podem ser menos óbvios nesses casos. Portanto, é importante verificar tudo o que está contido na conta de armazenamento em blobPrefix. Consulte as entradas de exemplo abaixo para ver o que está sendo baixado.

{
  "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             

O HoloLens2 'Tirar uma Foto' (MRC) não mostra nenhum conteúdo local ou remoto

Esse problema geralmente ocorre se um projeto é atualizado do WMR para o OpenXR e se o projeto acessou as configurações da Classe HolographicViewConfiguration (Windows.Graphics.Holographic). Essa API tem suporte no OpenXR e não deve ser acessada.

Próximas etapas