Partilhar via


Sessões do Remote Rendering

Na Renderização Remota do Azure (ARR), uma sessão é um conceito-chave. Este artigo explica o que é exatamente uma sessão.

Descrição geral

A Renderização Remota do Azure funciona descarregando tarefas complexas de renderização na nuvem. Essas tarefas de renderização não podem ser cumpridas por qualquer servidor, já que a maioria dos servidores em nuvem não tem GPUs. Devido à quantidade de dados envolvidos e ao difícil requisito de produzir resultados em taxas de quadros interativas, a responsabilidade que o servidor lida com a solicitação do usuário também não pode ser entregue a outra máquina em tempo real, como pode ser possível para o tráfego da web mais comum.

Isso significa que, quando você usa a Renderização Remota do Azure, um servidor de nuvem com os recursos de hardware necessários deve ser reservado exclusivamente para lidar com suas solicitações de renderização. Uma sessão refere-se a tudo o que está envolvido na interação com este servidor. Ele começa com a solicitação inicial para reservar (arrendar) uma máquina para seu uso, continua com todos os comandos para carregar e manipular modelos e termina com a liberação da concessão no servidor em nuvem.

Gestão de sessões

Há várias maneiras de gerenciar e interagir com as sessões. A maneira independente do idioma de criar, atualizar e encerrar sessões é por meio da API REST de gerenciamento de sessão. Em C# e C++, essas operações são expostas através das classes RemoteRenderingClient e RenderingSession. Para aplicativos Unity, há outras funções de utilidade fornecidas pelo ARRServiceUnity componente.

Depois de conectado a uma sessão ativa, operações como carregar modelos e interagir com a cena são expostas através da RenderingSession classe.

Gerenciando várias sessões simultaneamente

Não é possível conectar-se totalmente a várias sessões a partir de um dispositivo. No entanto, você pode criar, observar e encerrar quantas sessões quiser a partir de um único aplicativo. Contanto que o aplicativo não seja destinado a se conectar a uma sessão, ele também não precisa ser executado em um dispositivo como o HoloLens 2. Um caso de uso para tal implementação pode ser se você quiser controlar sessões através de um mecanismo central. Por exemplo, pode-se criar um aplicativo Web, onde vários tablets e dispositivos HoloLens podem fazer login. Em seguida, o aplicativo pode exibir opções nos tablets, como qual modelo CAD exibir. Se um usuário fizer uma seleção, essas informações serão comunicadas a todos os dispositivos HoloLens para criar uma experiência compartilhada.

Fases da sessão

Cada sessão passa por várias fases.

Inicialização da sessão

Quando você pede ao ARR para criar uma nova sessão, a primeira coisa que ele faz é retornar uma UUID de sessão. Este UUID permite-lhe consultar informações sobre a sessão. O UUID e algumas informações básicas sobre a sessão são mantidos por 30 dias, para que você possa consultar essas informações mesmo depois que a sessão for interrompida. Neste ponto, o estado da sessão será relatado como Iniciando.

Em seguida, a Renderização Remota do Azure tenta encontrar um servidor que possa hospedar sua sessão. Existem dois parâmetros para esta pesquisa. Primeiro, ele reservará apenas servidores na sua região. Isso porque a latência da rede entre regiões pode ser muito alta para garantir uma experiência decente. O segundo fator é o tamanho desejado que você especificou. Em cada região, há um número limitado de servidores que podem atender à solicitação de tamanho Standard ou Premium. Consequentemente, se todos os servidores do tamanho solicitado estiverem atualmente em uso em sua região, a criação da sessão falhará. O motivo da falha pode ser questionado.

Importante

Se você solicitar um tamanho de servidor Standard e a solicitação falhar devido à alta demanda, isso não implica que a solicitação de um servidor Premium também falhará. Então, se for uma opção para você, você pode tentar voltar para um tamanho de servidor Premium .

Quando o serviço encontra um servidor adequado, ele precisa copiar a máquina virtual (VM) adequada para transformá-lo em um host de Renderização Remota do Azure. Este processo demora vários minutos. Depois, a VM é inicializada e o estado da sessão é transferido para Pronto.

Neste ponto, o servidor está aguardando exclusivamente a sua entrada. Este também é o ponto a partir do qual você é cobrado pelo serviço.

Ligar a uma sessão

Quando a sessão estiver pronta, você poderá se conectar a ela. Enquanto estiver conectado, o dispositivo pode enviar comandos para carregar e modificar modelos. Cada host ARR serve apenas um dispositivo cliente de cada vez, portanto, quando um cliente se conecta a uma sessão, ele tem controle exclusivo sobre o conteúdo renderizado. Isso também significa que o desempenho de renderização nunca variará por motivos fora do seu controle.

Importante

Embora apenas um cliente possa se conectar a uma sessão, informações básicas sobre sessões, como seu estado atual, podem ser consultadas sem conexão.

