Remote Rendering-sessies

In Azure Remote Rendering (ARR) is een sessie een belangrijk concept. In dit artikel wordt uitgelegd wat precies een sessie is.

Overzicht

Azure Remote Rendering werkt door complexe renderingtaken naar de cloud te offloaden. Deze renderingtaken kunnen niet worden uitgevoerd door slechts een server, omdat de meeste cloudservers geen GPU's hebben. Vanwege de hoeveelheid betrokken gegevens en de harde eis om resultaten te produceren met interactieve framesnelheden, kan de verantwoordelijkheid die de server verwerkt die gebruikersaanvraag ook niet aan een andere machine on-the-fly kan worden overgedragen, zoals mogelijk is voor meer gemeenschappelijk webverkeer.

Dat betekent dat wanneer u Azure Remote Rendering gebruikt, een cloudserver met de benodigde hardwaremogelijkheden exclusief moet worden gereserveerd om uw renderingaanvragen af te handelen. Een sessie verwijst naar alles wat betrokken is bij het werken met deze server. Het begint met de eerste aanvraag om een machine te reserveren (leasen) voor uw gebruik, gaat verder met alle opdrachten voor het laden en bewerken van modellen en eindigt met het vrijgeven van de lease op de cloudserver.

Sessies beheren

Er zijn meerdere manieren om sessies te beheren en ermee te communiceren. De taalonafhankelijke manier om sessies te maken, bij te werken en af te sluiten, is via de REST API voor sessiebeheer. In C# en C++ worden deze bewerkingen RemoteRenderingClient weergegeven via de klassen en RenderingSession. Voor Unity-toepassingen zijn er nog meer hulpprogrammafuncties die door het ARRServiceUnity onderdeel worden geleverd.

Zodra u bent verbonden met een actieve sessie, worden bewerkingen zoals het laden van modellen en interactie met de scène weergegeven via de RenderingSession klasse.

Meerdere sessies tegelijk beheren

Het is niet mogelijk om vanaf één apparaat volledig verbinding te maken met meerdere sessies. U kunt echter net zoveel sessies maken, observeren en afsluiten als u wilt vanuit één toepassing. Zolang de app niet is bedoeld om ooit verbinding te maken met een sessie, hoeft deze ook niet te worden uitgevoerd op een apparaat zoals HoloLens 2. Een use case voor een dergelijke implementatie kan zijn als u sessies wilt beheren via een centraal mechanisme. U kunt bijvoorbeeld een web-app bouwen, waarbij meerdere tablets en HoloLens-apparaten zich kunnen aanmelden. Vervolgens kan de app opties weergeven op de tablets, zoals welk CAD-model moet worden weergegeven. Als een gebruiker een selectie maakt, wordt deze informatie doorgegeven aan alle HoloLens-apparaten om een gedeelde ervaring te maken.

Sessiefasen

Elke sessie ondergaat meerdere fasen.

Sessie opstarten

Wanneer u ARR vraagt om een nieuwe sessie te maken, moet u eerst een sessie-UUID retourneren. Met deze UUID kunt u query's uitvoeren op informatie over de sessie. De UUID en enkele basisinformatie over de sessie worden 30 dagen bewaard, zodat u query's kunt uitvoeren op die informatie, zelfs nadat de sessie is gestopt. Op dit moment wordt de sessiestatus gerapporteerd als Starten.

Vervolgens probeert Azure Remote Rendering een server te vinden die uw sessie kan hosten. Er zijn twee parameters voor deze zoekopdracht. Eerst worden alleen servers in uw regio gereserveerd. Dat komt doordat de netwerklatentie tussen regio's mogelijk te hoog is om een fatsoenlijke ervaring te garanderen. De tweede factor is de gewenste grootte die u hebt opgegeven. In elke regio is er een beperkt aantal servers dat kan voldoen aan de standard- of Premium-aanvraag. Als alle servers van de aangevraagde grootte momenteel in uw regio worden gebruikt, mislukt het maken van sessies. De reden voor fouten kan worden opgevraagd.

Belangrijk

Als u een Standard-servergrootte aanvraagt en de aanvraag mislukt vanwege een hoge vraag, betekent dit niet dat het aanvragen van een Premium-server ook mislukt. Dus als het een optie voor u is, kunt u proberen terug te vallen op een Premium-servergrootte .

Wanneer de service een geschikte server vindt, moet deze de juiste virtuele machine (VM) naar de server kopiëren om deze om te zetten in een Azure Remote Rendering-host. Dit proces duurt enkele minuten. Daarna wordt de virtuele machine opgestart en wordt de sessiestatus overgezet naar Gereed.

Op dit moment wacht de server uitsluitend op uw invoer. Dit is ook het punt van waaruit u voor de service wordt gefactureerd.

Verbinding maken naar een sessie

