Remote Rendering-sessioner

I Azure Remote Rendering (ARR) är en session ett nyckelkoncept. Den här artikeln förklarar exakt vad en session är.

Översikt

Azure Remote Rendering fungerar genom att avlasta komplexa renderingsuppgifter till molnet. Dessa återgivningsuppgifter kan inte utföras av vilken server som helst, eftersom de flesta molnservrar inte har GPU:er. På grund av mängden data som berörs och det hårda kravet på att producera resultat med interaktiva bildfrekvenser, kan ansvaret som servern hanterar som användarbegäran inte heller överlämnas till en annan dator i farten, vilket kan vara möjligt för vanligare webbtrafik.

Det innebär att när du använder Azure Remote Rendering måste en molnserver med nödvändiga maskinvarufunktioner reserveras exklusivt för att hantera dina renderingsbegäranden. En session refererar till allt som ingår i interaktionen med den här servern. Den börjar med den första begäran om att reservera (låna) en dator för din användning, fortsätter med alla kommandon för att läsa in och manipulera modeller och slutar med att frigöra lånet på molnservern.

Hantera sessioner

Det finns flera sätt att hantera och interagera med sessioner. Det språkoberoende sättet att skapa, uppdatera och stänga av sessioner är via REST API:et för sessionshantering. I C# och C++exponeras dessa åtgärder via klasserna RemoteRenderingClient och RenderingSession. För Unity-program finns det ytterligare verktygsfunktioner som tillhandahålls av komponenten ARRServiceUnity .

När du är ansluten till en aktiv session exponeras åtgärder som att läsa in modeller och interagera med scenen via RenderingSession klassen.

Hantera flera sessioner samtidigt

Det går inte att ansluta helt till flera sessioner från en enhet. Du kan dock skapa, observera och stänga av så många sessioner du vill från ett enda program. Så länge appen inte är avsedd att ansluta till en session behöver den inte heller köras på en enhet som HoloLens 2. Ett användningsfall för en sådan implementering kan vara om du vill styra sessioner via en central mekanism. Man kan till exempel skapa en webbapp, där flera surfplattor och HoloLens-enheter kan logga in. Sedan kan appen visa alternativ på surfplattorna, till exempel vilken CAD-modell som ska visas. Om en användare gör ett val meddelas den här informationen till alla HoloLens-enheter för att skapa en delad upplevelse.

Sessionsfaser

Varje session genomgår flera faser.

Sessionsstart

När du ber ARR att skapa en ny session är det första det gör att returnera en sessions-UUID. Med det här UUID:et kan du fråga efter information om sessionen. UUID och viss grundläggande information om sessionen sparas i 30 dagar, så du kan fråga den informationen även efter att sessionen har stoppats. Nu rapporteras sessionstillståndet som Start.

Därefter försöker Azure Remote Rendering hitta en server som kan vara värd för sessionen. Det finns två parametrar för den här sökningen. För det första reserverar den bara servrar i din region. Det beror på att nätverksfördröjningen mellan regioner kan vara för hög för att garantera en anständig upplevelse. Den andra faktorn är önskad storlek som du har angett. I varje region finns det ett begränsat antal servrar som kan uppfylla standard- eller Premium-storleksbegäran. Om alla servrar av den begärda storleken för närvarande används i din region misslyckas därför skapande av sessioner. Orsaken till felet kan efterfrågas.

Viktigt!

Om du begär en standardserverstorlek och begäran misslyckas på grund av hög efterfrågan innebär det inte att begäran om en Premium-server också misslyckas. Så om det är ett alternativ för dig kan du försöka falla tillbaka till en Premium-serverstorlek .

När tjänsten hittar en lämplig server måste den kopiera rätt virtuella dator (VM) till den för att göra den till en Azure Remote Rendering-värd. Den här processen tar flera minuter. Därefter startas den virtuella datorn och sessionstillståndet övergår till Klar.

I det här läget väntar servern uteslutande på dina indata. Det här är också den punkt där du debiteras för tjänsten.

Anslut till en session

