Vulkan hpp Как правильно обрабатывать удаление уникальных дескрипторов в глобальной области видимости? - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь создать кеш шейдерных модулей в 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, чего я бы лучше избегал.

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

...