PowerVR架构能快速支持最新的技术,Vulkan API便是实证。Vulkan是一款现代的API,使开发人员能够获得底层图像硬件的“低级”访问权限,确保硬件性能的最大化。
任何需要显示大量数据的应用程序(如导航软件)便是Vulkan的绝佳使用案例。导航应用程序需要大量的后台处理,使大量的相关信息尽可能以较高的帧速率进行渲染。在这里,我将详细介绍最新的卫星导航演示系统,我将阐述其如何利用Vulkan图像API、对比Vulkan与OpenGL ES的性能、阐释为何PowerVR适合运行这类使用了现代图像API(如Vulkan)的程序。
Vulkan and OpenGL ES
首先,让我们先回顾Vulkan和OpenGL ES之间的差异。与OpenGL ES相比,Vulkan基本上设计有完全和明确的控制,其中包括对多线程分布工作负载的严格控制。
GPU资源可以在一个线程上分配,而其他GPU可以同步在另一个线程上工作。此外, OpenGL ES是调用GPU命令,并随后立即执行;而在Vulkan中,命令则“记录”在命令缓冲区(基本上只是一个指令列表)。随后,整个命令缓冲区将提交给GPU用于渲染。这种结构意味着,对于开发人员而言,命令提交是完全可预测的。当渲染命令发送至GPU时,他们可以准确控制,而这与OGLES恰恰相反。在OGLES中,有些GPU命令在调用时不会执行,而是在渲染循环中的其他任意点执行——超出了开发人员的控制范围。更为关键的是,假设内容不变,命令缓冲区在每帧渲染时会被再次使用。这样,每一帧它们都将被再次记录,并再次提交。OpenGL ES中则不存在这种构造。
此外,命令缓冲区可以由多个二级缓冲区构成,使这部分图像工作负载在每帧被再次记录时可以得到很好地控制。记录一次后则只剩下静态缓冲区,动态缓冲区则在所要求的时间间隔内被再次记录。这个间隔通常为一帧,但也不一定。
卫星导航系统的架构
现在的问题是,这如何映射到卫星导航应用程序中?对于我们的卫星导航演示系统,我们使用来自OpenStreetMap.org的映射数据,这样便能够查询指定贴图区域内所有映射元素的数据库。这是一种常见且直观的处理数据的方式,十分适合Vulkan,因为这意味着,我们可以将每个贴图所有的渲染命令记录至自己的命令缓冲区中。由于映射数据永远不会改变,因此只需要处理一次。
摄像机掠过映射图时,我们需要在新贴图中进行定期加载,但应用程序又需要保持响应——我们无法停止主线程。有了Vulkan,便可以在新贴图中分配GPU资源,并在单独的工作线程中记录其命令缓冲区,且不用分配主线程,这样便可以在输入中进行渲染和响应。对于这个应用程序,有一个额外的工作线程便足矣,但如果我们有需要,可以一次生成多个线程来处理更多的贴图。这甚至可以动态地扩展,基于有多少CPU资源可以使用,或者设备功率是否需要被管理。这些在OpenGL ES中是非常重大的,但却是Vulkan设计中最基本的部分。
正如贴图可见,其又可以不可见,这意味着命令缓冲区将被释放。当贴图可见时,并非是解除分配和再次分配,而是在从命令池对象中预分配一组缓冲,再从这组缓冲中,对使用过的缓冲进行循环,这样便可以降低应用程序的动态内存分配成本。
PowerVR
相比先前的API,Vulkan使PowerVR可以以更高的效率处理这些任务。作为基于贴图的延迟渲染器(TBDR),我们的硬件能够充分利用所需的信息进行预渲染。Vulkan使用“渲染通道”结构(由包含命令缓冲区的子通道组成)来定义渲染工作。相比单个的绘制调用,这更像基于贴图的渲染器所使用的基本工作单元。这些结构于贴图器而言也很便利,因为它们可以防止在绘制调用之间出现帧冲刷,不然,则需要对贴图进行多次渲染。为更深入地了解这层含义及PowerVR架构如何与Vulkan有效合作,请阅读托拜厄斯·赫克托所撰写的文章。
PowerVR SDK关键词
Vulkan编写的这款应用程序使用了PowerVR SDK,这表示,生成OpenGL ES版则非常简单。SDK反映了Vulkan API架构,但对底层API进行了抽象化,所以相同的代码只适用于Vulkan和OpenGL ES。唯一重大的变更便是描述符集(OpenGL ES没有这些概念),且将GPU资源分配到主线程中。此外,使用SDK也意味着,在所有的平台上(Android、Windows和Linux),相同的代码仅仅只是工作,不会制造麻烦。
性能对比
让我们将Vulkan和OpenGL ES的演示进行对比。以下视频和图像都是在基于Android的Nexus Player上运行所生成的——一款包含了PowerVR G6430 GPU的消费设备。从视频中可以看出,Vulkan应用不断呈现更高的帧率,加载新贴图时性能也未出现明显下降。相反,在OpenGL ES中,基本帧率则较低,因为需要做大量的工作来告诉GPU每帧的任务是什么。同时,加载新内容时还会出现断断续续的情况,因为主线程必须中断后分配GPU资源。
映射数据由? OpenStreetMap贡献。这些数据在开放数据库许可时可用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)