Vulkan in Unity -- Unite2017 ARM 李陈鲁

发表于2017-05-25
评论0 3.8k浏览

关于Unite

Unite大会是由Unity举办的全球开发者大会,至今已有10年的历史。Unite现已成为游戏行业,VR/AR行业中最具有权威性和影响力的活动。


李陈鲁:大家下午好,非常荣幸今天能跟各位Unity的专家分享Vulkan  in  Unity。大家多多少少听说过Vulkan这个概念,但是实际有尝试的还不太多。我今天代表ARM跟大家做一下介绍。不知道大家了不了解ARM,如果不太了解,到门口的C03展台去跟我们的技术专家做一个简短的交流。今天时间有限,我就不过多地展开。ARM是一家来自剑桥的专业授权解决商,我们(ARM)是不生产任何芯片的。同时,在安卓这个平台上面,除了绝大多超过90%GPU图形处理芯片也是来自ARMMali(这是我们的商品名)。

因为我刚才已经说过,ARMCPUGPU在移动平台上有非常高的占有率,而Unity是一个移动平台最为成功的游戏开发平台。你会有很大的机会使用Unity开发最终在ARM的平台上面运行的应用。我今天分享几个内容,一个是Vulkan的前世今生是什么,然后在给大家介绍一下使用VulkanAPI有什么好处。另外一个怎么通过Unity使用这个API。怎么通过Unity来使用呢,是不是很复杂?其实是非常简单的。最后如果说你真的已经掌握了Vulkan的技术知识,以及用Unity怎么发挥其潜力,你就有机会在实际的项目当中使用它。我们之前有过这样的实例,通过实际项目的检验,发现VulkanAPI名不虚传,可以非常简单地在实际项目中获得功耗与性能的提升。因为UnityVulkan的支持也是处在一个起步的阶段,在未来是有一个更深入的支持。例如我们ARM有一些内部的实验性的项目,验证了一些概念。这些先进的概念在不久的将来也会跟大家接触,通过深挖Vulkan的潜力,可以把游戏的项目做得非常好,能够在竞争当中脱颖而出。另外我会介绍下MaliGraphics Debugger,可能熟悉ARM工具链的朋友们并不陌生,MGD最大的变化是从今天开始,不再是仅仅是一个独立的工具,可以通过Unity一起协同工作,最后会跟大家做一个关于Vulkan以及ARM工具链的总结。

我们讲Vulkan API之前,先回顾一下整个移动设备的发展历史。今年是2017年,今年2017年旗舰的智能手机运行得什么样子呢。那天看到简单的数字,我们比一比2009年,今年旗舰的手机GPU提升了300MHz,同时连网的速度,信息传输的速度有20倍的提升,屏幕的分辨率提升了24倍。另外一方面,比以前多了5倍以上的各种复杂的传感器。所以今天我们可以看到智能手机非常非常强大,不仅从性能上面可以和前几年的台式机有媲美。而且它可以通过各种各样的传感器可以复杂地交互,可以搞一些人工智能和语音识别。我们刚才看的是非常激动人心的数字的提升。实际当中会有有很多问题。为什么呢?其实情况是这样。

随着我们制成的发展以及每一代芯片架构的进步,我们要知道我们的工作环境也变得越来越严苛。你说现在的手机你再拿出一个砖头块,不会有人去买。它变得越来越薄,里面的散热空间越来越紧张。也就是说即使我们有了这么多倍的提升,可是我们实际上真正留给我们power budget还是两到三个瓦特,非常非常有限的空间。这是为什么我们今天还要告诉在座开发者,即使硬件平台取得这么大的进步,对于性能的优化,对于底层细节的了解一定会对你产品带来最终的好处,因为这个竞争还是非常激烈的。后面我们看一下ARM的主要产品,就是CortexCPU。上面一条绿线代表单核的最高性能的指标演进,基本上是线性的。说明我们产品设计和产品最后的实施还是对应得很好的。基本上理论上如何怎么设置,最后反映出来的真实性能也差不多。另外一个,上面的曲线反应的实际是多少功耗,这个看起来确实是非常激动人心的。性能功耗比提升持续不断。

