Sessions Remote Rendering

Dans Azure Remote Rendering (ARR), une session est un concept clé. Cet article explique précisément ce qu’est une session.

Vue d’ensemble

Azure Remote Rendering fonctionne en déplaçant les tâches de rendu complexes dans le cloud. Ces tâches de rendu ne peuvent pas être exécutées par n’importe quel serveur, car la plupart des serveurs cloud n’ont pas de GPU. Compte tenu de la quantité de données impliquées et de la nécessité incontournable de produire des résultats à des fréquences d’images interactives, la responsabilité du choix des serveurs devant traiter les différentes demandes des utilisateurs ne peut non plus être confiée à une autre machine à la volée, ce qui est possible pour le trafic web plus courant.

Ainsi, quand vous utilisez Azure Remote Rendering, un serveur cloud possédant les capacités matérielles nécessaires doit être exclusivement réservé au traitement de vos demandes de rendu. Une session fait référence à tout ce qu’implique l’interaction avec ce serveur. Elle commence par la demande initiale de réservation (bail) de la machine à utiliser, se poursuit avec toutes les commandes de chargement et de manipulation de modèles et se termine par la libération du bail sur le serveur cloud.

Gestion des sessions

Il existe plusieurs façons de gérer les sessions et d’interagir avec celles-ci. L’API REST de gestion de session offre un moyen indépendant du langage de créer, de mettre à jour et d’arrêter des sessions. En C# et C++, ces opérations sont exposées par le biais des classes RemoteRenderingClient et RenderingSession. Pour les applications Unity, d’autres fonctions utilitaires sont fournies par le composant ARRServiceUnity.

Quand vous êtes connecté à une session active, les opérations telles que le chargement de modèles et l’interaction avec la scène sont exposées par le biais de la classe RenderingSession.

Gestion simultanée de plusieurs sessions

Vous ne pouvez pas vous connecter complètement à plusieurs sessions à partir d’un même appareil. Toutefois, vous pouvez créer, observer et arrêter autant de sessions que vous le souhaitez à partir d’une même application. Tant que l’application n’est pas censée se connecter à une session, il n’est pas non plus nécessaire qu’elle s’exécute sur un appareil comme HoloLens 2. Le contrôle de sessions à partir d’un mécanisme central peut représenter un cas d’usage pour une telle implémentation. Par exemple, il est possible de créer une application web à laquelle plusieurs tablettes et appareils HoloLens peuvent se connecter. L’application peut ensuite afficher des options sur les tablettes comme le modèle de CAO à afficher. Si un utilisateur effectue une sélection, ces informations sont communiquées à tous les appareils HoloLens pour créer une expérience partagée.

Phases d’une session

Chaque session se compose de plusieurs phases.

Démarrage de la session

Quand vous demandez à ARR de créer une session, il commence par retourner un UUID de session. Cet UUID vous permet de demander des informations sur la session. L’UUID est conservé pendant 30 jours de même que certaines informations de base sur la session. Vous pouvez donc demander ces informations même après l’arrêt de la session. À ce stade, l’état de la session indiqué est Démarrage.

Ensuite, Azure Remote Rendering tente de trouver un serveur qui peut héberger votre session. Deux paramètres sont pris en compte pour cette recherche. Tout d’abord, ARR ne réserve que des serveurs de votre région. En effet, la latence du réseau entre régions peut être trop élevée pour garantir une expérience correcte. Le deuxième facteur est la taille souhaitée que vous avez spécifiée. Chaque région inclut un nombre limité de serveurs pouvant répondre à une demande de taille Standard ou Premium. Ainsi, si tous les serveurs de la taille demandée sont en cours d’utilisation dans votre région, la création de la session échoue. Vous pouvez demander la raison de l’échec.

Important

Si vous demandez une taille de serveur Standard et que la demande échoue en raison d’une forte sollicitation, cela ne signifie pas qu’une demande de serveur Premium échouera également. Si vous disposez de cette option, vous pouvez donc essayer de revenir à un serveur Premium.

Quand le service trouve un serveur adéquat, il doit copier la machine virtuelle appropriée sur celui-ci pour en faire un hôte Azure Remote Rendering. Cette opération prend plusieurs minutes. Ensuite, la machine virtuelle est démarrée et l’état de la session devient Prêt.

À ce stade, le serveur attend votre entrée uniquement. C’est également à partir de ce moment que vous êtes facturé pour le service.

Connexion à une session