Zodra de sessie klaar is, kunt u er verbinding mee maken. Terwijl het apparaat is verbonden, kunnen opdrachten worden verzonden om modellen te laden en te wijzigen. Elke ARR-host dient slechts één clientapparaat tegelijk, dus wanneer een client verbinding maakt met een sessie, heeft deze exclusieve controle over de gerenderde inhoud. Dat betekent ook dat de renderingprestaties nooit zullen variëren om redenen buiten uw controle.

Belangrijk

Hoewel slechts één client verbinding kan maken met een sessie, kunnen basisinformatie over sessies, zoals hun huidige status, worden opgevraagd zonder verbinding te maken.

Wanneer een apparaat is verbonden met een sessie, mislukken pogingen van andere apparaten om verbinding te maken. Zodra het verbonden apparaat echter wordt verbroken, hetzij vrijwillig of vanwege een fout, accepteert de sessie een andere verbindingsaanvraag. Alle vorige statussen (geladen modellen en dergelijke) worden verwijderd, zodat het volgende verbindingsapparaat een schone lei krijgt. Sessies kunnen dus vaak opnieuw worden gebruikt, door verschillende apparaten en het is mogelijk om de opstartoverhead van de sessie te verbergen voor de eindgebruiker in de meeste gevallen.

Belangrijk

De externe server wijzigt nooit de status van gegevens aan de clientzijde. Alle mutaties van gegevens (zoals transformatie-updates en belastingsaanvragen) moeten worden uitgevoerd door de clienttoepassing. Alle acties werken de clientstatus onmiddellijk bij.

Sessie-einde

Wanneer u een nieuwe sessie aanvraagt, geeft u een maximale leasetijd op, meestal binnen een tot acht uur. Dit is de duur waarin de host uw invoer accepteert.

Er zijn twee regelmatige redenen waarom een sessie wordt beëindigd. U kunt de sessie handmatig aanvragen om te worden gestopt of de maximale leasetijd verloopt. In beide gevallen wordt elke actieve verbinding met de host direct gesloten en wordt de service afgesloten op die server. De server wordt vervolgens teruggegeven aan de Azure-pool en kan voor andere doeleinden worden aangevraagd. Het stoppen van een sessie kan niet ongedaan worden gemaakt of geannuleerd. Als u een query uitvoert op de sessiestatus van een gestopte sessie, wordt gestopt of verlopen geretourneerd, afhankelijk van of deze handmatig is afgesloten of omdat de maximale leasetijd is bereikt.

Een sessie kan ook worden gestopt vanwege een fout.

In alle gevallen wordt u niet meer gefactureerd zodra een sessie is gestopt.

Waarschuwing

Of u nu verbinding maakt met een sessie en hoe lang, heeft geen invloed op de facturering. Wat u voor de service betaalt, is afhankelijk van de sessieduur, wat betekent dat de tijd waarop een server exclusief voor u is gereserveerd en de aangevraagde hardwaremogelijkheden (de toegewezen grootte). Als u een sessie start, maakt u vijf minuten verbinding en stopt u de sessie niet, zodat deze actief blijft totdat de lease verloopt, wordt u gefactureerd voor de volledige sessie leasetijd. Daarentegen is de maximale leasetijd meestal een veiligheidsnet. Het maakt niet uit of u een sessie aanvraagt met een leasetijd van acht uur, dan alleen gedurende vijf minuten gebruiken, als u de sessie daarna handmatig stopt.

De leasetijd van een sessie verlengen

U kunt de leasetijd van een actieve sessie verlengen als blijkt dat u deze langer nodig hebt.

Voorbeeldcode

De onderstaande code toont een eenvoudige implementatie van het starten van een sessie, wachtend op de status Gereed , verbinding maken en vervolgens de verbinding verbreken en opnieuw afsluiten.

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

Meerdere RemoteRenderingClient exemplaren kunnen RenderingSession worden onderhouden, gemanipuleerd en opgevraagd vanuit code. Maar slechts één apparaat kan tegelijk verbinding maken met een RenderingSession apparaat.

De levensduur van een virtuele machine is niet gekoppeld aan het RemoteRenderingClient exemplaar of het RenderingSession exemplaar. RenderingSession.StopAsync moet worden aangeroepen om een sessie te stoppen.

De permanente sessie-id kan worden opgevraagd via RenderingSession.SessionUuid() en lokaal in de cache worden opgeslagen. Met deze id kan een toepassing aanroepen RemoteRenderingClient.OpenRenderingSessionAsync om verbinding te maken met die sessie.

Wanneer RenderingSession.IsConnected is waar, RenderingSession.Connection retourneert u een exemplaar van , dat de functies bevat voor het laden van modellen, het manipuleren van RenderingConnectionentiteiten en het opvragen van informatie over de weergegeven scène.

API-documentatie

Volgende stappen