那么,我们既然有理论上那么好的硬件基础,是不是可以坐享其成享受到进步带来的好处呢?某种意义上是的,但是如果你想做得比别人更好,这里面还是有很多很多的细节去关注。我这里面首先有一点,ARM我们在不断地设计CPU的过程当中,跟很多的应用开发者以及我们的客户,做芯片的厂商交流以后,其实芯片并不是说你功耗越多,就越有性能表现。你在看网页或者聊微信的时候,这个是跟你在玩游戏的时候不一样的。如何能兼顾彼此呢?就是大核小核,大家都知道这个是怎么回事。大小核来了以后给我们带来了机遇也带来了挑战。大核小核计算能力是不一样的,同时在做实际运算的时候需要去考虑很多当场实时的变化。这时候你的一个计算任务如何拆分到不同的核,大小核之上就变成一个很复杂的问题。在正常情况下你不会处理这么底层的计算的挑战。但是如果你做一个对性能要求非常高的游戏,你往往需要去考虑一下它。这时候你就遇到一个问题,我想在座各位多多少少对图形渲染有一定的了解,对Unity一定的熟悉。你想想怎么在屏幕上画一个立体的物体,你就是告诉它顶点在什么地方,面片怎么贴。至于怎么画,真的是很难干预。这就带来了很大的问题,你确实有很多的资源,有很多想法。随着这种生意越来越大,我们的行业的图形技术维护的组织也听到大家心声,经过一个个沟通,最后有了一个新的API诞生。就是Vulkan,有点像英文的火山的意思。为什么呢?因为这个代表它具有巨大的潜力,它有哪几个方面和以前的API比起来不一样呢。

第一个,其实真的下一条命令去绘制,是经过很多层。我们厂商开发的驱动程序本身也是一种程序,只是在更底层怎么去工作。如果说这个API本身比较复杂,比较陈旧就不能反映最新硬件的特性。我们在开发这个驱动的时候不可避免一些不必要的复杂性。我们有全新的API就可以减少这部分的消耗。另外一方面,硬件最大的变化是什么?手机的核数越来越多,CPUGPU都变成多核的。多核代表多线程,如果只是单线程的话,没有办法。所以,我们提供一个更好的多性能的支持,变得非常紧要。然后CPU我刚刚说了有大核小核,大核小核的计算能力不一样。如果说你把小核的任务给大核分配,可能又会浪费一些资源,怎么样做一个动态的配置任务呢。这是一个很有挑战性的技术问题。这个在Vulkan上面得到了相对比较完善的解决。这个解决实际上效果怎么样,还是要开发者提高。

好,刚才我大抵说了一下Vulkan  API的背景,我后面再给大家详细地介绍一下使用Vulkan API会带来哪些潜在的好处呢?这边是一个很简单很简单的图,把复杂的API抽象成几个模块,这里面是Appllcation,是大家自己去写的代码,或者是一部分的逻辑。我先不讲这里面的内容,我先看这几个方块里面,最大的就是绿色的这一块。最大的复杂性现在被移到了上层,APP的层面。后面的编译层等等都会变得比较小,比较轻。为什么要这样做呢?这里面有一个最关键的一点,也就是说,作为开发者其实只有你心中有数,这一步要做什么,下一步要做什么。底层接受命令的层面,要么是被动去执行,要么通过内在的逻辑去猜测你要执行什么。有时候需要你去作弊,以前你听过一个故事,在某某跑分软件里面,你把名字改一下,跑分就不一样了,这就是猜测逻辑。开发者和最后的客户,他们也面对很复杂的场景。我想买一台真正很好性能的手机,其实很难挑对。其实这个里面,也代表了机会,虽然问题非常复杂,但是终于找到一个正确的方向。一个就是说简化这个driver,第二个就是多核多线程的支持做得更顺畅,方便上层的人使用。然后可以更好地保护知识产权。如果说你是内部做开发测试版本的话,你又可以非常方便地去一步一步地调试。这样各种新的特性都使这个API变成一个全新的平台。

这里面最大的特性就是Multi-threadingmulticore efficiency。当你绘制的场景里面有很多物体有很多并发的事件的时候,它提供的帮助非常多。反过来,你的场景卡住了,它能提供的帮助要有限一些。大家看一下你面对的实际最大的挑战是什么,来决定采用什么样的方式去做优化。

后面的Multi-passrendering会跟大家介绍一下。它是非常具有巨大潜力的东西。现在到了Vulkan的时代,跟OpenGL的时代不一样。GPU第一念头是显卡而不是电脑或者手机。而今天看来,一定是移动设备占了大多数。一开始在蓝图上面就把移动芯片全部考虑进去,现在可以通过Vulkan,可以更好地发挥它的潜能。我后面会介绍一下它是怎么样的潜能,为什么会有这么的高效。目前Unity对于Multi-pass还在起步阶段,可能在不久的将来会逐渐成熟的一个feature

