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多线程渲染的主要内容,如果未能解决你的问题,请参考以下文章

渲染优化(多线程渲染)

DirectX* 11 多线程渲染的性能方法和实践

多线程渲染方法-可以提速的渲染方式

多线程渲染

多进程浏览器多线程页面渲染与js的单线程

多线程渲染仅在 iOS 13 上崩溃