Sessioni di Rendering remoto

In Rendering remoto di Azure (ARR), una sessione rappresenta un concetto chiave. Questo articolo illustra in che cosa consiste esattamente una sessione.

Panoramica

Rendering remoto di Azure comporta l'offload di attività di rendering complesse nel cloud. Queste attività di rendering non possono essere eseguite su qualsiasi server, perché la maggior parte dei server cloud non dispone di GPU. A causa della quantità di dati necessari e dei requisiti complessi per la produzione di risultati a frequenze dei fotogrammi interattive, la responsabilità del server che gestisce una richiesta dell'utente non può essere passata a un altro computer in tempo reale, come per il traffico Web più comune.

Ciò significa che, quando si usa Rendering remoto di Azure, un server cloud con le funzionalità hardware necessarie deve essere riservato esclusivamente alla gestione delle richieste di rendering. Una sessione fa riferimento a tutti gli elementi interessati dall'interazione con il server. Essa inizia con la richiesta iniziale di riservare un computer per l'uso (lease), continua con tutti i comandi per il caricamento e la manipolazione dei modelli e termina con il rilascio del lease nel server cloud.

Gestione delle sessioni

Esistono diversi modi per gestire le sessioni e interagire con esse. Un modo indipendente dal linguaggio per creare, aggiornare e arrestare le sessioni è offerto dall'API REST di gestione delle sessioni. In C# e C++, queste operazioni vengono esposte tramite le classi RemoteRenderingClient e RenderingSession. Per le applicazioni Unity, sono disponibili altre funzioni di utilità offerte dal componente ARRServiceUnity.

Una volta stabilita la connessione a una sessione attiva, le operazioni quali il caricamento di modelli e l'interazione con la scena vengono esposte tramite la classe RenderingSession.

Gestione simultanea di più sessioni

Non è possibile stabilire una connessione completa a più sessioni da un dispositivo. Tuttavia, è possibile creare, osservare e arrestare tutte le sessioni desiderate da un'unica applicazione. Fintanto che l'app non è destinata a connettersi a una sessione, non è necessario neanche eseguirla in un dispositivo come HoloLens 2. Un caso d'uso per tale implementazione può essere rappresentato dalla necessità di controllare le sessioni tramite un meccanismo centrale. Ad esempio, si potrebbe creare un'app Web, in cui più tablet e dispositivi HoloLens possono accedere. Quindi, l'app può visualizzare le opzioni sui tablet, ad esempio il modello CAD da visualizzare. Se un utente effettua una selezione, queste informazioni vengono comunicate a tutti i dispositivi HoloLens per creare un'esperienza condivisa.

Fasi della sessione

Ogni sessione prevede più fasi.

Avvio della sessione

Quando si chiede ad ARR di creare una nuova sessione, la prima cosa che fa è restituire un UUID di sessione. L'UUID consente di eseguire query sulle informazioni relative alla sessione. L'UUID e alcune informazioni di base sulla sessione vengono resi permanenti per 30 giorni, pertanto è possibile eseguire query su tali informazioni anche dopo l'arresto della sessione. A questo punto, lo stato della sessione verrà segnalato come Avvio in corso.

Successivamente, il rendering remoto di Azure tenterà di trovare un server in grado di ospitare la sessione. Per questa ricerca sono disponibili due parametri. In primo luogo, vengono riservati solo i server nell'area di pertinenza. Ciò è dovuto al fatto che la latenza di rete tra aree può essere troppo elevata per garantire un'esperienza soddisfacente. Il secondo fattore è rappresentato dalle dimensioni desiderate specificate. In ogni area è disponibile un numero limitato di server che possono soddisfare le richieste di dimensioni Standard o Premium. Di conseguenza, se tutti i server delle dimensioni richieste sono attualmente in uso nell'area, la creazione della sessione avrà esito negativo. Il motivo dell'errore può essere sottoposto a query.

Importante

Se si richiedono dimensioni del server Standard e la richiesta ha esito negativo a causa di una richiesta elevata, ciò non implica che la richiesta di un server Premium avrà esito negativo. Pertanto, se si tratta di un'opzione, è possibile provare a eseguire il fallback a una dimensione del server Premium .

Quando il servizio individua un server idoneo, deve copiare la macchina virtuale appropriata per trasformarla in un host di rendering remoto di Azure. Questo processo richiede alcuni minuti. Successivamente, la macchina virtuale viene avviata e lo stato della sessione passa a Pronto.

A questo punto, il server è in attesa esclusivamente dell'input. Questo è anche il punto da cui decorre l'addebito del servizio.

