Modos de composição
A renderização remota oferece dois modos principais de operação, o modo TileBasedComposition e o modo DepthBasedComposition. Esses modos determinam como a carga de trabalho é distribuída por várias GPUs no servidor. O modo deve ser especificado no momento da conexão e não pode ser alterado durante o tempo de execução.
Ambos os modos vêm com vantagens, mas também com limitações de recursos inerentes, portanto, escolher o modo mais adequado é específico do caso de uso.
Modos
Os dois modos são agora discutidos em mais pormenor.
Modo 'TileBasedComposition'
No modo TileBasedComposition , cada GPU envolvida renderiza subretângulos específicos (blocos) na tela. A GPU principal compõe a imagem final dos blocos antes de ser enviada como um quadro de vídeo para o cliente. Assim, todas as GPUs precisam ter o mesmo conjunto de recursos para renderização, portanto, os ativos carregados precisam caber na memória de uma única GPU.
A qualidade de renderização neste modo é ligeiramente melhor do que no modo DepthBasedComposition, uma vez que o MSAA pode trabalhar no conjunto completo de geometria para cada GPU. A captura de tela a seguir mostra que a suavização de borda funciona corretamente para ambas as bordas da mesma forma:
Além disso, neste modo, cada peça pode ser comutada para um material transparente ou comutada para o modo transparente através do HierarchicalStateOverrideComponent
Modo 'DepthBasedComposition'
No modo DepthBasedComposition , cada GPU envolvida é renderizada em resolução de tela cheia, mas apenas um subconjunto de malhas. A composição final da imagem na GPU principal cuida para que as partes sejam mescladas corretamente de acordo com suas informações de profundidade. Naturalmente, a carga útil de memória é distribuída pelas GPUs, permitindo assim renderizar modelos que não caberiam na memória de uma única GPU.
Cada GPU usa MSAA para antialias conteúdo local. No entanto, pode haver aliasing inerente entre bordas de GPUs distintas. Esse efeito é atenuado pelo pós-processamento da imagem final, mas a qualidade do MSAA ainda é pior do que no modo TileBasedComposition .
Os artefatos MSAA são ilustrados na imagem a seguir:
A suavização de borda funciona corretamente entre a escultura e a cortina, porque ambas as partes são renderizadas na mesma GPU. Por outro lado, a borda entre cortina e parede mostra algum aliasing porque essas duas partes são compostas por GPUs distintas.
A maior limitação desse modo é que as peças de geometria não podem ser alternadas para materiais transparentes dinamicamente nem o modo transparente funciona para o HierarchicalStateOverrideComponent. Outros recursos de substituição de estado (contorno, tonalidade de cor, ...) funcionam, no entanto. Além disso, os materiais que foram marcados como transparentes no momento da conversão funcionam corretamente neste modo.
Desempenho
As características de desempenho para ambos os modos variam com base no caso de uso, e é difícil raciocinar ou fornecer recomendações gerais. Se você não estiver limitado pelas limitações mencionadas acima (memória ou transparência/transparência), recomenda-se experimentar ambos os modos e monitorar o desempenho usando várias posições da câmera.
Definindo o modo de renderização
O modo de renderização usado em um servidor de renderização remota é especificado durante RenderingSession.ConnectAsync
o 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);
}
Documentação da API
- C# RenderingSession.ConnectAsync()
- C# RendererInitOptions struct
- C++ RenderingSession::ConnectToConnectAsyncRuntime()
- C++ RendererInitOptions struct