VkApplicationInfo 有什么意义?

What is the point of VkApplicationInfo?

在新的 Vulkan API 中,有一个结构需要创建 VkInstanceVkApplicationInfo。定义如下:

typedef struct VkApplicationInfo {
    VkStructureType    sType;
    const void*        pNext;
    const char*        pApplicationName;
    uint32_t           applicationVersion;
    const char*        pEngineName;
    uint32_t           engineVersion;
    uint32_t           apiVersion;
} VkApplicationInfo;

我认为必须传入应用程序名称、应用程序版本、引擎名称或引擎版本没有用。也许实现可以将 pNext 成员用于任何目的,或者检查实现是否支持指定的 apiVersion。但除此之外,我不明白为什么要指定其他成员。 Vulkan 规范说你甚至可以使用 NULL 而不是使用实际的 VkApplicationInfo,这使得它更加无用。稍后可以通过使用(例如)vkGetAppInfo(instance) 等在应用程序中检索来自此结构的信息吗?这个结构后面有evil master plan吗?或者只是一个糟糕的设计?无论如何,我很好奇为什么它存在以及为什么我应该使用它。

来自规范:

If not NULL, [pApplicationInfo] helps implementations recognize behavior inherent to classes of applications.

这就是它的用途。

IHV(独立硬件供应商)将为任何流行到足以吸引这种兴趣的程序提供特定于应用程序的优化。这是不可避免的。

所以 Vulkan 有两个选择:它可以假装不可避免的事情不会以某种方式发生,这意味着 IHV 无论如何都会这样做,使用各种启发式方法来检测您的应用程序。或者您的应用程序可以自我介绍并省去中间人。

Vulkan 允许您执行后者。行为良好的引擎可能会代表您的程序做同样的事情。