Quand la session est à l’état Prêt, vous pouvez vous y connecter. Quand vous êtes connecté, l’appareil peut envoyer des commandes pour charger et modifier des modèles. Chaque hôte ARR ne sert qu’un appareil client à la fois. Ainsi, quand un client se connecte à une session, il dispose d’un contrôle exclusif sur le contenu rendu. Ceci signifie également que les performances de rendu ne varient jamais pour des raisons échappant à votre contrôle.

Important

Même si un seul client peut se connecter à une session, les informations de base sur les sessions (comme leur état actuel) peuvent être demandées sans connexion.

Quand un appareil est connecté à une session, les tentatives de connexion des autres appareils échouent. Toutefois, dès lors que l’appareil connecté se déconnecte (volontairement ou à la suite d’une défaillance quelconque), la session accepte une autre demande de connexion. L’état précédent (modèles chargés, etc.) est supprimé, et le prochain appareil qui se connecte bénéficie d’un environnement propre. Les sessions peuvent donc être réutilisées plusieurs fois par différents appareils, et, dans la plupart des cas, il est possible de rendre la surcharge de démarrage de session imperceptible pour l’utilisateur final.

Important

Le serveur distant ne modifie jamais l’état des données côté client. Toutes les mutations de données (mises à jour de transformation et demandes de chargement, par exemple) doivent être effectuées par l’application cliente. Toutes les actions mettent immédiatement à jour l’état du client.

Fin de la session

Quand vous demandez une nouvelle session, vous spécifiez une durée de bail maximale, en général dans une plage d’une à huit heures. Il s’agit de la durée pendant laquelle l’hôte acceptera votre entrée.

Il existe deux raisons courantes pour lesquelles une session peut prendre fin : vous demandez manuellement l’arrêt de la session ou la durée de bail maximale a expiré. Dans les deux cas, toute connexion active à l’hôte est immédiatement fermée et le service est arrêté sur ce serveur. Le serveur est alors réintégré au pool Azure et peut être réservé à d’autres fins. L’arrêt d’une session ne peut pas être annulé. Quand vous demandez l’état de la session sur une session arrêtée, la demande retourne Arrêté ou Expiré selon que la session a été arrêtée manuellement ou que la durée de bail maximale a été atteinte.

Une session peut également être arrêtée en raison d’une défaillance.

Dans tous les cas, la facturation prend fin dès lors qu’une session est arrêtée.

Avertissement

Le fait que vous soyez connecté ou non à une session (et pendant combien de temps) n’affecte pas la facturation. Ce que vous payez pour le service dépend de la durée de la session (c’est-à-dire de la durée pendant laquelle un serveur vous est exclusivement réservé) et des capacités matérielles demandées (taille allouée). Si vous démarrez une session, que vous vous connectez pendant cinq minutes et que vous n’arrêtez pas la session (qui continue de s’exécuter jusqu’à ce que son bail expire), vous serez facturé pour toute la durée de bail de la session. La durée de bail maximale peut, quant à elle, être considérée comme un filet de sécurité. Vous pouvez demander une session avec une durée de bail de huit heures, puis l’utiliser seulement pendant cinq minutes. Ceci n’a pas d’importance si vous arrêtez la session manuellement par la suite.

Prolonger la durée du bail d’une session

Vous pouvez prolonger la durée du bail d’une session active si vous en avez besoin plus longtemps.

Exemple de code

Le code ci-dessous illustre une implémentation simple incluant le démarrage d’une session, l’attente de l’état Prêt, la connexion, la déconnexion et l’arrêt.

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

Vous pouvez gérer, manipuler et interroger plusieurs instances RemoteRenderingClient et RenderingSession à partir du code. Toutefois, un seul appareil peut se connecter à une instance RenderingSession à la fois.

La durée de vie d’une machine virtuelle n’est pas liée à l’instance RemoteRenderingClient ou à l’instance RenderingSession. RenderingSession.StopAsync doit être appelé pour arrêter une session.

L’ID de session persistant peut être demandé avec RenderingSession.SessionUuid() et mis en cache localement. Avec cet ID, une application peut appeler RemoteRenderingClient.OpenRenderingSessionAsync pour se lier à cette session.

Quand RenderingSession.IsConnected a la valeur true, RenderingSession.Connection retourne une instance de RenderingConnection, qui contient les fonctions permettant de charger des modèles, de manipuler des entités et de demander des informations sur la scène rendue.

Documentation de l’API

Étapes suivantes