VR支持细密度GPU优先的重要性

在关于单一缓冲带渲染的文章中,我谈到了通过缩短图形管线长度来减少延迟。随后,我又阐述了一种通过将变形转换移出片段着色器而加速桶形失真渲染的方法。这两种方法都可以增加吞吐量,因此有助于减少VR使用的延迟。当然,还有其他技巧来进一步加快VR内容的创建。例如,一个有趣的方法是将变形转换移到内容生成步骤中,使得第二次显示渲染基本过时。虽然这是个不错的方案,但它需要得到VR应用程序的直接支持,因此在通用虚拟框架中是不可用的。

另一个技巧是最终的内容呈现给用户之前进行一次投影,并分离内容生成和VR后处理。正如单缓冲地带渲染一样,恰当的时机非常重要。

在本文中,我将阐述当在VR中使用这些先进的技术时,为何GPU支持细密度优先是必不可少的。

确定CPU

在谈论GPU之前,先谈谈CPU和Linux调度。

我们需要将帧速率保持在最低60 fps,以维持VR环境中的“存在”感。高端桌面PC的VR平台则要求更高。而比高分辨率内容等有一个更加平稳的帧速率则更为重要。开发人员应该不断调整内容以实现这些帧速率。然而,即使他们这样做,仍可能会有内容创建跟不上步伐而降至60 fps以下的情况。切记,Android / Linux是一个多进程的操作系统,因此无法保证具体进程/线程的实时行为。这个过程可能在任何时候被打断,且将这个过程从一个CPU转移到另一个CPU是一项消耗成本的操作。这是因为每个CPU会有一些缓存,而转移时缓存会变得无效。

克服这个问题的一个方法是将一个特定的线程定位在一个特定的CPU中。使用sched_setaffinity可以大大提高VR应用程序的调度行为。此外,Android已经开始使用CPU集来分配特定的进程(比如后台服务),用于筛选CPU组。甚至有一个涵括了专有CPU的高端APP CPU集仅供前端应用程序使用。

1

2

Linux调度的系统调用跟踪提供器(Systrace)可以进行CPU定位。将内容创建线程固定在CPU 2中,VR后处理线程固定在CPU 3中。

将一个重要的线程固定在一个特定的CPU中甚至使其可专门访问CPU将是获得一致渲染体验的重要步骤。现在,SoC通常由4个或更多CPU组成,因此便不再存在大的障碍了。

然而,即使有了这些预防措施也不能确保实时行为。

GPU优先

VR里一个较为先进的技术是异步时间弯曲。在VR中, Oculus第一次实现了异步时间弯曲。使用其主要为实现两个目标:

1.减少延迟
2.提高帧速率

如何实现这些目标我不做过多阐述,您可以在我写的有关Oculus的文章或相关视频中获取详细资讯。关键在于在垂直同步之前的一段极短的时间内,算法要等待最后的渲染正式启动。这样便可以再次查询到传感器,从而减少移动时间延迟。最后的渲染有一个固定的工作负载,且SoC供应商可以估计完成这个任务所需的正常时间。

此外,为提高帧速率,可以通过使用两个不同的独立运作的线程,将内容创建与VR后处理进行分解。

GPU优先适合的位置在哪?就像我所说,GPU只有一点时间来处理VR后处理渲染。SoC供应商总是选择最小的可能值来获取传感器最晚读取的信息。问题在于与此同时 (异步)内容渲染(或系统中的其他内容)也提交了其他工作。我们如何保证重要的后处理渲染在目标时间内完成?

内容优先

首先,我们需要了解的是现代GPU有一个调度器用于分配多个渲染任务至一个或少量的硬件单元。调度器需要考虑运行任务是否准备就绪,未完成的任务是否具有相关性,从而另一个任务可以同时运行。此外,调度器也能够中断正在运行的任务而切换至高优先级的任务。PowerVR Rogue硬件架构的设计旨在进入非常细的粒度层次时进行中断。这就允许在完成一个贴图和开启下一个贴图过程之间进行中断。例如,贴图像素为32×32允许在处理全屏渲染时进行多次中断。

为使这种先进的GPU调度控制机制适用于OpenGL ES(或计算)开发人员,Imagination Technologies早在2009年就推出了EGL_IMG_context_priority扩展。同年,该扩展获得了Khronos的批准。它定义了三个优先层以区分单个工作负载之间的需求。在我们的VR使用中,显然我们选择了EGL_CONTEXT_PRIORITY_HIGH_IMG用于后处理线程,而EGL_CONTEXT_PRIORITY_MEDIUM_IMG用于内容渲染(默认)。

在系统调用跟踪提供器(systrace)中可以看到效果:


Systrace强调GPU优先

我人为地增加了内容渲染的工作负载,想看看它如何影响后处理渲染任务。可以看到,内容创建线程大约每32ms提交一次渲染。VR后处理线程每16.7ms提交一次渲染以保持稳定的60 fps帧率。上图绿色的内容渲染任务被蓝色的后处理任务打断了,“GPU:3D”行进行了标注。绿色的“内容创建任务2”三次被多个蓝色打断。这便可以确保蓝色后处理任务能及时完成目标帧率。

总结

细粒度GPU优先使单独的缓冲带渲染或异步时间弯曲等技术成为了可能。它有助于在创造丰富的内容和VR后处理之间,甚至在CPU或GPU不能及时跟上任务时进行一个平衡。显然,可能有其他GPU优先的案例,且开发者可以自由地利用EGL_IMG_context_priority扩展自己的应用程序。便携式设备对VR任务的要求很高,开发人员也应该留意CPU调度并利用所有可用的分析工具。

英文链接:
https://imgtec.com/blog/importance-fine-grained-gpu-preemption-support-vr/

相关阅读:
1、移动VR设备中通过采用单缓冲器条带式渲染来降低延
2、在移动VR中加速修正GPU桶形失真
3、虚拟现实中的“存在感”及PowerVR GPU发挥的作用

声明:
本文为原创文章,转载需注明作者、出处及原文链接,否则,本网站将保留追究其法律责任的权利

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