Resolver problemas
Esta página lista problemas comuns que interferem com a Renderização Remota do Azure e maneiras de resolvê-los.
O cliente não pode se conectar ao servidor
Certifique-se de que seus firewalls (no dispositivo, dentro de roteadores, etc.) não bloqueiem as portas mencionadas nos Requisitos do sistema.
Falha ao carregar o modelo
Quando o carregamento de um modelo (por exemplo, por meio de uma amostra Unity) falha, embora a configuração do blob esteja correta, é provável que o armazenamento de blob não esteja vinculado corretamente. A vinculação adequada é explicada na vinculação de um capítulo de conta de armazenamento. Após a ligação correta, pode demorar até 30 minutos até que as alterações entrem em vigor.
Não é possível ligar a conta de armazenamento à conta ARR
Às vezes, durante a vinculação de uma conta de armazenamento, a conta de Renderização Remota não é listada. Para corrigir esse problema, vá para a conta ARR no portal do Azure e selecione Identidade no grupo Configurações à esquerda. Verifique se Status está definido como Ativado.
Não é possível carregar o modelo através de um token SAS
Se o aplicativo cliente não conseguir carregar um modelo do armazenamento por meio de um token SAS válido, isso pode ser causado pelo nível de acesso à rede pública configurado no armazenamento de blob. Carregar um modelo ARR a partir do token SAS só funciona se ele tiver sido configurado com a opção "Ativado de todas as redes":
Se a limitação 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 a GPU suporta decodificação de vídeo de hardware. Consulte 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 de hardware. Em caso afirmativo, tente forçar seu aplicativo a usar a outra GPU. Alterar a GPU usada geralmente é possível nas configurações do driver da GPU.
Falha ao recuperar o status da sessão/conversão
O envio de comandos da API REST com muita frequência faz com que o servidor acelere e retorne a falha eventualmente. O código de status HTTP no caso de limitação é 429 ("muitas solicitações"). Como regra geral, deve haver um atraso de 5-10 segundos entre as chamadas subsequentes.
Observe que esse limite não afeta apenas as chamadas de API REST quando chamadas diretamente, mas também suas contrapartes C#/C++, como Session.GetPropertiesAsync
, Session.RenewAsync
ou Frontend.GetAssetConversionStatusAsync
. Algumas funções também retornam informações quando é salvo para tentar novamente. Por exemplo, RenderingSessionPropertiesResult.MinimumRetryDelay
especifica quantos segundos esperar antes de tentar outra verificação. Quando disponível, usar esse valor retornado é melhor, pois permite que você faça verificações com a maior frequência possível, sem ficar limitado.
Se você enfrentar a limitação do lado do servidor, altere o código para fazer as chamadas com menos frequência. O servidor redefinirá o estado de limitação a cada minuto, por isso é seguro executar novamente o código após um minuto.
Codec H265 não disponível
Há duas razões pelas quais o servidor pode se recusar a se conectar com um codec not available
erro.
O codec H265 não está instalado:
Primeiro, certifique-se de instalar as extensões de vídeo HEVC conforme mencionado na seção Software dos requisitos do sistema.
Se continuar a encontrar problemas, certifique-se de que a placa gráfica suporta H265 e de que tem instalado o controlador gráfico mais recente. Consulte 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:
A razão para esse problema é uma configuração de segurança incorreta nas DLLs. Esse problema não se manifesta ao tentar assistir a vídeos codificados com H265. Reinstalar o codec também não corrige o problema. Em vez disso, execute as seguintes etapas:
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
o oposto deHEVCVideoExtension
). Esse comando deve gerar aInstallLocation
saída do codec, algo como:InstallLocation : C:\Program Files\WindowsApps\Microsoft.HEVCVideoExtension_1.0.23254.0_x64__5wasdgertewe
Abra essa pasta no Windows Explorer
Deve haver uma subpasta x86 e uma subpasta x64 . Clique com o botão direito do mouse em uma das pastas e escolha Propriedades
- Selecione a guia Segurança e selecione o botão Configurações avançadas
- Selecione Alterar para o proprietário
- Digite Administradores no campo de texto
- Selecione Verificar nomes e OK
Repita as etapas acima para a outra pasta
Repita também as etapas acima em cada arquivo DLL dentro de ambas as pastas. Deve haver quatro DLLs ao todo.
Para verificar se as configurações estão corretas, execute as seguintes etapas para cada uma das quatro DLLs:
- Selecione Propriedades > Segurança Editar >
- Percorra a lista de todos os Grupos/Usuários e certifique-se de que cada um tem o conjunto direito Ler e Executar (a marca de seleção na coluna permitir deve ser marcada)
Baixa qualidade de vídeo
A qualidade do vídeo pode ser comprometida pela qualidade da rede ou pelo codec de vídeo H265 ausente.
- Consulte as etapas para identificar problemas de rede.
- Consulte os requisitos do sistema para instalar o driver gráfico mais recente.
O vídeo gravado com o MRC não reflete a qualidade da experiência ao vivo
Um vídeo pode ser gravado no HoloLens através da Captura de Realidade Mista (MRC). No entanto, o vídeo resultante tem pior qualidade 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 do estágio final, então o vídeo parece ser mais nítido.
Ambas são limitações inerentes à técnica de gravação.
Tela preta após o carregamento bem-sucedido do modelo
Se você estiver conectado ao tempo de execução de renderização e carregou um modelo com êxito, mas só verá uma tela preta depois, isso pode ter algumas causas distintas.
Recomendamos testar as seguintes coisas antes de fazer uma análise mais aprofundada:
- O codec H265 está instalado? Embora deva haver um fallback para o codec H264, vimos casos em que esse fallback não funcionou corretamente. Consulte os requisitos do sistema para instalar o driver gráfico mais recente.
- Ao usar um projeto Unity, feche o Unity, exclua a biblioteca temporária e as pastas obj no diretório do projeto e carregue/construa o projeto novamente. Em alguns casos, os dados armazenados em cache fizeram com que a amostra não funcionasse corretamente sem motivo óbvio.
Se essas duas etapas não ajudarem, é 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 de 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 aumentar com o tempo, o cliente receberá quadros de vídeo reais do servidor. Então, deve ser um problema do lado do cliente.
O valor de dimensionamento nas configurações de conversão não é aplicado ao modelo
Se um modelo aparecer no Showcase ou no Guia de início rápido com dimensionamento inalterado, embora um dimensionamento seja aplicado como parte dos parâmetros de geometria das configurações de conversão, isso provavelmente se deve ao recurso de dimensionamento automático interno da amostra. Ou seja, a amostra dimensiona o modelo para melhor se ajustar ao frustum de visualização, independentemente de sua escala de entrada.
No caso do Showcase, o dimensionamento automático pode ser desativado especificando um MaxSize
de zero na seção do Transform
modelo dentro do arquivo models.xml. Essa abordagem orientada por dados requer que o modelo seja carregado através do XML em primeiro lugar, porque em todos os outros casos o MaxSize
padrão é de 1 metro. Há também uma MinSize
propriedade que tem como padrão 0,5 metro, fazendo com que todos os modelos menores sejam ampliados.
Para obter mais informações sobre como carregar modelos no Showcase, consulte o capítulo Adicionando ativos de modelo 3D ao ARR Showcase da documentação do Showcase.
Problemas comuns do lado do cliente
O modelo excede os limites da VM selecionada, especificamente o número máximo de primitivos:
Consulte limites específicos de tamanho do servidor.
O modelo não está dentro do frustum da câmera:
Em muitos casos, o modelo é exibido corretamente, mas localizado fora do frustum da câmera. Uma razão comum é que o modelo foi exportado com um pivô distante do centro, por isso é cortado pelo plano de recorte distante da câmera. Ele ajuda a consultar a caixa delimitadora do modelo programaticamente e visualizar a caixa com Unity como uma caixa de linha ou imprimir seus valores 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 do modelo, vale a pena olhar para a boundingBox
entrada 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 min
e max
posição no espaço 3D, em metros. Assim, uma coordenada de 1000,0 significa que está a 1 quilómetro de distância da origem.
Pode haver dois problemas com esta caixa delimitadora que levam à geometria invisível:
- A caixa pode estar longe do centro, de modo que o objeto é cortado completamente devido ao recorte de plano distante. Os
boundingBox
valores neste caso seriam assim:min = [-2000, -5,-5], max = [-1990, 5,5]
, usando um grande deslocamento no eixo x como exemplo aqui. Para resolver esse tipo de problema, habilite arecenterToOrigin
opção na configuração de conversão de modelo. - A caixa pode ser centralizada, mas ser ordens de grandeza muito grandes. Isso significa que, embora a câmera comece no centro do modelo, sua geometria é cortada em todas as direções. Os valores típicos
boundingBox
, neste caso, seriam parecidos com este:min = [-1000,-1000,-1000], max = [1000,1000,1000]
. A razão para este tipo de problema é geralmente uma incompatibilidade de escala de unidade. Para compensar, especifique um valor de escala 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 tempo de execução.
O pipeline de renderização Unity não inclui os ganchos de renderização:
A Renderização Remota do Azure se conecta ao pipeline de renderização Unity para fazer a composição do quadro com o vídeo e fazer a reprojeção. Para verificar se esses ganchos existem, abra o menu Window > Analysis > Frame debugger. Habilite-o e certifique-se de que há duas entradas para o HolographicRemotingCallbackPass
pipeline:
Para corrigir, verifique se o ativo HybridRenderingPipeline fornecido é usado:
.. conforme descrito com mais detalhes nos pipelines de renderização Unity.
O padrão quadriculado é renderizado após o carregamento do modelo
Se a imagem renderizada tiver esta aparência:
Em seguida, o renderizador atinge os limites de polígono para o tamanho de configuração padrão. Para atenuar, mude 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
Certifique-se de seguir o Tutorial Unity : Veja modelos remotos exatamente. Uma imagem invertida indica que Unity é necessário para criar um destino de renderização fora da tela. Esse comportamento não é suportado atualmente e cria um enorme impacto no desempenho do HoloLens 2.
Os motivos para esse problema podem ser MSAA, HDR ou habilitar o pós-processamento. Certifique-se de que o perfil de baixa qualidade esteja selecionado e definido como padrão no Unity. Para fazer isso, vá para Editar > configurações do projeto... > Qualidade.
Ao usar o plug-in OpenXR no Unity 2020, existem versões do URP (Universal Render Pipeline) que criam esse destino de renderização extra fora da tela, independentemente do pós-processamento estar habilitado. Portanto, é importante atualizar a versão URP manualmente para pelo menos 10.5.1 (ou superior). Este processo de atualização é descrito nos requisitos do sistema.
O código Unity usando a API de renderização remota não compila
Use Debug ao compilar para o Unity Editor
Mude o tipo de compilação da solução Unity para Depurar. Ao testar ARR no editor Unity, a definição UNITY_EDITOR
só está disponível em compilações 'Depurar'. Essa configuração não está relacionada ao tipo de compilação usado para aplicativos implantados, onde você deve preferir compilações 'Release'.
Falhas de compilação ao compilar amostras Unity para HoloLens 2
Temos visto falhas espúrias ao tentar compilar amostras Unity (início rápido, ShowCaseApp, ...) para HoloLens 2. O Visual Studio reclama de não ser capaz de copiar alguns arquivos, embora eles estejam lá. Se tiver este problema:
- Remova todos os arquivos temporários do Unity do projeto e tente novamente. Ou seja, feche o Unity, exclua a biblioteca temporária e as pastas obj no diretório do projeto e carregue/construa o projeto novamente.
- Certifique-se de que os projetos estão localizados em um diretório no disco com caminho razoavelmente curto, já que a etapa de cópia às vezes parece ter problemas com nomes de arquivos 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 na 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"
As compilações do Arm64 para projetos Unity falham porque falta AudioPluginMsHRTF.dll
O AudioPluginMsHRTF.dll
para Arm64 foi adicionado ao pacote Windows Mixed Reality (com.unity.xr.windowsmr.metro) na versão 3.0.1. Certifique-se de ter a versão 3.0.1 ou posterior instalada através do Unity Package Manager. Na barra de menus Unity, navegue até o Gerenciador de Pacotes do Windows > e procure o pacote Windows Mixed Reality.
O plugin Unity Cinemachine
não funciona no modo de pose remota
No modo de pose remota, o código de vinculação 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. No entanto, alguns plugins de terceiros (como Cinemachine
) que conduzem a câmera, podem depender de pelo menos alguns bits de camada sendo definidos.
Para este efeito, o código de ligação permite que você altere programaticamente a máscara de bits de camada para a câmera principal. Especificamente, as seguintes etapas são necessárias:
- Crie uma nova camada no Unity que não seja usada para renderizar nenhuma geometria de cena local. Neste exemplo, suponha que a camada é chamada "Cam".
- Passe esta máscara de bits para ARR para ARR configurá-lo na câmera principal:
RemoteManagerUnity.CameraCullingMask = LayerMask.GetMask("Cam");
- Configure as
Cinemachine
propriedades para usar esta nova camada:
O modo de pose local não é afetado por esse problema, já que, neste caso, a vinculação ARR não redireciona a renderização para uma câmera proxy interna.
O aplicativo nativo baseado em C++ não compila
Erro 'Biblioteca não encontrada' para aplicativo UWP ou DLL
Dentro do pacote NuGet C++, há um arquivo de arquivo microsoft.azure.remoterendering.Cpp.targets
que define qual dos sabores binários usar. Para identificar UWP
, as condições no arquivo verificam se há ApplicationType == 'Windows Store'
. Portanto, é preciso garantir que esse tipo seja definido no projeto. Esse deve ser o caso ao criar um aplicativo UWP ou DLL por meio do assistente de projeto do Visual Studio.
Hologramas instáveis
Caso os objetos renderizados pareçam estar se movendo junto com os movimentos da cabeça, você pode estar encontrando problemas com a Reprojeção de Estágio Tardio (LSR). Consulte a secção sobre Reprojeção de Fase Tardia para obter orientações sobre como abordar tal situação.
Outra razão para hologramas instáveis (oscilação, deformação, desvios ou saltos hologramas) pode ser a conectividade de rede deficiente, em particular largura de banda de rede insuficiente ou 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. Os 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 da rede. Se ServiceStatistics.VideoFramesReused
for frequentemente maior do que zero, indica um problema de rede.
Outro valor a ser observado é ServiceStatistics.LatencyPoseToReceiveAvg
. Deve estar consistentemente abaixo de 100 ms. Ver valores mais altos pode indicar que você está conectado a um data center muito distante.
Para obter uma lista de possíveis atenuações, consulte as diretrizes para conectividade de rede.
Conteúdo local (UIs, ...) no HoloLens 2 renderiza com significativamente mais artefatos de distorção do que sem ARR
Esse artefato é devido a uma configuração padrão que troca a qualidade da projeção de conteúdo local pelo desempenho em tempo de execução. 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 reprojeção sem ARR.
Luta em Z
Embora o ARR ofereça a funcionalidade de mitigação z-fighting, o z-fighting ainda pode aparecer na cena. Este guia tem como objetivo solucionar esses problemas restantes.
Passos recomendados
Use o seguinte fluxo de trabalho para mitigar o z-fighting:
Teste a cena com as configurações padrão de ARR (z-fighting mitigation on)
Desative a mitigação z-fighting por meio de sua API
Mude o plano da câmera perto e longe para um alcance mais próximo
Solucionar problemas da cena através da próxima seção
Investigando os combates z restantes
Se as etapas acima foram esgotadas e o z-fighting restante é inaceitável, a causa subjacente do z-fighting precisa ser investigada. Como afirmado na página do recurso de mitigação de combate z, há duas razões principais para o combate z: perda de precisão de profundidade no extremo da faixa de profundidade e superfícies que se cruzam enquanto são coplanares. A perda de precisão de profundidade é uma eventualidade matemática e só pode ser atenuada seguindo o passo 3 acima. As superfícies coplanares indicam uma falha no ativo de origem e são melhor fixadas nos dados de origem.
ARR tem um recurso para determinar se as superfícies podem z-fight: Destaque quadriculado. Você também pode determinar visualmente o que causa a luta z. A primeira animação a seguir mostra um exemplo de perda de profundidade e precisão na distância, e a segunda mostra um exemplo de superfícies quase coplanares:
Compare estes exemplos com o seu z-fighting para determinar a causa raiz ou, opcionalmente, siga este fluxo de trabalho passo a passo:
- Posicione a câmera acima das superfícies de combate z para olhar diretamente para a superfície.
- Lentamente, mova a câmera para trás, longe das superfícies.
- Se o z-fighting é visível o tempo todo, as superfícies são perfeitamente coplanares.
- Se o combate z é visível na maioria das vezes, as superfícies são quase coplanares.
- Se o combate z só é visível de longe, a causa é a falta de precisão de profundidade.
As superfícies coplanares podem ter muitas causas diferentes:
Um objeto foi duplicado pelo aplicativo de exportação devido a um erro ou abordagens de fluxo de trabalho diferentes.
Verifique estes problemas com a respetiva aplicação e suporte de aplicação.
As superfícies são duplicadas e viradas para parecerem frente e verso em renderizadores que usam abate frontal ou traseiro.
A importação através da conversão do modelo determina o lado principal do modelo. A dupla face é assumida como padrão. A superfície é renderizada como uma parede fina com iluminação fisicamente correta de ambos os lados. A unilateralidade pode ser implícita por sinalizadores no ativo de origem ou explicitamente forçada durante a conversão do modelo. Além disso, mas opcionalmente, o modo de lado único pode ser definido como "normal".
Os objetos se cruzam nos ativos de origem.
Objetos transformados de uma forma que algumas de suas superfícies se sobrepõem também cria z-fighting. Transformar partes da árvore de cena na cena importada em ARR também pode criar esse problema.
As superfícies são criadas propositadamente para tocar, como decalques ou texto nas paredes.
Artefatos gráficos usando renderização estéreo de várias passagens em aplicativos C++ nativos
Em alguns casos, aplicativos C++ nativos personalizados que usam um modo de renderização estéreo de várias passagens para conteúdo local (renderização para o olho esquerdo e direito 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, recomenda-se de qualquer maneira renderizar conteúdo local com uma técnica de renderização estéreo de uma única passagem mais moderna, por exemplo, usando SV_RenderTargetArrayIndex.
Erros de download do arquivo de conversão
O serviço de conversão pode encontrar erros ao baixar arquivos do armazenamento de blob devido a limitações do sistema de arquivos. Os casos de falha específicos estão listados abaixo. Informações abrangentes sobre as limitações do sistema de arquivos do Windows podem ser encontradas na documentação de nomenclatura de arquivos, caminhos e namespaces .
Caminho de colisão e nome de arquivo
No armazenamento de blobs, é possível criar um arquivo e uma pasta com o mesmo nome das entradas irmãs. O sistema de arquivos do Windows não permite isso. Assim, o serviço emite um erro de download nesse caso.
Comprimento do caminho
Existem limites de comprimento de caminho impostos pelo Windows e pelo serviço. Os caminhos de arquivo e os nomes de arquivo no armazenamento de blob não devem exceder 178 caracteres. Por exemplo, dado um blobPrefix
de models/Assets
, que é de 13 caracteres:
models/Assets/<any file or folder path greater than 164 characters will fail the conversion>
O serviço de conversão baixa todos os arquivos especificados no blobPrefix
, não apenas os arquivos usados na conversão. Os arquivos/pastas que causam problemas podem ser menos óbvios nesses casos, por isso é importante verificar tudo o que está contido na conta de armazenamento em blobPrefix
. Veja as entradas de exemplo abaixo para saber o que é 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
HoloLens2 'Tirar uma foto' (MRC) não mostra nenhum conteúdo local ou remoto
Esse problema geralmente ocorre se um projeto é atualizado de WMR para OpenXR e o projeto acessou as configurações da classe HolographicViewConfiguration (Windows.Graphics.Holographic). Esta API não é suportada no OpenXR e não deve ser acessada.