vkUpdateDescriptorSets
не синхронизируется ни с чем.Поэтому вы не можете обновить набор дескрипторов, пока он используется.Вы должны убедиться, что все операции рендеринга, использующие рассматриваемый набор дескрипторов, завершены, и что никакие команды не были помещены в буферы команд, которые используют рассматриваемый набор.
Это в основном похоже на глобальную переменную;Вы не можете иметь людей, обращающихся к глобальной переменной из многочисленных потоков без какой-либо синхронизации.И Vulkan не синхронизирует доступ к наборам дескрипторов.
Есть несколько способов справиться с этим.Вы можете дать каждому объекту свой собственный набор дескрипторов.Обычно это делается, когда данные часто меняющегося набора дескрипторов имеют более высокий индекс, чем менее часто изменяющиеся данные.Таким образом, вы не изменяете каждый дескриптор для каждого объекта, а только те, которые изменяются для каждого объекта.
Вы можете использовать постоянные данные для индексации больших таблиц / текстур массивов.Таким образом, набор дескрипторов будет иметь массив текстур или массив текстур (если у вас есть динамическая индексация для массивов текстур).Константа push обеспечивает индекс, который используется шейдером для извлечения текстуры конкретного объекта из массива texture / array of textures.Это делает частые изменения довольно дешевыми, и тот же индекс может также использоваться для предоставления каждому объекту своих матриц преобразования (путем выборки в массив матриц).
Если у вас есть доступное расширение VK_KHR_push_descriptor, то вы можетеинтегрировать изменения в дескрипторы непосредственно в буфер команд.Насколько это лучше, чем механизм push-константы, конечно, зависит от реализации.