Согласитесь с тем, что сказал Джерико, но есть дополнительная опция, которая заключается в том, чтобы не ограничивать себя одним VkBuffer
.
Как правило, вы хотите думать о VkDeviceMemory
в кратных страницах памяти (4 КБ), а в некоторых устройствах даже например, кратно 64 КБ. Даже если вы выделите нечто меньшее, чем это, вы, скорее всего, будете использовать столько памяти, поскольку ядро ОС не может дать вам вещи меньшими порциями.
Таким образом, если каждому преобразованию требуется 64 B, то вы можете просто планировать выделение в виде кусков 1k преобразований. Выделите одну пару 64 КиБ VkBuffer
/ VkDeviceMemory
, и, когда она заполнится, выделите вторую пару, когда она заполнится, выделите третью пару и т. Д.
Когда вы отправляетесь на рисование, вам понадобится отдельный вызов на рисование для каждого чанка с промежуточной привязкой буфера. Если вы обнаружите, что на практике вы рисуете огромное количество кубов, а количество вызовов отрисовки и изменения состояния ограничивают производительность, используйте больший размер чанка - вы все равно будете использовать память, поэтому выделяйте ее небольшими приращениями ничего не помогает.
Если вы сделаете это, то каждый раз, когда вы выделяете новый блок, вам нужен новый набор дескрипторов для него. Создайте это в то же время, а затем между отрисовками просто свяжите набор дескрипторов для буфера, который вы собираетесь использовать.
Если вместо этого вы перераспределяете буферы, то вам нужно либо дождаться завершения предыдущего рендеринга, и обновить набор дескрипторов, который у вас есть, прежде чем рисовать с перераспределенным буфером, или вы можете создать новый набор дескрипторов и немедленно отрисовать, а затем перезапустить старый дескриптор установлен, когда вы знаете, что чертеж, который использовал его, завершен.