Vulkan:多线程命令的生成

No replies
ellaIMG
ellaIMG 的头像
Offline
Joined: 2015-11-14

OpenGL ES的命令生成和命令提交毫无区别。当调用“glDraw”,所有当前的状态都将转换供硬件消耗的状态,并提交执行。生成的命令实际上是一个相当耗成本的操作(OpenGL ES的低效率更是让其雪上加霜)。且由于需要将所有提交的命令序列化,因此每次命令的生成需要在线程上完成。

对于Vulkan,生成和提交是两个完全不同的概念。命令首先记录在命令缓冲区对象中,然后再提交给硬件队列。这使应用程序可在其他线程中记录命令缓冲区,且事实上也可在多个线程中记录命令缓冲区,只是提交的CPU操作成本比较低,可以在任何一个线程中完成且影响甚小。

Vulkan

这使得分工更加有效,扩展至多线程的记录不会带来额外的处理成本。

记录成本可能使命令难以扩展——命令缓冲区需要记录内存,但不可能事先了解需要多少内存。在基层分配内存是一个全局性的操作——需要某种形式的锁定且阻塞其他线程。为了缓解这个问题,命令缓冲区使用了几个不同的策略来避免使用系统内存:

•可以重置命令缓冲区,使他们重新记录且不释放任何已分配的内存。如果在单个命令缓冲区分配的大小仍然不变,没有必要每帧均从系统中分配内存,因此只有第一帧需要成本。

•命令池允许一组命令缓冲区有更大的分配,因此如果各命令缓冲的工作负载随着每帧画面发生变化,但每池工作负载并没有真正改变,这便可维持某种程度上的稳定,且每个命令缓冲区分配量不会过大。

--电子创新网--
粤ICP备12070055号