Enquanto um dispositivo estiver conectado a uma sessão, as tentativas de conexão de outros dispositivos falharão. No entanto, uma vez que o dispositivo conectado se desconecta, voluntariamente ou devido a algum tipo de falha, a sessão aceitará outra solicitação de conexão. Todo o estado anterior (modelos carregados e tal) é descartado de tal forma que o próximo dispositivo de conexão recebe uma folha limpa. Assim, as sessões podem ser reutilizadas muitas vezes, por diferentes dispositivos e pode ser possível ocultar a sobrecarga de inicialização da sessão do usuário final na maioria dos casos.

Importante

O servidor remoto nunca altera o estado dos dados do lado do cliente. Todas as mutações de dados (como atualizações de transformação e solicitações de carga) devem ser executadas pelo aplicativo cliente. Todas as ações atualizam imediatamente o estado do cliente.

Fim da sessão

Ao solicitar uma nova sessão, você especifica um tempo máximo de concessão, normalmente no intervalo de uma a oito horas. Esta é a duração durante a qual o anfitrião aceitará a sua entrada.

Há duas razões regulares para que uma sessão termine. Você solicita manualmente que a sessão seja interrompida ou o tempo máximo de concessão expira. Em ambos os casos, qualquer conexão ativa com o host é fechada imediatamente e o serviço é desligado nesse servidor. O servidor é então devolvido ao pool do Azure e pode ser requisitado para outros fins. A interrupção de uma sessão não pode ser desfeita ou cancelada. Consultar o estado da sessão em uma sessão interrompida retornará Interrompido ou Expirado, dependendo se ele foi desligado manualmente ou porque o tempo máximo de concessão foi atingido.

Uma sessão também pode ser interrompida devido a alguma falha.

Em todos os casos, você não será cobrado mais quando uma sessão for interrompida.

Aviso

Se você se conecta a uma sessão, e por quanto tempo, não afeta a cobrança. O que você paga pelo serviço depende da duração da sessão, ou seja, do tempo que um servidor está reservado exclusivamente para você e dos recursos de hardware solicitados (o tamanho alocado). Se você iniciar uma sessão, conectar-se por cinco minutos e, em seguida, não parar a sessão, de modo que ela continue em execução até que sua concessão expire, você será cobrado pelo tempo de concessão da sessão completa. Por outro lado, o tempo máximo de locação é, na sua maioria, uma rede de segurança. Não importa se você solicita uma sessão com um tempo de concessão de oito horas, então só a use por cinco minutos, se você parar manualmente a sessão depois.

Estender o tempo de concessão de uma sessão

Você pode estender o tempo de concessão de uma sessão ativa, se acontecer que você precisa dela por mais tempo .

Código de exemplo

O código abaixo mostra uma implementação simples de iniciar uma sessão, aguardar o estado pronto , conectar-se e, em seguida, desconectar e desligar novamente.

RemoteRenderingInitialization init = new RemoteRenderingInitialization();
// fill out RemoteRenderingInitialization parameters...

RemoteManagerStatic.StartupRemoteRendering(init);

SessionConfiguration sessionConfig = new SessionConfiguration();
// fill out sessionConfig details...

RemoteRenderingClient client = new RemoteRenderingClient(sessionConfig);

RenderingSessionCreationOptions rendererOptions = new RenderingSessionCreationOptions();
// fill out rendererOptions...

CreateRenderingSessionResult result = await client.CreateNewRenderingSessionAsync(rendererOptions);

RenderingSession session = result.Session;
RenderingSessionProperties sessionProperties;
while (true)
{
    var propertiesResult = await session.GetPropertiesAsync();
    sessionProperties = propertiesResult.SessionProperties;
    if (sessionProperties.Status != RenderingSessionStatus.Starting &&
        sessionProperties.Status != RenderingSessionStatus.Unknown)
    {
        break;
    }
    // REST calls must not be issued too frequently, otherwise the server returns failure code 429 ("too many requests"). So we insert the recommended delay of 10s
    await Task.Delay(TimeSpan.FromSeconds(10));
}

if (sessionProperties.Status != RenderingSessionStatus.Ready)
{
    // Do some error handling and either terminate or retry.
}

// Connect to server
ConnectionStatus connectStatus = await session.ConnectAsync(new RendererInitOptions());

// Connected!

while (...)
{
    // per frame update

    session.Connection.Update();
}

// Disconnect
session.Disconnect();

// stop the session
await session.StopAsync();

// shut down the remote rendering SDK
RemoteManagerStatic.ShutdownRemoteRendering();

Várias RemoteRenderingClient instâncias podem RenderingSession ser mantidas, manipuladas e consultadas a partir do código. Mas apenas um único dispositivo pode se conectar a um RenderingSession de cada vez.

O tempo de vida de uma máquina virtual não está vinculado à instância ou à RemoteRenderingClient RenderingSession instância. RenderingSession.StopAsync deve ser chamado para interromper uma sessão.

O ID de sessão persistente pode ser consultado e RenderingSession.SessionUuid() armazenado em cache localmente. Com essa ID, um aplicativo pode chamar RemoteRenderingClient.OpenRenderingSessionAsync para vincular a essa sessão.

Quando RenderingSession.IsConnected é true, retorna uma instância de RenderingConnection, RenderingSession.Connection que contém as funções para carregar modelos, manipular entidades e consultar informações sobre a cena renderizada.

Documentação da API

Próximos passos