Multi-pass简单来说,如果你想要画一个比较复杂的,接近真实的光的场景的话,你要做很多很多子步骤。在这里面,我图上画的是一个有光照的场景的renderpass,通过几轮渲染以后合成出一个非常非常逼真的场景。这种算法解决方案,它有一个最大的挑战就来自带宽。你每一次做完显然以后,你会需要前一次的结果,把后面的结果跟它做一个后面的运算。这就不可避免地带来大量数据的写入和写出。这个带宽现在硬件的进步变得非常非常高,但是高带宽带来的是高功耗以及高成本,在移动设备上面是非常禁忌的事情。我们又想实现一样的效果怎么样呢?其实天无绝人之路,我们确实有一些主流的GPU都没有的特性。这个就是Tile-basedTile就是马赛克。我们在绘制画面的时候,也是采取一样的策略,把这个问题由大变小,把屏幕划分成小区域,然后一块一块去处理。绿色的上面有一个一个小方块,这个箭头代表着频繁访问,高速访问的流程。它和我们其他总线的输出和写入是不一样的。它基本上没有任何cocos,非常非常快。所以在移动平台上面,我渲染完一帧以后,是把很多Tile组合在一起。这个做完以后,做另一个Tile。但是如果这个画面上绘制好几遍,最后再合成一个好的画面的话,每一次上面那个Tile绘制完以后的话,我直接缓存下来跟后面结合一起,就可以省出一部分时间。这就有一个很大的帮助。随着将来给你的支持逐渐完善,你就有办法做很多很多超过总带宽值所允许的工作。

我刚才说了Vulkan这么多的好处,大家可能会有一个问题,我其实并不想真的写这么多底层的代码。其实非常非常简单,我整个最简单的就是这个模块。首先你安装Unity的时候需要看一下你有没有安装好安卓的支持。目前为止还是基于安卓的平台,如果你已经把安卓这个模块加入以后,只需要显示屏幕上的六步就可以搞定。这里有一个蓝色的箭头,这是它支持的三种API。我们选了Vulkan以后,里面的内容就是Vulkan的。就是这么简单,这个细节大家不用去着急,一个是你可以去ARM网站上去看。另外一个Unity的最新的手册上面也有。它是一个产品feature。这个是ARM的开发指南中的一部分。这个开发指南大概有百来页左右。如果大家有兴趣,可以去我们ARM官网上去下载。如果时间比较紧,我们展台上有纸质的打印出来的。

实际上有很多人已经尝试Vulkan了,实际当中他的表现怎么样了。我们后面通过一些case给大家看一看。这个很炫的一个画面,这是一个游戏,它的名字叫做Sky Force Reloaded,目前为止在Google Play上还只有OpenGL的版本下载,Vulkan的版本会在不久的将来发布。因为这个工作室Inifinite DreamsARM有很好的合作,我们共同对Vulkan内部版本做了一些评估工作。这两幅图是后面可以给大家秀一个视频,大概几十秒。这是两幅截图,这是一个表,中间还有一个指针。左边是Vulkan的渲染画面,右边是OpenGL的画面。左边的比较节省电能,同样的游戏体验可以玩更久。我们反过来在同样的帧率,你可以看到这边同样地观看你的位置,这个屏幕上面明显更复杂,更多的星星,和其它各种物体细节,大概能多2-6倍。所以是我们做的实验的结果。如果在同样一个平台上面,你的场景复杂度可以提升很多倍。我们现在看一下这个视频。你仔细去看,它的半透明效果做得非常不错,这个工作室是波兰的,基本上在整个渲染的过程,从前到后,Vulkan都在功耗上面占据一个很大的优势。下面我们再看一下在同样的60帧率下面,能带来怎么样不同的场景复杂度。像场面上的星星这边要多6倍,像其他子弹、敌人细节基本上是两倍左右的区别。这个是它里面这个游戏的第七关里面的场景,是相对复杂的场景。

我们刚才已经大概对这个游戏场景有了一个直观的认识,它的特点是什么?我们可以看一下,我们遇到了哪些问题呢?永远保持60帧还是比较有挑战的。不可能一卡一卡的,然后Fill rate也有很多很多的场景。所以把CPUGPU推到了极限。这里面有两条曲线,蓝色是Vulkan,红色是OpenGL3,基本上Vulkan始终保持在20%多的性能。它更稳定。OpenGL性能与功耗上窜下跳。特别在移动设备上,当这个温度超过某一个值的话会降频的,引起更多麻烦河卡顿。如果一直保持的话,整个体验是非常smooth的。我把这个场景变得极端复杂的话,Vulkan也始终在OpenGL的体验之上。如果你的写法没有问题的话,使用Vulkan肯定更加高效。

我这边讲的是商业项目,已经发布过的产品。后面有一个在实验性的产品,叫Lofoten,它还没有完全发布。在不久的将来你可以看到Unity也提供类似的新的特性。Lofoten这个demo有什么特点,它有很多地方是很复杂的。整个场景是你飞到一个岛屿上面,这个岛屿在太平洋中间,然后它里面有2.5百万的图元,而且有很多很多的光照,同时里面还有一个挑战,因为是模拟在海中的岛,有很多的波浪。开发游戏的人知道波浪不是那么简单的事情,你要很高效地模拟一个大面积的水面,是需要一些技巧在里面的。而且以前的运行版本里面还需要一些其他的东西。如果大家有兴趣,可以跟我们线下去交流。这个是对它的一个总结,这是我们为什么这个场景有一些区别。这个是Lofoten 1.1的版本,我们增加了一个黑夜里光照的场景,而使用了Vulkan之后,我们用了一些实验性的新的东西。这里面的lighting pass也不太一样,然后再加上光影,再加上雾的效果,再加上灯光的效果。最后再加tonemap,我们在里面大量使用了Vulkan的特性。包括一些优化的方式,还有multi-pass

