Vulkan多线程渲染
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vulkan多线程渲染相关的知识,希望对你有一定的参考价值。
参考技术A •应用程序层面的线程继续流行•应用程序希望从多个线程生成渲染工作
•在多个线程中分散验证和提交成本
. 应用程序通常可以在比驱动程序更高的级别上处理对象/访问同步
•线程更新资源(缓冲区)
•CPU顶点数据或实例数据动画(例如变形)
•并行管道状态创建
•“着色器编译”和状态验证
•线程渲染/绘制调用
在多个线程中生成命令缓冲区
•所有Vulkan渲染是通过命令缓冲区 驱动程序可以相应地优化缓冲区
•允许静态工作被重用
• 重要提示:没有状态会被跨命令缓冲区继承!
•不需要为了提交工作而“绑定一个上下文”
•多个线程可以提交工作到不同的队列
•队列通过CommandBuffer提交接受GPU工作
•队列有非常少的操作:本质上,“提交工作”和“等待空闲”
•在处理提交的工作之前等待
•当提交的工作完成时发出信号
排队的“家庭”可以接受不同类型的工作,例如。
•队列中的一种工作形式(例如DMA/内存仅传输队列)
信号量
•用于同步跨队列或跨粗粒度提交到单个队列的工作
事件和障碍
•用于同步命令缓冲区内的工作或提交到单个队列的命令缓冲区序列
栅栏
•用于同步设备与主机之间的工作。
•必须不回收CommandBuffer重写,直到它不再飞行
•但我们不想每帧都刷新队列!
•当命令缓冲区准备被回收时,VkFences可以提供一个队列提交来测试
改写命令缓冲区
GPU消耗队列
•VkCommandPool对象是关键的线程命令生成•VkCommandBuffers被分配从“父”VkCommandPool•VkCommandBuffers写入到不同的线程必须来自不同的池
•否则缓冲区和池都必须是外部同步的,这是不值得的
•VkDescriptorPool对象可能需要线程对象状态生成
例如:sampler, uniform buffer,等等
•在创建池时指定的每种类型的最大数量
•vkdescriptorset从“父”VkDescriptorPool中分配
•在不同线程中分配的描述符必须来自不同的池
但是同一个池中的VkDescriptorSets可以被不同的线程写入
渲染优化(多线程渲染)
笔者最近在学习一些关于渲染优化相关的知识,在这里先记录一下渲染优化之多线程优化。
多线程渲染这个东西,笔者来系统的梳理一下有关多线程渲染相关的一些东西。笔者会针对多线程环形队列实现进行介绍,其他的诸如双线程双队列实现多线程渲染,管道多线程渲染,笔者不在赘述,有兴趣的读者可以查阅相关的文档。笔者下面将按照下面的顺序一一介绍,来揭开多线程渲染的神秘面纱。
1.线程的概念
2.信号量
3.多线程通信模型
3.多线程与环型队列
4.多线程渲染框架
5.多线程渲染之环型队列
6.多线程渲染帧同步策略
后面一段时间,笔者会将多线程相关的一些东西整理出来,这里先列一个提纲。
参考文献
1.https://zhuanlan.zhihu.com/p/44116722?utm_source=wechat_session&utm_medium=social&utm_oi=854447863864905728
2.《GPU精粹1:实时图形编程的技术、技巧和技艺》第28章图形流水线性能
3.https://urho3d.github.io/documentation/1.7.1/_multithreading.html
4.https://wiki.unrealengine.com/Multi-Threading:_How_to_Create_Threads_in_UE4
以上是关于Vulkan多线程渲染的主要内容,如果未能解决你的问题,请参考以下文章