Condividi tramite


Modalità di rendering

Rendering remoto offre due modalità principali di funzionamento, Modalità TileBasedComposition e modalità DepthBasedComposition. Queste modalità determinano la modalità di distribuzione del carico di lavoro tra più GPU nel server. La modalità deve essere specificata in fase di connessione e non può essere modificata durante il runtime.

Entrambe le modalità offrono vantaggi, ma anche limitazioni intrinseche delle funzionalità, quindi scegliere la modalità più adatta è specifica del caso d'uso.

Modalità

Le due modalità sono ora descritte in modo più dettagliato.

Modalità 'TileBasedComposition'

Nella modalità TileBasedComposition ogni GPU coinvolta esegue il rendering di sottotangli specifici (riquadri) sullo schermo. La GPU principale compone l'immagine finale dai riquadri prima che venga inviata come fotogramma video al client. Di conseguenza, tutte le GPU devono avere lo stesso set di risorse per il rendering, quindi gli asset caricati devono essere inseriti nella memoria di una singola GPU.

La qualità del rendering in questa modalità è leggermente migliore rispetto alla modalità DepthBasedComposition , poiché MSAA può funzionare sul set completo di geometria per ogni GPU. Lo screenshot seguente mostra che l'anti-aliasing funziona correttamente per entrambi i bordi in modo analogo:

MSAA in TileBasedComposition

Inoltre, in questa modalità ogni parte può essere passata a un materiale trasparente o passare alla modalità see-through tramite HierarchicalStateOverrideComponent

Modalità 'DepthBasedComposition'

In modalità DepthBasedComposition ogni GPU coinvolta esegue il rendering a schermo intero, ma solo un subset di mesh. La composizione dell'immagine finale sulla GPU principale si occupa del corretto unione delle parti in base alle informazioni di profondità. Naturalmente, il payload di memoria viene distribuito tra le GPU, consentendo così il rendering di modelli che non si adattano alla memoria di una singola GPU.

Ogni singola GPU usa MSAA per antialias contenuto locale. Tuttavia, potrebbe esserci un aliasing intrinseco tra i bordi da GPU distinte. Questo effetto è mitigato post-elaborazione dell'immagine finale, ma la qualità MSAA è ancora peggiore rispetto alla modalità TileBasedComposition .

Gli artefatti MSAA sono illustrati nell'immagine seguente: MSAA in DepthBasedComposition

L'antialiasing funziona correttamente tra la scultura e la tenda, perché entrambe le parti vengono rese sulla stessa GPU. D'altra parte, il bordo tra tenda e muro mostra alcuni alias perché queste due parti sono composte da GPU distinte.

La limitazione più grande di questa modalità è che le parti geometry non possono essere passate a materiali trasparenti in modo dinamico né funzionano in modalità see-through per l'oggetto HierarchicalStateOverrideComponent. Altre funzionalità di override dello stato (contorno, tinta di colore, ...) funzionano comunque. Anche i materiali contrassegnati come trasparenti in fase di conversione funzionano correttamente in questa modalità.

Prestazioni

Le caratteristiche delle prestazioni per entrambe le modalità variano in base al caso d'uso ed è difficile ragionare o fornire raccomandazioni generali. Se non sei vincolato dalle limitazioni indicate in precedenza (memoria o trasparenza/see-through), è consigliabile provare entrambe le modalità e monitorare le prestazioni usando varie posizioni della fotocamera.

Impostazione della modalità di rendering

La modalità di rendering usata in un server Rendering remoto viene specificata durante tramite RenderingSession.ConnectAsync .RendererInitOptions

async void ExampleConnect(RenderingSession session)
{
    RendererInitOptions parameters = new RendererInitOptions();

    // Connect with one rendering mode
    parameters.RenderMode = ServiceRenderMode.TileBasedComposition;
    await session.ConnectAsync(parameters);

    session.Disconnect();

    // Wait until session.IsConnected == false

    // Reconnect with a different rendering mode
    parameters.RenderMode = ServiceRenderMode.DepthBasedComposition;
    await session.ConnectAsync(parameters);
}

Documentazione sull'API

Passaggi successivi