Режимы отрисовки
Удаленная отрисовка предлагает два основных режима работы: TileBasedComposition и DepthBasedComposition. Эти режимы определяют распределение рабочей нагрузки между несколькими GPU на сервере. Режим должен быть указан во время соединения и не может быть изменен во время выполнения.
Оба режима имеют свои преимущества и ограничения, поэтому выбор зависит от варианта использования.
Режимы
Мы обсудим оба режима подробнее.
Режим TileBasedComposition
В режиме TileBasedComposition каждый задействованный GPU отрисовывает на экране определенные подпрямоугольники (фрагменты). Основной GPU формирует окончательное изображение из фрагментов перед отправкой клиенту в качестве видеокадра. Соответственно, все GPU должны иметь одинаковый набор ресурсов для отрисовки, поэтому загруженные ресурсы должны помещаться в память одного GPU.
Качество отрисовки в этом режиме немного выше, чем в режиме DepthBasedComposition, так как MSAA может работать с полным набором геометрических объектов для каждого GPU. На следующем снимке экрана показано, что сглаживание правильно работает для обеих кромок.
Более того, в этом режиме каждая часть может быть переключена на прозрачный материал или прозрачный режим с помощью HierarchicalStateOverrideComponent.
Режим DepthBasedComposition
В режиме DepthBasedComposition каждый задействованный GPU выполняет отрисовку в полноэкранном разрешении, но только для подмножества сеток. Окончательная композиция изображения на основном GPU учитывает объединение частей в соответствии со сведениями о глубине. Полезные данные памяти распределяются по GPU, что позволяет использовать модели отрисовки, которые не помещаются в память одного GPU.
Каждый GPU использует MSAA для сглаживания локального содержимого. Однако между краями в разных GPU могут возникать неровности. Этот эффект частично устраняется в ходе окончательной обработки на итоговом изображении, но качество MSAA все же ниже, чем в режиме TileBasedComposition.
Артефакты MSAA показаны на следующем рисунке:
Сглаживание правильно работает между скульптурой и портьерой, так как обе части отрисовываются на одном GPU. С другой стороны, мы видим неровности края между портьерой и стеной, поскольку эти части отрисовываются разными GPU.
Самым заметным ограничением этого режима является тот факт, что части геометрии нельзя динамически переключать на прозрачные материалы, а режим прозрачности для HierarchicalStateOverrideComponent не работает. Однако другие функции переопределения состояния (контур, цветовой оттенок и т. д.) работают. Кроме того, в этом режиме все материалы, помеченные как прозрачные во время преобразования, работают правильно.
Производительность
Характеристики производительности в обоих режимах различаются в зависимости от варианта использования, поэтому сложно предоставить общие рекомендации. Если вам не мешают упомянутые выше ограничения (память или прозрачность), рекомендуется испытать оба режима и отследить их производительность с помощью различных позиций камеры.
Настройка режима отрисовки
Режим отрисовки, используемый на сервере Удаленной отрисовки, задается во время 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);
}
Документация по API
- C# RenderingSession.ConnectAsync()
- Структура C# RendererInitOptions
- C++ RenderingSession::ConnectToConnectAsyncRuntime()
- Структура C++ RendererInitOptions