最后我不讲细节,最后看一下采用了这么多优化以后,有多少的提升呢。这个图是我们ARM出品的工具,是stream line。从不同的角度去帮助大家解决问题。一个是面向timeline开发者的工具,当时的GPUCPU,可以告诉你当前这个点上,GPUCPU每个线程消耗多少个点,有多少吞吐的数据。全部都可以看到。经过这个工具的检测,我们是使用了multi-pass之后,我们节省了一半的带宽。然后我后面给大家讲一下ARM的工具链,看一下我们可以做什么样的事情。重点讲一下Mali Graphics Debugger。这个套件比较昂贵,如果你有兴趣,你可以免费下载,用三个月。在不久的将来希望有一个计划,希望把它从套件里面剥离出来。另外一方面,除了这个以后,这个是从头到尾都免费的工具,会有吐嘈。但是最近的一年多以来,它的进步非常大。第一个就是支持的non  rooting的设备,一插就可以调了。不像以前还需要破解,挺麻烦的。同时还有很多新的feature的加入。另外一个方面,还有特别的优势。支持VulkanAPI的工具还不太多见的,这不是那么容易的。而我们ARM的特点,就是open  GL可以做的事情,我们可以做得更好。这是一个广告图,先进的APIDebugger,还可以录制和运行。把所有参数全部存下来,在另外一个设备上或者另外一个时间可以全部播放出来,可以看一下问题出在哪里。它支持安卓,同时也是免费的。它的UI这边看得不是特别清楚,但是基本上可以知道有几大块。可以看到frame Buffer里面有几种运行。如果我们想做一个ARM现有的工具链做一个性能分析,是怎样的步骤呢?

基本上是调试分析和优化。这两个一结合,你就可以做很好的优化。另外一方面,还可以用shader命名行的。它就是在我们PC上面可以把一段在移动设备上面的跑的编译一下。可以告诉你简单的优化建议,光编译就可以看出来。所以把三个工具结合在一起,你可以处理大部分的优化挑战。我们建议大家还是跟Unity本身自带的工具一起去co-work,这样会事半功倍。

到了Vulkan这方面,我刚才说过,它在Vulkan上面做的比其他工具更好。所以你要通过对Vulkan进行调试,它里面可以帮你做成哪些呢?可以录制回放,可以帮助你看每一个函数调用参数下了什么。还有模型图片原型是什么样的,然后Vulkan是一个非常复杂的API,如果没有合适的工作,你一定会陷入非常尴尬的境地。有了Unity的助力之后,这个就没有什么太大的问题。如果大家已经心动的话可以在Unity上面去应用。四个步骤就搞定了,它和OpenGL是一样的。所以你以前可以做的事情,现在一样可以做得更好。

时间比较快了,给大家看一下。这边最左边OpenGL ES有一个什么最大的区别,比例不一样。以前大黑盒子,都是芯片厂商很厉害的工程师在那里搞了很多名堂里面。现在丢给大家了,其实是丢给隐形的更多。这时候还是需要APP开发者注意一下,能够更可能地在APP的最高层面上做到一个很好的工作的安排和组织。大家可以想象一下我们现在不谈移动设备,我们谈谈人。大家很多都是开发者,我们想象一下你在一个团队里面,管理团队里面有好几个老大,基本上只有一个人真正做事,其他人负责跟他吵架。你们这边有几个兄弟很厉害,但是他们都不知道干什么。这就很痛苦。这是理想的生活,几个老大分工很明确,工作很smooth,最后给你一个就是清晰明确不轻易改变的工作列表,这样效率就很高。这可以把抽象的东西变成可视的。这是我今天讲的关于Vulkan的内容。

后面这里有一些资源链接,如果有时间欢迎大家去看一下。我们的位子是C03,特别是我们的ARM Guide for Unity Developers现在英文版本是3.3版本,中文是3.2版本。后面是关于如何build一个支持MGDVulkanAPP的技术博客,是我们剑桥的的专家撰写的。下面还有两段链接就是刚才秀的那个射击游戏的视频。如果你对ARM的架构有兴趣,对Vulkan API有研究,同时跟我们想做一个深入交流,可以发邮件给我们这个邮箱 developer@arm.com 我们会跟你们做进一步的沟通。非常感谢大家,谢谢!

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引