建网站哪家好案例,中国建设网建筑业信息服务平台,淮安建筑信息平台,文化企业网站模板Swap chain recreation
我们要优化程序#xff0c;因为window surface#xff08;窗口大小#xff09;可能会发生变化#xff0c;导致swapchain不再兼容#xff0c;当这个事件发生时#xff0c;我们应该重新创建swapchain
实例
我们写新的recreateSwapChain和cleanupS…Swap chain recreation
我们要优化程序因为window surface窗口大小可能会发生变化导致swapchain不再兼容当这个事件发生时我们应该重新创建swapchain
实例
我们写新的recreateSwapChain和cleanupSwapChain函数
它应该包括所有依赖于交换链或窗口大小的对象的创建函数并且还应该包括vkDeviceWaitIdle因为不应当资源正在被使用时执行recreateSwapChain为了简单起见我们不重新创建渲染通道我们在chooseSwapExtent选择交换链分辨率函数中已经通过glfwGetFramebufferSize查询新的窗口分辨率以确保交换链图像具有正确的大小这里的glfwGetFramebufferSize是为了保证只有在窗口有有效尺寸时才继续对于cleanupSwapChain需要清理FramebufferImageViewSwapChain
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之前当returnfence没有被重置再次进入vkWaitForFences后它会成功通过
优化
尽管许多驱动程序和平台在窗口调整大小后会自动触发VK_ERROR_OUT_OF_DATE_KHR但并不保证会发生这种情况
因此要添加一些额外的代码来显式地处理大小调整对于vkQueuePresentKHR函数之后位置调用使用glfwSetFramebufferSizeCallback设置回调对于callback函数需要为static函数因为GLFW无法处理成员函数
那既然如此它如何修改Application中的framebufferResized成员呢通过glfwGetWindowUserPointer获取用户指针所在的窗口再reinterpret_castHelloTriangleApplication*强制转换为类即可修改类成员
现在就可以调整窗口大小并且图像适应窗口
.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把本地仓库推送到远程仓库
Vertex buffers