Я просто загрузил общую библиотеку в первый раз во время выполнения. В настоящее время я создаю явный контекст, в котором загружаются все указатели функций.Это хорошая идея, чтобы выставить указатели функций Vulkan глобально?
Было бы примерно выглядеть в C++
auto entry = load_vk(..);
auto instance = entry.CreateInstance(...);
VkInstancePointer vk = load_vk_static_fn(instance);
vk.CreateDevice(...);
Проблема заключается в том, что я не уверен, о жизни этого. Мне нужно было бы получить доступ к vk
по разным потокам, поэтому в настоящее время я обматываю его в shared_ptr<VkInstancePointer>
. Я также выгружаю библиотеку в деструктор.
Рода проблемы, которую я имею, что я хочу сделать Vulkan апи немного более удобным, так что я могу написать
physical_device.create_logical_device(...);
Но это будет означать, что physical_device
должен содержать shared_ptr<VkInstancePointer>
. Это означает, что многие вещи будут иметь дополнительные накладные расходы на прирост счетчика атомов.
Мне интересно, могу ли я просто загрузить указатели функций vulkan по всему миру?
load_entry();
auto instance = CreateInstance();
load_instance_fp(instance);
auto device = CreateDevice(..);
Обычно я не использую глобальные переменные, но кажется, что это имеет смысл здесь.
Должен ли я когда-нибудь захотеть выгрузить библиотеку Вулкана?
Вообще говоря, общий объект/DLL, загружаемый динамически во время выполнения, путь _correct_ увеличивает счетчик ссылок. Освобождение от него уменьшает, что счетчик ссылок и библиотека не могут быть удалены из вашего процесса до тех пор, пока не останется 0 ссылок. Вам лучше загружать библиотеку каждый раз, когда вам нужно получить указатель на функцию, чтобы поддерживать постоянный подсчет ссылок или просто не выгружать его. –
"* Это означает, что многие вещи будут иметь дополнительные накладные расходы на прирост счетчика атомов. *« Только операции копирования, связанные с этими объектами. –
@NicolBolas Да и создание этих объектов. Но, как сказал Андон М. Коулман, я теряю способность выгружать библиотеку. Я мог бы хранить weak_ptr, но тогда доступ к нему всегда увеличивал бы атомный счетчик. Я, вероятно, просто сделаю «VkInstancePointer» доступным по всему миру. –