Swap chain recreation
我们要优化程序,因为window surface(窗口大小)可能会发生变化,导致swapchain不再兼容,当这个事件发生时,我们应该重新创建swapchain
实例
我们写新的recreateSwapChain和cleanupSwapChain函数
- 它应该包括所有依赖于交换链或窗口大小的对象的创建函数
- 并且还应该包括vkDeviceWaitIdle,因为不应当资源正在被使用时执行recreateSwapChain
- 为了简单起见,我们不重新创建渲染通道,
- 我们在chooseSwapExtent选择交换链分辨率函数中,已经通过glfwGetFramebufferSize查询新的窗口分辨率,以确保交换链图像具有正确的大小
- 这里的glfwGetFramebufferSize是为了保证只有在窗口有有效尺寸时才继续
- 对于cleanupSwapChain需要清理Framebuffer,ImageView,SwapChain
void recreateSwapChain() {int width = 0, height = 0;glfwGetFramebufferSize(window, &width, &height);while (width == 0 || height == 0) {glfwGetFramebufferSize(window, &width, &height);glfwWaitEvents();}vkDeviceWaitIdle(device);cleanupSwapChain();createSwapChain();createImageViews();createFramebuffers();
}
调用
现在我们只需要弄清楚什么时候需要重新创建交换链(即什么时候调整了窗口),drawFrame中的vkAcquireNextImageKHR and vkQueuePresentKHR函数,可以告诉我们交换链不再匹配,以下是函数VkResult返回值:
- VK_ERROR_OUT_OF_DATE_KHR交换链已与表面不兼容,无法再用于渲染。通常发生在窗口调整大小之后
- VK_SUBOPTIMAL_KHR:交换链仍然可以用于成功地呈现给曲面,但曲面属性不再完全匹配。
我们应该在drawFrame函数中调用,且在vkWaitForFences和vkAcquireNextImageKHR之后,vkResetFences之前
(如果在vkResetFences之后,fence先被重置,可是如果==VK_ERROR_OUT_OF_DATE_KHR,就会调用recreateSwapChain()并return,这时由于Reset了,vkWaitForFences永远不会通过,造成deadlock)
(反而在vkResetFences之前,当return,fence没有被重置,再次进入vkWaitForFences()后它会成功通过)
优化
尽管许多驱动程序和平台在窗口调整大小后会自动触发VK_ERROR_OUT_OF_DATE_KHR,但并不保证会发生这种情况
因此要添加一些额外的代码来显式地处理大小调整,对于vkQueuePresentKHR函数之后位置调用使用glfwSetFramebufferSizeCallback设置回调,对于callback函数需要为static函数,因为GLFW无法处理成员函数
那既然如此它如何修改Application中的framebufferResized成员呢?通过glfwGetWindowUserPointer获取用户指针所在的窗口,再reinterpret_cast<HelloTriangleApplication*>强制转换为类,即可修改类成员
现在就可以调整窗口大小,并且图像适应窗口
.git ignore
忽略文件夹:文件夹名/
特定路径下文件夹:文件夹名/文件夹名/
忽略文件:文件名.后缀
特定路径下文件:文件夹名/文件名.后缀
忽略所有特定类型的文件: *.后缀
push GitHub
在GitHub建立repositor远程仓库,添加LICENSE和README
在本地项目git init初始化本地仓库
git remote add origin https://github.com/
…….git与远程仓库关联
git pull origin master 把远程仓库和本地同步,消除差异
git add *把本地项目推送到本地暂存区
git commit -m"……"把暂存区推送到本地仓库
git push origin master把本地仓库推送到远程仓库