Sesje usługi Remote Rendering
W usłudze Azure Remote Rendering (ARR) sesja jest kluczową koncepcją. W tym artykule wyjaśniono, czym dokładnie jest sesja.
Omówienie
Usługa Azure Remote Rendering działa przez odciążanie złożonych zadań renderowania do chmury. Te zadania renderowania nie mogą być realizowane tylko przez żaden serwer, ponieważ większość serwerów w chmurze nie ma procesorów GPU. Ze względu na ilość danych i twarde wymaganie generowania wyników przy interakcyjnych szybkościach klatek, odpowiedzialność za serwer, który obsługuje żądanie użytkownika, nie może być również przekazywany do innej maszyny na bieżąco, co może być możliwe w przypadku bardziej typowego ruchu internetowego.
Oznacza to, że w przypadku korzystania z usługi Azure Remote Rendering serwer w chmurze z niezbędnymi możliwościami sprzętowymi musi być zarezerwowany wyłącznie do obsługi żądań renderowania. Sesja odnosi się do wszystkich elementów związanych z interakcją z tym serwerem. Rozpoczyna się od początkowego żądania zarezerwowania (dzierżawy) maszyny do użycia, kontynuuje wszystkie polecenia ładowania i manipulowania modelami, a kończy się zwolnieniem dzierżawy na serwerze w chmurze.
Zarządzanie sesjami
Istnieje wiele sposobów zarządzania sesjami i interakcji z nimi. Niezależny od języka sposób tworzenia, aktualizowania i zamykania sesji odbywa się za pośrednictwem interfejsu API REST zarządzania sesjami. W językach C# i C++te operacje są udostępniane za pośrednictwem klas RemoteRenderingClient
i RenderingSession
. W przypadku aplikacji aparatu Unity istnieją dodatkowe funkcje narzędzi udostępniane przez ARRServiceUnity
składnik .
Po nawiązaniu połączenia z aktywną sesją operacje, takie jak ładowanie modeli i interakcja ze scenąRenderingSession
, są widoczne za pośrednictwem klasy .
Zarządzanie wieloma sesjami jednocześnie
Nie można w pełni nawiązać połączenia z wieloma sesjami z jednego urządzenia. Można jednak tworzyć, obserwować i zamykać dowolną liczbę sesji z jednej aplikacji. Jeśli aplikacja nie ma nigdy łączyć się z sesją, nie musi działać na urządzeniu, np. HoloLens 2. Przypadek użycia takiej implementacji może być taki, jeśli chcesz kontrolować sesje za pośrednictwem centralnego mechanizmu. Można na przykład skompilować aplikację internetową, w której można zalogować się na wielu tabletach i urządzeniach HoloLens. Następnie aplikacja może wyświetlać opcje na tabletach, takie jak model CAD do wyświetlenia. Jeśli użytkownik dokona wyboru, te informacje są przekazywane do wszystkich urządzeń HoloLens w celu utworzenia środowiska udostępnionego.
Fazy sesji
Każda sesja przechodzi wiele faz.
Uruchamianie sesji
Gdy poprosisz usługę ARR o utworzenie nowej sesji, pierwszą rzeczą, jaką robi, jest zwrócenie identyfikatora UUID sesji. Ten identyfikator UUID umożliwia wykonywanie zapytań o informacje o sesji. Identyfikator UUID i niektóre podstawowe informacje o sesji są utrwalane przez 30 dni, dzięki czemu można wykonywać zapytania dotyczące tych informacji nawet po zatrzymaniu sesji. W tym momencie stan sesji zostanie zgłoszony jako Uruchamianie.
Następnie usługa Azure Remote Rendering próbuje znaleźć serwer, który może hostować sesję. Dla tego wyszukiwania istnieją dwa parametry. Najpierw rezerwuje tylko serwery w Twoim regionie. Wynika to z faktu, że opóźnienie sieci w różnych regionach może być zbyt wysokie, aby zagwarantować przyzwoite środowisko. Drugi czynnik to żądany rozmiar , który został określony. W każdym regionie istnieje ograniczona liczba serwerów, które mogą spełniać żądanie rozmiaru w warstwie Standardowa lub Premium. W związku z tym, jeśli wszystkie serwery żądanego rozmiaru są obecnie używane w Twoim regionie, tworzenie sesji zakończy się niepowodzeniem. Przyczyną niepowodzenia może być zapytanie.
Ważne
Jeśli zażądasz rozmiaru serwera w warstwie Standardowa i żądanie zakończy się niepowodzeniem z powodu dużego zapotrzebowania, nie oznacza to również, że żądanie serwera Premium zakończy się niepowodzeniem. Jeśli więc jest to opcja, możesz spróbować powrócić do rozmiaru serwera Premium .
Gdy usługa znajdzie odpowiedni serwer, musi skopiować odpowiednią maszynę wirtualną na nią, aby przekształcić ją w hosta usługi Azure Remote Rendering. Ten proces trwa kilka minut. Następnie maszyna wirtualna zostanie uruchomiony, a stan sesji zmieni się na Gotowe.
W tym momencie serwer oczekuje wyłącznie na dane wejściowe. Jest to również punkt, z którego naliczane są opłaty za usługę.
Połączenie do sesji
Gdy sesja będzie gotowa, możesz nawiązać z nią połączenie . Po nawiązaniu połączenia urządzenie może wysyłać polecenia w celu załadowania i zmodyfikowania modeli. Każdy host ARR zawsze obsługuje tylko jedno urządzenie klienckie w danym momencie, więc gdy klient nawiązuje połączenie z sesją, ma wyłączną kontrolę nad renderowaną zawartością. Oznacza to również, że wydajność renderowania nigdy nie będzie się różnić z powodów spoza kontrolki.
Ważne
Chociaż tylko jeden klient może nawiązać połączenie z sesją, podstawowe informacje o sesjach, takie jak ich bieżący stan, mogą być odpytywane bez nawiązywania połączenia.
Gdy urządzenie jest połączone z sesją, próby nawiązania połączenia przez inne urządzenia nie powiedzą się. Jednak po rozłączeniu połączonego urządzenia, dobrowolnie lub z powodu pewnego rodzaju awarii, sesja zaakceptuje kolejne żądanie połączenia. Wszystkie poprzednie stany (załadowane modele i takie) są odrzucane, tak aby następne urządzenie łączące się pobierało czysty łupek. W związku z tym sesje mogą być używane wiele razy przez różne urządzenia i w większości przypadków można ukryć obciążenie uruchamiania sesji od użytkownika końcowego.
Ważne
Serwer zdalny nigdy nie zmienia stanu danych po stronie klienta. Wszystkie mutacje danych (takie jak przekształcanie aktualizacji i żądań ładowania) muszą być wykonywane przez aplikację kliencą. Wszystkie akcje natychmiast aktualizują stan klienta.
Zakończenie sesji
Podczas żądania nowej sesji należy określić maksymalny czas dzierżawy, zazwyczaj w zakresie od jednego do ośmiu godzin. Jest to czas, w którym host zaakceptuje dane wejściowe.
Istnieją dwa regularne przyczyny zakończenia sesji. Ręcznie zażądasz zatrzymania sesji lub upływu maksymalnego czasu dzierżawy. W obu przypadkach aktywne połączenie z hostem jest zamykane od razu, a usługa jest zamykana na tym serwerze. Następnie serwer jest zwracany do puli platformy Azure i może zostać pobrany z innych celów. Zatrzymanie sesji nie może zostać cofnięte ani anulowane. Wykonywanie zapytań dotyczących stanu sesji w zatrzymanej sesji zwróci wartość Zatrzymano lub Wygasło, w zależności od tego, czy została ona ręcznie zamknięta, czy z powodu osiągnięcia maksymalnego czasu dzierżawy.
Sesja może być również zatrzymana z powodu niektórych awarii.
We wszystkich przypadkach opłaty nie będą naliczane dalej po zatrzymaniu sesji.
Ostrzeżenie
Bez względu na to, czy nawiązujesz połączenie z sesją i jak długo, nie ma to wpływu na rozliczenia. To, co płacisz za usługę, zależy od czasu trwania sesji, co oznacza czas, w którym serwer jest zarezerwowany wyłącznie dla Ciebie, oraz żądane możliwości sprzętowe ( przydzielony rozmiar). Jeśli rozpoczniesz sesję, połączysz się przez pięć minut, a następnie nie zatrzymasz sesji, tak aby była ona uruchomiona do momentu wygaśnięcia dzierżawy, opłata zostanie naliczona za pełny czas dzierżawy sesji. Z drugiej strony maksymalny czas dzierżawy jest głównie siecią bezpieczeństwa. Nie ma znaczenia, czy zażądasz sesji z godziną dzierżawy 8 godzin, a następnie użyjesz jej tylko przez pięć minut, jeśli ręcznie zatrzymasz sesję później.
Rozszerzanie czasu dzierżawy sesji
Możesz przedłużyć czas dzierżawy aktywnej sesji, jeśli okaże się, że jest on potrzebny dłużej.
Przykładowy kod
Poniższy kod przedstawia prostą implementację uruchamiania sesji, oczekiwanie na stan gotowości , nawiązywanie połączenia, a następnie rozłączanie i zamykanie ponownie.
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();
Wiele RemoteRenderingClient
wystąpień i RenderingSession
można konserwować, manipulować nimi i wykonywać zapytania z poziomu kodu. Jednak tylko jedno urządzenie może łączyć się z danym RenderingSession
urządzeniem naraz.
Okres istnienia maszyny wirtualnej nie jest powiązany z RemoteRenderingClient
wystąpieniem ani wystąpieniem RenderingSession
. RenderingSession.StopAsync
należy wywołać polecenie , aby zatrzymać sesję.
Identyfikator sesji trwałej można wykonywać zapytania za pośrednictwem i RenderingSession.SessionUuid()
buforować lokalnie. Za pomocą tego identyfikatora aplikacja może wywołać metodę RemoteRenderingClient.OpenRenderingSessionAsync
powiązania z tą sesją.
Gdy RenderingSession.IsConnected
wartość ma wartość true, RenderingSession.Connection
zwraca wystąpienie RenderingConnection
klasy , które zawiera funkcje do ładowania modeli, manipulowania jednostkami i wykonywania zapytań o renderowaną scenę.
Dokumentacja interfejsu API
- C# RenderingSession, klasa
- C# RemoteRenderingClient.CreateNewRenderingSessionAsync()
- C# RemoteRenderingClient.OpenRenderingSessionAsync()
- C++ RenderingSession, klasa
- C++ RemoteRenderingClient::CreateNewRenderingSessionAsync
- C++ RemoteRenderingClient::OpenRenderingSession