Unity 6.3
0 онлайн 96 гостей 3 в системе
Вход
Конвейеры отображения Шаг 103 из 129

Оптимизация графика отображения

Чтобы оптимизировать график рендеринга, объедините или уменьшите количество проходов рендеринга. Чем больше проходов рендеринга, тем больше данных CPU и GPU нужно хранить и извлекать из памяти. Это замедляет рендеринг, особенно на устройствах, которые используют отложенное рендеринг на основе плиток (TBDR).

Использовать существующие копии буферов цвета или глубины

Если вам нужна копия буферов цвета или глубины, избегайте копирования их самим, если это возможно. Используйте копии, созданные URP по умолчанию, чтобы избежать создания ненужных проходов рендеринга.

Используйте ConfigureInput API, чтобы убедиться, что URP генерирует текстуру, которая вам нужна в данных кадра.

Чтобы проверить, создает ли URP копии во время кадра, которые можно использовать, проверьте следующие прохождения в Render Graph Viewer:

  • Цвет копирования — копирует цвет из _CameraTargetAttachment до cameraOpaqueTexture в 2000 году кадровые данные.
  • Глубина копирования — копирует глубину от _CameraDepthAttachment до cameraDepthTexture в 2000 году кадровые данные.

Объединение проходов рендеринга

Используйте Render Graph Viewer, чтобы проверить причину, по которой URP не может объединить проходы рендеринга, и исправить проблему, если это возможно. На устройствах, использующих отложенное рендеринг на основе плиток (TBDR), объединение проходов помогает устройству использовать меньше энергии и работать дольше.

Вы можете сделать следующее, чтобы убедиться, что URP объединяет прохождения рендеринга:

  • Используйте AddRasterRenderPass вместо других типов рендеринга, насколько это возможно.
  • Если проход рендеринга требует только чтения текущего пикселя из кадрового буфера, а не соседних пикселей, используйте макросы SetInputAttachment API и LOAD_FRAMEBUFFER_X_INPUT. Дополнительную информацию см. в Получить текущий кадровый буфер из памяти GPU.

Сокращение количества проходов рендеринга

Не создавайте ненужные проходы рендеринга, чтобы организовать код в меньшие, более управляемые куски. Каждый проход рендеринга, который вы создаете, требует больше времени обработки на CPU.

Для написания комбинированных проходов рендеринга можно использовать AddUnsafePass API, но рендеринг может быть медленнее, потому что URP не может оптимизировать проход рендеринга. Дополнительные сведения см. Использование интерфейса CommandBuffer в графе рендеринга.

Избегайте блитинга в цветовой буфер и из него

Чтобы избежать создания двух проходов рендеринга, которые блит от и к цветовой текстуре камеры, используйте объект ContextContainer для чтения и записи в цветовой буфер напрямую.

Например:

public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData)
{

    // Fetch the frame data textures
    var resourceData = frameData.Get<UniversalResourceData>();

    // Set the source as the color texture the camera currently targets
    var source = resourceData.activeColorTexture;
    
    // Create a destination texture, with the same dimensions as the source
    var destinationDescriptor = renderGraph.GetTextureDesc(source);
    destinationDescriptor.name = "DestinationTexture";
    destinationDescriptor.clearBuffer = false;
    TextureHandle destination = renderGraph.CreateTexture(destinationDescriptor);

    // Use the AddBlitPass API to create a simple blit from the source to the destination
    RenderGraphUtils.BlitMaterialParameters parameters = new(source, destination, BlitMaterial, 0);
    renderGraph.AddBlitPass(parameters, passName: "MyRenderPass");

    // Set the main color texture for the camera as the destination texture
    resourceData.cameraColor = destination;
}

Дополнительные ресурсы