Вулкан: Отдельные буферы вершин или динамические буферы вершин?

#c #vulkan

Вопрос:

Итак, я начинаю изучать Вулкан, и я все еще ничего не сделал с несколькими объектами, дело в том, что если я создаю игровой движок и внедряю что-то вроде «перетаскивания», когда вы перетаскиваете, например, куб с панели и помещаете его в сцену, лучше ли… ?

  • Имейте отдельные буферы вершин.
  • Есть только один, и сделайте его похожим на std::vector класс или что-то в этом роде, но это звучит очень медленно, учитывая, что мне приходится выполнять операцию переноса с буферами команд каждый раз, когда требуется изменить размер (каждый раз, когда в сцену добавляется новый объект).

Ответ №1:

Растущий буфер вершин-это, как правило, правильный путь, имейте в виду, что Vulkan имеет очень ограниченные дескрипторы буфера каждого типа и предназначен для выделения дополнительных ресурсов (как в старой школе C). Выдержка из рекомендаций NVIDIA Vulkan:

Используйте выделение дополнительной памяти. vkAllocateMemory () — это дорогостоящая операция на процессоре. Стоимость может быть снижена за счет перераспределения из объекта большой памяти. Память выделяется на страницах с фиксированным размером; выделение дополнительных ресурсов помогает уменьшить объем памяти.

Единственное замечание здесь заключается в том, чтобы агрессивно распределять свой буфер настолько, насколько вы считаете, что он будет расти. Другой пункт на этой странице предупреждает вас о том, чтобы не доводить память до предела, ОС откажется и убьет вашу программу, если вы не справитесь с этим:

Когда память в Windows переполнена, ОС может временно приостановить процесс из списка запуска GPU, чтобы отобразить его распределения, чтобы освободить место для распределения другого процесса. В Linux нет диспетчера памяти ОС, который бы снижал чрезмерную нагрузку за счет автоматического выполнения операций подкачки на объекты памяти.

Комментарии:

1. Поскольку я не сталкивался ни с одним крупномасштабным движком, как это делают такие крупные, как Unreal? Выделяют ли они 1 ГБ видеопамяти при запуске программы и оставляют ли ее неиспользованной или как это происходит?

2. Ничего такого радикального, обычно вы точно знаете, что рисуете, поэтому можете выделить ровно столько памяти, сколько вам нужно.