【问题标题】:Vulkan hpp header bloating compile times, looking for a workaroundVulkan hpp 标头膨胀编译时间,寻找解决方法
【发布时间】:2022-06-16 04:33:40
【问题描述】:

我使用 clang 的 ftime-trace 来分析我的程序的编译时间。事实证明,大约 90% 的时间都花在解析 khronos 组提供的大量 vulkan.hpp 标头上。

这反过来意味着,如果我尽量减少在头文件中包含这个头文件并且只将它放在 cpp 文件中,我的编译时间应该会大大缩短。

但是我面临以下问题。

标题中有一些我几乎到处都需要的对象。有一些错误代码枚举器,一些其他类型的枚举,以及一​​些对象类型,例如

vk::Buffervk::Image 等...

这些只占总标题的一小部分,但我不能在不包含整个标题的情况下包含它们。每次我需要我的代码与图像交互时,我可以做些什么来只挑选我实际使用的类型并避免包含整个标题?

【问题讨论】:

  • 也许构建一个包装器 dll 作为具有静态链接的中间层可以工作吗?也许像 debug.dll 一样作为临时解决方案直到发布?
  • 也许这有助于compiler cache -> "Ccache 是一个编译器缓存。它通过缓存以前的编译并检测何时再次完成相同的编译来加速重新编译。Ccache 是免费软件,"
  • @RaymondNijland 这个工具看起来很有趣。我会调查的。
  • @huseyintugrulbuyukisik 该共享库的使用者如何知道 vulkan 对象的定义?
  • @Makogan 那么消费者需要的不仅仅是标题的几个部分吗?没有办法插入适配器类吗?

标签: c++ compilation header-files vulkan


【解决方案1】:

有一些方法可以缓解您的问题。

vulkan_handles.hpp 存在

首先,现在有几个标题(以前没有,这在几乎所有 vulkan 调查中都是一个巨大的抱怨)。这并不能完全缓解您遇到的问题(标头仍然很大),但您不必包含 vulkan.hpp,它本身包含每个可用的标头,只是为了访问 vk::Image 和 vk::Buffer .现在可以在 vulkan_handles.hpp 中找到句柄(尽管它仍然有 13000 行长)。

前向声明

您说因为 vulkan 的工作方式而没有上课。假设在很多情况下,您可以避免在 您的 头文件中包含 Vulkan.hpp。

vk::Buffer、vk::Image 都可以前向声明,无需包含该标头,只要您关注forward declaration rules

堆栈 PIMPLE 包装

你说你不能使用类等等......这真的没有意义。 vk::Buffer 和 vk::Image 都是类。您可以假设只为您需要执行此操作的类型创建包装类,但是,为了消除您必须事先为这些类型分配足够空间的开销。

现在在具有企业定义类型的大型企业库中,您通常不会这样做,因为类型的大小随时可能发生变化。但是,对于 vulkan.hpp,vulkan.hpp 使用的类型的大小和声明以及 它们的 包装器的大小确实定义得很好,并且不会改变,因为这会导致它们的其他不兼容一边。

所以你可以假设这些类型的大小并创建类似的东西:

struct BufferWrapper{
// vulkan.hpp buffer only wraps buffer directly, does not inherit from anything, it's size should match it exactly
    std::array<std::byte, sizeof(VkBuffer)> vk_data; 
}

在 cpp 文件中....

BufferWrapper(...){
    auto buffer_ptr = new vk_data vk::Buffer(...); 
}
vk::Buffer* getBuffer(){
    //technically undefined behavior IIRC, 
    return reinterpret_cast<vk::Buffer*>(&vk_data); 
}

当然,因为它只包装缓冲区,你实际上可以直接使用 VkBuffer 并重新解释转换它。然后,您可以使用非显式转换运算符使缓冲区包装器自动转换为 vk::Buffer,从而假设它非常无缝。

但是,如果它的类型不止几种,这很多的工作要做。如果你愿意付出那么多的努力,那么你还不如......

使用 Vulkan.hpp/s 生成器仅生成 cpp/hpp 而不是仅生成标头

所以如果你真的很想改变目前为止的东西,你不妨改变源代码。

首先,Vulkan hpp 不是直接编写的。 vulkan.hpp 是生成的。在 vulan-hpp repo 中有 VulkanHppGenerator.hpp 和 .cpp。修改这些可以使生成器生成源文件。您可以找到您需要的每个生成器的原型(即 generateHandle)。您可以假设更改输出以说明源文件。

但是,这样做超出了问题的范围,我只是将其作为核选项提出。

【讨论】:

    【解决方案2】:

    只是将我自己的建议添加到现有答案中:

    • 尝试使用预编译的头文件。预编译 vulkan.hpp 对我有很大帮助。
    • 尝试通过定义预处理器指令(例如VULKAN_HPP_NO_STRUCT_SETTERSVULKAN_HPP_NO_STRUCT_CONSTRUCTORSVULKAN_HPP_NO_SMART_HANDLE)来退出未使用的功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      • 2014-06-11
      • 2016-06-17
      • 2018-06-06
      相关资源
      最近更新 更多