Оптимизация графика отображения
Чтобы оптимизировать график рендеринга, объедините или уменьшите количество проходов рендеринга. Чем больше проходов рендеринга, тем больше данных CPU и GPU нужно хранить и извлекать из памяти. Это замедляет рендеринг, особенно на устройствах, которые используют отложенное рендеринг на основе плиток (TBDR).
Использовать существующие копии буферов цвета или глубины
Если вам нужна копия буферов цвета или глубины, избегайте копирования их самим, если это возможно. Используйте копии, созданные URP по умолчанию, чтобы избежать создания ненужных проходов рендеринга.
Используйте ConfigureInput API, чтобы убедиться, что URP генерирует текстуру, которая вам нужна в данных кадра.
Чтобы проверить, создает ли URP копии во время кадра, которые можно использовать, проверьте следующие прохождения в Render Graph Viewer:
- Цвет копирования — копирует цвет из
_CameraTargetAttachmentдоcameraOpaqueTextureв 2000 году кадровые данные. - Глубина копирования — копирует глубину от
_CameraDepthAttachmentдоcameraDepthTextureв 2000 году кадровые данные.
Объединение проходов рендеринга
Используйте Render Graph Viewer, чтобы проверить причину, по которой URP не может объединить проходы рендеринга, и исправить проблему, если это возможно. На устройствах, использующих отложенное рендеринг на основе плиток (TBDR), объединение проходов помогает устройству использовать меньше энергии и работать дольше.
Вы можете сделать следующее, чтобы убедиться, что URP объединяет прохождения рендеринга:
- Используйте
AddRasterRenderPassвместо других типов рендеринга, насколько это возможно. - Если проход рендеринга требует только чтения текущего пикселя из кадрового буфера, а не соседних пикселей, используйте макросы
SetInputAttachmentAPI и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;
}