全局公开 Vulkan 的函数指针是个好主意吗?
Is it a good idea to expose Vulkan's function pointers globally?
我刚刚在运行时第一次加载了一个共享库。我目前正在做的是创建一个显式上下文,其中加载所有函数指针。
在c++中大致是这样的
auto entry = load_vk(..);
auto instance = entry.CreateInstance(...);
VkInstancePointer vk = load_vk_static_fn(instance);
vk.CreateDevice(...);
问题是我不确定这个的寿命。我需要跨不同的线程访问vk
,所以我目前将其包装在shared_ptr<VkInstancePointer>
中。我还在析构函数中卸载了库。
我遇到的问题是我想让vulkan api更方便一些,这样我就可以写
physical_device.create_logical_device(...);
但这意味着physical_device
需要包含shared_ptr<VkInstancePointer>
。这意味着很多东西将有一个额外的原子计数器增量的开销。
我想知道我是否可以全局加载vulkan函数指针?
load_entry();
auto instance = CreateInstance();
load_instance_fp(instance);
auto device = CreateDevice(..);
我通常不使用全局变量,但在这里似乎是有意义的。
我是否想在某个时候卸载Vulkan库?
在Vulkan中有两种函数指针:实例函数指针和设备函数指针。
实例函数指针通过vkGetInstanceProcAddr
检索。这个函数可以为与设备无关的函数检索函数指针。也就是说,对于处理创建/管理/销毁设备的函数,而不是直接与设备通信的函数(即:任何接受VkDevice
, VkQueue
或VkCommandBuffer
的函数)。
但是它也可以检索与设备本身对话的函数的指针。这些函数可以与任何 Vulkan设备对话,无论它是在函数指针被检索之前还是之后创建的。
相比之下,vkGetDeviceProcAddr
获得设备函数指针。这些函数指针是特定于设备的;不能与创建它们时使用的设备不同。
所以你可以创建全局函数指针,它可以从任何线程使用到任何设备。但是它们必须是实例函数指针。
或者你可以让Vulkan SDK完成它的工作,为你处理所有这些。
我是否想在某个时候卸载Vulkan库?
我不知道你为什么想要。如果不重启电脑,用户通常无法安装像Vulkan这样的驱动级系统的新版本。即使可以,您的代码也不知道如何处理这些新内容,因为您的代码是针对较低版本编写的。
- 什么时候在C++中返回常量引用是个好主意
- 使用嵌套函数数组是个好主意吗?
- 将std::regex设置为静态的好主意吗
- 使用共享库进行变体处理是个好主意吗?
- 使用列表<Byte>不是好主意吗?
- 用C++编写多级内联函数是个好主意吗?
- 重载参数 C++ 是个好主意吗?
- 扩展 std::vector 是个好主意吗?
- 将 int32_t 键入为 int 是个好主意吗?
- 常量参考延长对象的寿命,然后是const_cast,这是一个好主意吗?
- 使用 QT 开发服务器应用程序是个好主意吗?(QT5)
- 用 constexpr 中的工会取代reinterpret_cast - 好主意?
- 将C 11设置功能更改为带有转发的现代模板功能是一个好主意
- 重载指向集合的指针的开始/结束是否是个好主意
- 使用指向 stl 向量的指针是个好主意吗?
- 有一个指向std::vector-element的指针,该指针目前还不存在,但稍后将被构造,这是个好主意吗?
- 通过函数指针在游戏引擎数学库中使用SIMD ~一个好主意
- 通过公共const指针封装是个好主意吗?
- 在迭代器中放入转换操作符将其转换为指针是个好主意吗?
- 全局公开 Vulkan 的函数指针是个好主意吗?