Я пытаюсь создать кеш шейдерных модулей в vulkan, чтобы избежать перекомпиляции / воссоздания их после определенных событий (например, воссоздание swapchain).
Структура данных выглядит следующим образом:
enum class ShaderStage
{
VERTEX = 0,
FRAGMENT
};
typedef std::map<ShaderStage, vk::UniqueShaderModule> ModuleData;
static std::map<std::string, ModuleData> data_cache;
Или, другими словами, карта от строкового идентификатора до набора шейдерных модулей, связанных с программой, а затем карта каждого этапа шейдера (фрагмент, вершина ...).
Проблема в том, что деструктор этих глобальных объектов не будет вызываться до тех пор, пока мы не вернемся из main, что испортит правильный порядок уничтожения объектов для vulkan, что приведет к ошибке сегментации.
Это можно исправить, добавив эту функцию в мой класс:
static void CleanCache() { data_cache.clear(); }
Если эта функция вызывается перед основным выходом, ошибки сегментации не будет.
Однако это вынуждает потенциального пользователя моего кода обязательно очищать кеш вручную перед выходом из main, чего я бы лучше избегал.
Я хотел знать, есть ли метод, который я могу использовать для неявного уничтожения объектов перед завершением программы.