求一个做交通分析的底图网站怎么做跟别人一样的网站
2026/3/1 7:20:16 网站建设 项目流程
求一个做交通分析的底图网站,怎么做跟别人一样的网站,外包公司前端面试难吗,wordpress添加原创标签上一篇我们成功搭建了环境并弹出了一个黑窗口。今天#xff0c;我们要正式初始化 Vulkan 库。 在 Vulkan 中#xff0c;没有什么是“默认”发生的。不同于 OpenGL 的上下文#xff08;Context#xff09;#xff0c;Vulkan 使用 Instance#xff08;实例#xff09; 来…上一篇我们成功搭建了环境并弹出了一个黑窗口。今天我们要正式初始化 Vulkan 库。在 Vulkan 中没有什么是“默认”发生的。不同于 OpenGL 的上下文ContextVulkan 使用Instance实例来存储所有每个应用层面的状态。这是你的应用程序与 Vulkan 库、显卡驱动之间建立连接的桥梁。核心概念Vulkan 的“填表”哲学在开始写代码前你需要习惯 Vulkan 的编程模式“填表 - 提交”。几乎所有的 Vulkan 操作都遵循这个流程定义一个CreateInfo结构体填表。设置结构体的各种参数明确你的需求。调用vkCreateXXX函数把表交给驱动提交。创建 Instance 也不例外。第一步填写应用程序信息 (VkApplicationInfo)首先我们可以这是可选的但推荐做告诉驱动程序我们的应用叫什么名字版本是多少。这有助于显卡厂商针对特定的游戏或引擎进行驱动层面的优化。void createInstance() { // 1. 填写应用信息 VkApplicationInfo appInfo{}; appInfo.sType VK_STRUCTURE_TYPE_APPLICATION_INFO; // 必须指明结构体类型 appInfo.pApplicationName Hello Triangle; appInfo.applicationVersion VK_MAKE_VERSION(1, 0, 0); appInfo.pEngineName No Engine; appInfo.engineVersion VK_MAKE_VERSION(1, 0, 0); appInfo.apiVersion VK_API_VERSION_1_0; // 我们使用 Vulkan 1.0 标准 // ... 后续代码 }注意在 Vulkan 中几乎所有的结构体都需要你手动设置sType成员。这是因为 Vulkan 内部为了性能使用void*指针传递结构体它需要sType来识别这是什么类型的数据。第二步获取必要的扩展 (Extensions)Vulkan 是一个平台无关的 API。这意味着核心的 Vulkan 库根本不知道什么是 Windows 或 窗口。它只懂图形计算。要让 Vulkan 能在 Windows 的窗口上画图我们需要启用扩展 (Extensions)。幸好GLFW 内置了一个帮助函数能告诉我们需要哪些扩展。// ... 接上文 // 获取 GLFW 需要的扩展 (例如 VK_KHR_surface 和 VK_KHR_win32_surface) uint32_t glfwExtensionCount 0; const char** glfwExtensions; glfwExtensions glfwGetRequiredInstanceExtensions(glfwExtensionCount);虽然glfwGetRequiredInstanceExtensions返回的是 C 风格数组但在后续教程中我们会大量使用std::vectorVulkan 的很多 count/data 模式很适合转换成 vector。第三步填写实例创建信息 (VkInstanceCreateInfo)这是创建 Instance 过程中最重要的结构体。它告诉 Vulkan 驱动我们需要哪些全局扩展和校验层。// ... 接上文 // 2. 填写实例创建信息 (这是必须的) VkInstanceCreateInfo createInfo{}; createInfo.sType VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; createInfo.pApplicationInfo appInfo; // 链接上面的应用信息 // 填入扩展信息 createInfo.enabledExtensionCount glfwExtensionCount; createInfo.ppEnabledExtensionNames glfwExtensions; // 暂时不启用校验层 (Validation Layers)下一章会讲这里先填 0 createInfo.enabledLayerCount 0;第四步创建与清理终于可以调用vkCreateInstance了。在 Vulkan 中创建函数通常返回一个VkResult。如果返回值不是VK_SUCCESS说明出错了。同时我们必须遵循RAII原则资源获取即初始化或者是手动管理的原则如果你 Create 了它你就必须 Destroy 它。修改HelloVulkanApp类我们需要在类成员中添加VkInstance变量并完善initVulkan和cleanup。class HelloVulkanApp { public: void run() { initWindow(); initVulkan(); mainLoop(); cleanup(); } private: GLFWwindow* window; VkInstance instance; // --- 新增成员变量 void initVulkan() { createInstance(); } void createInstance() { // 1. 应用信息 VkApplicationInfo appInfo{}; appInfo.sType VK_STRUCTURE_TYPE_APPLICATION_INFO; appInfo.pApplicationName Hello Triangle; appInfo.applicationVersion VK_MAKE_VERSION(1, 0, 0); appInfo.pEngineName No Engine; appInfo.engineVersion VK_MAKE_VERSION(1, 0, 0); appInfo.apiVersion VK_API_VERSION_1_0; // 2. 获取 GLFW 扩展 uint32_t glfwExtensionCount 0; const char** glfwExtensions; glfwExtensions glfwGetRequiredInstanceExtensions(glfwExtensionCount); // 3. 实例创建信息 VkInstanceCreateInfo createInfo{}; createInfo.sType VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; createInfo.pApplicationInfo appInfo; createInfo.enabledExtensionCount glfwExtensionCount; createInfo.ppEnabledExtensionNames glfwExtensions; createInfo.enabledLayerCount 0; // 暂时为 0 // 4. 创建实例 (检查结果) VkResult result vkCreateInstance(createInfo, nullptr, instance); if (result ! VK_SUCCESS) { throw std::runtime_error(failed to create instance!); } } // ... mainLoop 保持不变 ... void cleanup() { // 注意顺序先销毁 Vulkan 实例再销毁 GLFW 窗口 vkDestroyInstance(instance, nullptr); // --- 新增清理代码 glfwDestroyWindow(window); glfwTerminate(); } // ... initWindow 保持不变 ... };运行与调试将上述代码整合到你的main.cpp中并运行。#define GLFW_INCLUDE_VULKAN #include GLFW/glfw3.h #include iostream #include stdexcept #include cstdlib const uint32_t WIDTH 800; const uint32_t HEIGHT 600; class HelloTriangleApplication { public: void run() { initWindow(); initVulkan(); mainLoop(); cleanup(); } private: GLFWwindow* window; VkInstance instance; void initWindow() { glfwInit(); glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE); window glfwCreateWindow(WIDTH, HEIGHT, Vulkan, nullptr, nullptr); } void initVulkan() { createInstance(); } void mainLoop() { while (!glfwWindowShouldClose(window)) { glfwPollEvents(); } } void cleanup() { vkDestroyInstance(instance, nullptr); glfwDestroyWindow(window); glfwTerminate(); } void createInstance() { VkApplicationInfo appInfo{}; appInfo.sType VK_STRUCTURE_TYPE_APPLICATION_INFO; appInfo.pApplicationName Hello Triangle; appInfo.applicationVersion VK_MAKE_VERSION(1, 0, 0); appInfo.pEngineName No Engine; appInfo.engineVersion VK_MAKE_VERSION(1, 0, 0); appInfo.apiVersion VK_API_VERSION_1_0; VkInstanceCreateInfo createInfo{}; createInfo.sType VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; createInfo.pApplicationInfo appInfo; uint32_t glfwExtensionCount 0; const char** glfwExtensions; glfwExtensions glfwGetRequiredInstanceExtensions(glfwExtensionCount); createInfo.enabledExtensionCount glfwExtensionCount; createInfo.ppEnabledExtensionNames glfwExtensions; createInfo.enabledLayerCount 0; if (vkCreateInstance(createInfo, nullptr, instance) ! VK_SUCCESS) { throw std::runtime_error(failed to create instance!); } } }; int main() { HelloTriangleApplication app; try { app.run(); } catch (const std::exception e) { std::cerr e.what() std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; }成功依然是一个黑框口而且程序关闭时没有报错退出代码为 0。这意味着 Instance 创建成功并且被正确销毁了。失败如果抛出了 failed to create instance! 异常通常是因为显卡驱动不支持 Vulkan或者在某些旧的集成显卡上需要更新驱动。总结我们今天完成了 Vulkan 开发中最基础的一步理解了VkApplicationInfo和VkInstanceCreateInfo结构体。使用vkCreateInstance创建了句柄。使用vkDestroyInstance进行了资源清理。虽然看起来还在原地踏步还是那个黑窗口但在后台你的程序已经成功加载了 Vulkan 驱动并准备好大干一场了。下一步预告如果你现在写错了代码比如传了空指针程序会直接崩溃没有任何提示。这在开发中是无法接受的。下一篇我们将引入 Vulkan 的守护神 ——校验层 (Validation Layers)。它会像严厉的老师一样在你犯错时详细地告诉你错在哪里而不是让你对着崩溃的程序发呆。详见Instance - Vulkan Tutorial

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询