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.
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.
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.
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.
Cada sessão passa por várias fases.
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.
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.
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.
Você pode estender o tempo de concessão de uma sessão ativa, se acontecer que você precisa dela por mais tempo .
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.