Поделиться через


Режимы отрисовки

Удаленная отрисовка предлагает два основных режима работы: TileBasedComposition и DepthBasedComposition. Эти режимы определяют распределение рабочей нагрузки между несколькими GPU на сервере. Режим должен быть указан во время соединения и не может быть изменен во время выполнения.

Оба режима имеют свои преимущества и ограничения, поэтому выбор зависит от варианта использования.

Режимы

Мы обсудим оба режима подробнее.

Режим TileBasedComposition

В режиме TileBasedComposition каждый задействованный GPU отрисовывает на экране определенные подпрямоугольники (фрагменты). Основной GPU формирует окончательное изображение из фрагментов перед отправкой клиенту в качестве видеокадра. Соответственно, все GPU должны иметь одинаковый набор ресурсов для отрисовки, поэтому загруженные ресурсы должны помещаться в память одного GPU.

Качество отрисовки в этом режиме немного выше, чем в режиме DepthBasedComposition, так как MSAA может работать с полным набором геометрических объектов для каждого GPU. На следующем снимке экрана показано, что сглаживание правильно работает для обеих кромок.

MSAA in TileBasedComposition

Более того, в этом режиме каждая часть может быть переключена на прозрачный материал или прозрачный режим с помощью HierarchicalStateOverrideComponent.

Режим DepthBasedComposition

В режиме DepthBasedComposition каждый задействованный GPU выполняет отрисовку в полноэкранном разрешении, но только для подмножества сеток. Окончательная композиция изображения на основном GPU учитывает объединение частей в соответствии со сведениями о глубине. Полезные данные памяти распределяются по GPU, что позволяет использовать модели отрисовки, которые не помещаются в память одного GPU.

Каждый GPU использует MSAA для сглаживания локального содержимого. Однако между краями в разных GPU могут возникать неровности. Этот эффект частично устраняется в ходе окончательной обработки на итоговом изображении, но качество MSAA все же ниже, чем в режиме TileBasedComposition.

Артефакты MSAA показаны на следующем рисунке: MSAA in DepthBasedComposition

Сглаживание правильно работает между скульптурой и портьерой, так как обе части отрисовываются на одном 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

Следующие шаги