虚拟现实引领新时代令人惊喜的新体验,但也带来了各种新的挑战。其中之一就是虚拟现实应用“耗能”问题。
虚拟现实挑战了图形和仿真技术,以至于创造优秀虚拟现实体验的硬件需求成为日前热点。这些高要求给虚拟现实体验背后的软件带来了巨大的压力。这些软件该如何充分利用现有的硬件,包括如何更好利用多核CPU。
多核的崛起
在提升计算机工作速度的道路上,晶体管数量成倍增加,CPU时钟频率也稳步提高。不幸的是,随着晶体管数量增多、时钟频率的提升,处理器就需要消耗更多的能源,产生的热量也随之增加。过热会损坏CPU元件。你也许留意到,使用手机玩游戏时,手机会发烫。因此CPU制造商需要在速度和热量之间寻求平衡,确保所产生的热量对设备无害,也就是通常提到的散热层。
处理这个问题的趋势是把多核CPU执行核置于时钟频率较低的物理芯片上。双核CPU执行任务的速度是单核的双倍。但是,它耗能少,产热少。
单核CPU几乎退出了市场。iPhone 6带有双核处理器。高端安卓手机通常是八核。主流PC电脑制造商也在推出八核芯片。甚至PlayStation 4也配备八核处理器。但是目前为止,开发商只使用了八核中的六核。
充分利用多核,就需要高效的多线程软件系统。
多核编程
常言道:“天下无免费的午餐。”多线程编程或引擎使用多核CPU需要深思。头号麻烦就是数据冲突。多核CPU执行路径需要访问相同的数据。
这有一个相对简单的例子。一个CPU将数值写入内存,手机游戏交易同时另一个CPU试图读取同一个数值。第二个CPU可能只读到部分数据,因此这个数据是无用的。这会导致程序奔溃或意料之外的结果。
为保护被CPU同步访问的数据,程序员使用了同步对象。但进行同步时,CPU需要等待同步完成,就会出现性能不平衡和耗费时间。从架构设计最大限度地减少同步数据量是最优的方案,但这也使得充分发挥多核的作用变得困难起来。如果程序员错误地设计和执行程序,有可能会让多核的执行速度变得更慢。
游戏引擎的性能就是有关收集信息、模拟和渲染。引擎运行得更快更稳,帧率就更快、用户体验也更好。要做到每秒90帧,就需要在11毫秒内完成信息收集、模拟和渲染。
而虚拟现实需要渲染两次,每只眼睛一次。11毫秒的时间非常短,所以游戏开发者为了保持每秒90帧的速度,通常会降低内容的质量。当然,体验感就变得较差。
许多引擎需要进行设计上的改进以支持多核。这可以提高一些核的性能,但数据冲突又会抵消一些。这不再是几个CPU核心的问题了。
改造多核
主流游戏大多通过各种形式的功能性多线程进行改造。
一般首要做的就是将渲染划分到两个不同的线程中,然后确定有助于(如物理和AI )平行化的区域。
较于线性地循环所有的物理和AI对象,工作会被分配到多核CPU运行的多线程上。当工作完成时,程序就回到线性执行。更高级的系统允许线程空闲的时候能自己给自己安排工作。事实上,这种多线程有一定的好处,但CPU需要耗费大量的时间实现同步,导致一个或多个CPU闲置。手动调优适用于单个产品,但它并不能自动地负载均衡。造成的结果就是CPU使用率不均衡。大的游戏社区能够识别多数旧游戏引擎,超过四核的处理器反而无法显示其优势。
主流游戏引擎CPU使用率不均衡
另外一个办法是重新设计多核引擎
对比现下的CPU结构和未来设备蓝图时,发现需要一个新的系统。这个新系统能够承载多核、可测的负载平衡、可扩展、在N核间保持流畅控制,以及最重要的是最大限度减少数据冲突。
其中一个架构叫多级数据并行模拟
这种模拟通过修改来延展到CPU各个内核,并保留其中一个内核用于渲染。为了实现这点,模拟会分解成多任务,以便CPU能以任意顺序分开处理。
这就意味着任务将分为多个阶段,如读取阶段、决策阶段和编写阶段。另外你会需要一个广播阶段,方便对象间的交流。
现阶段任务确保完成后,才能进入下一阶段。每一阶段的执行,都需要有效分配,确保负载平衡。当中有内核提前完成任务时,就会被分配更多的任务,直至现阶段任务全部结束。
多级数据并行模拟(带有异步渲染器)
这个设计应允许大型模拟带有异步渲染器。为了说明潜在的性能提升,我们提供一些采用类似结构的MaxPlay 运行引擎的测试数据。
多级数据并行模拟能提升CPU利用率
以上你能看到六核(带六个超线程) CPU运行密集群体模拟的性能表现。这个视频展示了两核到四核到六核模拟的性能提升。
较于传统功能性多线程模式,不同硬件平台测试结果显示性能得到了提升。
在许多情况下,我们发现采用这个技巧能大幅度提升性能,开发商就可以加入更多的体验内容。硬件生产商预测核数量将会持续增加,所以考虑十二、十六甚至二十四核的解决对策相当重要。
对怀疑DirectX12和Vulkan graphic APIs系统的人来说,这个架构可以很好传输显示列表,在有需要时,能从任一阶段使用返回数据进行渲染。
所以,如果你打算利用多核处理器来丰富虚拟现实体验,你应该找到一个解决方案使用多级数据并行模拟。