Connessione a una sessione

Una volta pronta la sessione, è possibile connettersi ad essa. Durante la connessione, il dispositivo può inviare comandi per caricare e modificare i modelli. Ogni host ARR serve un solo dispositivo client alla volta, quindi, quando un client si connette a una sessione, dispone di un controllo esclusivo sul contenuto sottoposto a rendering. Ciò significa anche che le prestazioni di rendering non variano mai per motivi che esulano dal controllo dell'utente.

Importante

Anche se a una sessione può connettersi un solo client, è possibile eseguire query sulle informazioni di base sulle sessioni, ad esempio lo stato corrente, senza connettersi.

Quando un dispositivo è connesso a una sessione, i tentativi di connessione di altri dispositivi avranno esito negativo. Tuttavia, una volta che il dispositivo connesso si disconnette, volontariamente o a causa di un errore, la sessione accetterà un'altra richiesta di connessione. Tutti gli stati precedenti (modelli caricati e altro) vengono eliminati, in modo tale che il successivo dispositivo connesso disponga di uno slate libero. Le sessioni possono quindi essere riutilizzate più volte da dispositivi diversi e, nella maggior parte dei casi, è possibile nascondere l'overhead di avvio della sessione all'utente finale.

Importante

Il server remoto non modifica mai lo stato dei dati sul lato client. Eventuali mutazioni dei dati, ad esempio gli aggiornamenti delle trasformazioni e le richieste di caricamento, devono essere eseguite dall'applicazione client. Tutte le azioni aggiornano immediatamente lo stato del client.

Fine sessione

Quando si richiede una nuova sessione, è necessario specificare una durata del lease massima, in genere compresa in un intervallo tra una e otto ore. Questa indica il periodo di tempo durante il quale l'host accetterà input.

Esistono di norma due motivi per terminare una sessione. È possibile richiedere manualmente che la sessione venga arrestata o che la durata del lease massima sia scaduta. In entrambi i casi, eventuali connessioni attive all'host vengono chiuse immediatamente e il servizio sul server viene arrestato. Il server viene quindi restituito al pool di Azure e può essere requisito per altri scopi. L'arresto di una sessione non può essere interrotto o annullato. L'esecuzione di query sullo stato della sessione in una sessione arrestata restituirà Interrotto o Scaduto, a seconda che la sessione sia stata arrestata manualmente o che sia stata raggiunta la durata del lease massima.

Una sessione può anche essere arrestata a causa di un errore.

In tutti i casi, dopo l'arresto di una sessione non verrà applicato alcun addebito.

Avviso

L'eventuale connessione a una sessione e la relativa durata non influiscono sulla fatturazione. Ciò che si paga per il servizio dipende dalla durata della sessione, ovvero dal momento in cui un server è riservato esclusivamente all'utente e dalle funzionalità hardware richieste (dimensioni allocate). Se si avvia una sessione, ci si connette per cinque minuti e quindi non si arresta la sessione, per cui l'esecuzione prosegue fino alla scadenza del lease, verrà addebitata l'intera durata del lease. Viceversa, la durata del lease massima è principalmente una rete di sicurezza. Non è importante se si richieda o meno una sessione con una durata del lease di otto ore per poi usarla solo per cinque minuti, se si arresta manualmente la sessione in un secondo momento.

Estendere la durata del lease di una sessione

È possibile estendere la durata del lease di una sessione attiva nel caso in cui sia necessario più tempo.

Codice di esempio

Il codice riportato di seguito illustra una semplice implementazione di avvio di una sessione, in attesa dello stato Pronto, nonché la relativa connessione, disconnessione e chiusura.

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();

È possibile mantenere, modificare ed eseguire query su più istanze di RemoteRenderingClient e RenderingSession dal codice. Tuttavia, a RenderingSession può connettersi un solo dispositivo alla volta.

La durata di una macchina virtuale non è associata all'istanza di RemoteRenderingClient o RenderingSession. RenderingSession.StopAsync deve essere chiamato per arrestare una sessione.

L'ID sessione persistente può essere sottoposto a query tramite RenderingSession.SessionUuid() e memorizzato nella cache in locale. Con questo ID, un'applicazione può chiamare RemoteRenderingClient.OpenRenderingSessionAsync per eseguire l'associazione a tale sessione.

Quando RenderingSession.IsConnected è true, RenderingSession.Connection restituisce un'istanza di RenderingConnection che contiene le funzioni per caricare modelli, modificare entità ed eseguire query di informazioni sulla scena di cui è stato eseguito il rendering.

Documentazione sull'API

Passaggi successivi