När sessionen är klar kan du ansluta till den. När enheten är ansluten kan den skicka kommandon för att läsa in och ändra modeller. Varje ARR-värd hanterar bara en klientenhet i taget, så när en klient ansluter till en session har den exklusiv kontroll över det renderade innehållet. Det innebär också att renderingsprestanda aldrig varierar av orsaker utanför din kontroll.

Viktigt!

Även om endast en klient kan ansluta till en session kan grundläggande information om sessioner, till exempel deras aktuella tillstånd, efterfrågas utan att ansluta.

När en enhet är ansluten till en session misslyckas försök från andra enheter att ansluta. Men när den anslutna enheten kopplas från, antingen frivilligt eller på grund av någon form av fel, accepterar sessionen en annan anslutningsbegäran. Alla tidigare tillstånd (inlästa modeller och sådant) ignoreras så att nästa anslutande enhet får en ren skiffer. Därför kan sessioner återanvändas många gånger, av olika enheter och det kan vara möjligt att dölja sessionsstartens omkostnader för slutanvändaren i de flesta fall.

Viktigt!

Fjärrservern ändrar aldrig tillståndet för data på klientsidan. Alla mutationer av data (till exempel transformeringsuppdateringar och inläsningsbegäranden) måste utföras av klientprogrammet. Alla åtgärder uppdaterar omedelbart klienttillståndet.

Sessionens slut

När du begär en ny session anger du en maximal lånetid, vanligtvis inom intervallet en till åtta timmar. Det här är den varaktighet under vilken värden accepterar dina indata.

Det finns två vanliga orsaker till att en session avslutas. Antingen begär du att sessionen stoppas manuellt eller så går den maximala lånetiden ut. I båda fallen stängs alla aktiva anslutningar till värden direkt och tjänsten stängs av på servern. Servern ges sedan tillbaka till Azure-poolen och kan bli rekvirerad för andra ändamål. Det går inte att ångra eller avbryta en session. Om du kör frågor mot sessionstillståndet för en stoppad session returneras antingen Stoppad eller Förfallen, beroende på om den stängdes av manuellt eller på grund av att den maximala lånetiden uppnåddes.

En session kan också stoppas på grund av ett fel.

I samtliga fall debiteras du inte ytterligare när en session har stoppats.

Varning

Om du ansluter till en session och hur länge påverkar inte faktureringen. Vad du betalar för tjänsten beror på sessionsvaraktigheten, det vill säga den tid som en server är exklusivt reserverad för dig och de begärda maskinvarufunktionerna (den allokerade storleken). Om du startar en session ansluter du i fem minuter och sedan inte stoppar sessionen, så att den fortsätter att köras tills lånet upphör att gälla. Du debiteras för hela sessionslånetiden. Omvänt är den maximala lånetiden mestadels ett säkerhetsnät. Det spelar ingen roll om du begär en session med en lånetid på åtta timmar och sedan bara använder den i fem minuter, om du stoppar sessionen manuellt efteråt.

Utöka en sessions lånetid

Du kan förlänga lånetiden för en aktiv session, om det visar sig att du behöver den längre.

Exempelkod

Koden nedan visar en enkel implementering av att starta en session, vänta på det klara tillståndet, ansluta och sedan koppla från och stänga av igen.

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

Flera RemoteRenderingClient instanser och RenderingSession instanser kan underhållas, manipuleras och frågas från kod. Men bara en enda enhet kan ansluta till en RenderingSession i taget.

Livslängden för en virtuell dator är inte kopplad till instansen RemoteRenderingClient eller instansen RenderingSession . RenderingSession.StopAsync måste anropas för att stoppa en session.

Det beständiga sessions-ID:t kan frågas via RenderingSession.SessionUuid() och cachelagras lokalt. Med det här ID:t kan ett program anropa RemoteRenderingClient.OpenRenderingSessionAsync för att binda till den sessionen.

När RenderingSession.IsConnected är sant RenderingSession.Connection returnerar en instans av RenderingConnection, som innehåller funktioner för att läsa in modeller, manipulera entiteter och fråga efter information om den renderade scenen.

API-dokumentation

Nästa steg