буферизация Direct3D операций рисования - PullRequest
0 голосов
/ 31 декабря 2011

Вопрос относится к 2D.

Я постоянно обновляю текстуру, которая является целью рендеринга для одного из моих слоев. Обновление представляет собой полную перерисовку текстуры и выполняется путем рисования спрайтов и вывода текста. Операция выполняется часто, потребляет довольно много ресурсов процессора, и я, конечно, оптимизировал количество перерисовок, чтобы уменьшить ее.

Есть ли способ буферизовать эти операции в Direct3D? Потому что в настоящее время мне приходится многократно создавать цепочку спрайтов / текстовых операций. Предположим, что любая игра выполняет обновление мира - как они преодолевают эту утомительную работу? Может быть, создав больше слоев?

Лучшим для меня было бы создание изменяемого объекта рисованной цепочки, но я не нашел ничего подобного в Direct3D.

1 Ответ

1 голос
/ 31 декабря 2011

Есть несколько общих методов, на которые вы можете посмотреть:

  • Пакетирование: упорядочивайте и комбинируйте розыгрыши, чтобы выполнить как можно меньше вызовов и нарисовать как можно больше объектов между изменениями состояния.
  • Кэш: сохраняйте как можно больше геометрии в буферах вершин. С 2D это становится более интересным, так как большинство вещей являются текстурированными квадраторами. В таком случае ...
  • Шейдеры: может быть возможно написать вершинный шейдер, который принимает float4, задающий X / Y позицию / размер вашего четырехугольника, затем используйте его для рисования 4 вершин. Тогда вам не нужно будет выполнять полные изменения состояния матрицы, просто обновите 4 числа с плавающей точкой в ​​своем шейдере (пропускаются все вычисления вида, на 75% меньше памяти и математика). Чтобы убедиться, что с шейдерами используются правильные настройки, ...
  • State Blocks: Сохранить блок состояния для каждого типа спрайта со всеми цветами, режимами и шейдерами. Затем просто примените блок состояния, свяжите свои текстуры, установите координаты и нарисуйте. В лучшем случае вы можете получить каждый спрайт до 4 вызовов. Даже до сих пор ...
  • Cull: Лучше вообще ничего не рисовать. Если вы можете выполнить простую проверку границ экрана (может быть быстрее, чем выборка для каждого поли, что будет сделано в противном случае), сортировка и базовая окклюзия (помечать спрайты прозрачностью). С 2D большинство проверок отбраковки очень и очень дешево. Сортируйте, обрезайте и отбирайте, где можете.

Что касается фактической буферизации, драйвер будет обрабатывать это для вас, когда и где это уместно. Блоки состояния могут влиять на буферизацию, предоставляя все режимы за один вызов (я забываю, хорошо это или плохо, хотя я считаю, что они могут быть полезны). Сокращение звонков на:

if (sprite.Visible && Active(sprite) && OnScreen(sprite))
{
    states[sprite.Type]->Apply(); 
    device->BindTexture(sprite.Texture); 
    device->SetVertexShaderF(sprite.PositionSize); 
    device->Draw(quad);
}

очень вероятно поможет с использованием процессора.

...