大家好,接下来将为大家介绍Vulkan 应用程序框架。
构建一个基于GLFW
的Vulkan
应用程序原型框架的雏形。
一、框架原型
#include <vulkan/vulkan.h>
#include <iostream>
#include <stdexcept>
#include <functional>
class HelloTriangleApplication {
public:
void run() {
initVulkan();
mainLoop();
cleanup();
}
private:
void initVulkan() {
}
void mainLoop() {
}
void cleanup() {
}
};
int main() {
HelloTriangleApplication app;
try {
app.run();
} catch (const std::runtime_error& e) {
std::cerr << e.what() << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
首先从LunarG SDK
中添加Vulkan
头文件,它提供了购机爱你Vulkan
应用程序需要的函数、结构体、和枚举。我们包含stdexcept和iostream头文件用于抛出异常信息,而functional头文件用于资源管理部分支持lambda
表达式。
程序被封装到一个类中,该类结构将会存储Vulkan私有成员对象,并添加基本的函数来初始化他们。首先会从initVulkan函数开始调用。当一切准备好,我们进入主循环开始渲染帧。我们将会加入mainLoop函数包含loop循环调用,该循环调用直到GLFW窗体管理才会停止。当窗体关闭并且mainLoop返回时,我们需要释放我们已经申请过的任何资源,该清理逻辑在cleanup函数中去定义。
程序运行期间,如果发生了任何严重的错误异常,我们会抛出std::runtime_error 并注明异常描述信息,这个异常信息会被main函数捕获及打印提示。很快你将会遇到一个抛出error的例子,是关于Vulkan
应用程序不支持某个必要的扩展功能。
基本上在之后的每一个小节中都会从initVulkan函数中增加一个新的Vulkan
函数调用,增加的函数会产生Vulkan objects
并保存为类的私有成员,请记得在cleanup中进行资源的清理和释放。
二、资源管理
我们知道通过malloc分配的每一个内存快在使用完之后都需要free内存资源,每一个我们创建的Vulkan object
不在使用时都需要明确的销毁。在C++
中可以利用 完成auto资源管理,但是在本节中,选择明确编写所有的内存的分配和释放操作,其主要原因是`的设计理念就是明确每一步操作,清楚每一个对象的生命周期,避免可能存在的未知代码造成的异常。
当然在本节之后,我们可以通过重载std::shared_ptr来实现auto 资源管理。对于更大体量的Vulkan程序,建议遵循RAII的原则维护资源的管理。
Vulkan
对象可以直接使用vkCreateXXX系函数创建,也可以通过具有vkAllocateXXX等功能的一个对象进行分配。确保每一个对象在不使用的时候调用vkDestroyXXX和vkFreeXXX销毁、释放对应的资源。这些函数的参数通常因不同类型的对象而不同,但是他们共享一个参数:pAllocator。这是一个可选的参数,Vulkan
允许我们自定义内存分配器。我们将忽略此参数,始终以nullptr作为参数。