卢卷彬:大家好,我是英特尔游戏合作技术经理卢卷彬,很荣幸有这个机会和大家分享英特尔在游戏方面的优化。
我们是服务客户的团队,需要时常跟游戏开发者一起讨论很多技术问题,而现在的疫情对我们的团队影响也是非常大的。
作为一个全球团队,我们在欧洲、美国、中国、日本、韩国等所有在游戏开发上非常有实力的国家和地区都有团队在负责,我们会尽可能接触所有的游戏开发者,为他们提供技术优化的服务。
我们去帮助游戏开发者是搞定性能问题,当然游戏好不好玩,我们能提供的帮助不多,但是我们希望能够在性能优化上成为客户的依靠。
游戏性能很重要,而且其中也发生了很多“事故”。我们非常期待的很多游戏 IP 一经推出就发生了各种各样的性能、兼容性问题,随后口碑向下,整个项目就失败了。如果游戏项目非常受欢迎,即便有性能问题,但玩家可以为了玩这款游戏自行升升级 CPU、GPU。
前两年的《PUBG》非常火爆,众多玩家为了玩这款游戏去升级CPU、GPU。热度平稳后,《PUBG》主动找到我们,需要我们帮忙做很多优化的工作,比如在 CPU 以及中低端的显卡上面优化游戏体验。
游戏性能当然分硬件和软件,硬件方面主要是 CPU 和 GPU。从 CPU 方面来说,英特尔一直在不断演进 CPU 架构。我们会去收集市场上几十上百款游戏,详细去分析这些游戏在我的 CPU流水线当中的表现是什么样子的,瓶颈在什么地方?是在前端解码的时候,还是在计算系单元执行的时候,还是在存储系统的时候,还是在分支预测的时候有问题?我们会分析上百个工作负载在最新架构处理器上的表现。如果我们发现问题非常突出,那我们在下一代 CPU 架构设计上就会改进这一部分。
比如说最近一两年我们通过分析发现,当前游戏类别最大的瓶颈在存储系统上,这个存储系统包括 L1,L2,L3 cache,以及系统内存。当我们去改进这个游戏性能的时候,需要考虑如何设计下一代的架构,在CPU的面积、功耗、制程各种限制条件下提供一个最优解。
可能大家发现在 Tiger Lake-H 上面,我们就提升了存储性能,修改了 L2 和 L3,所以它的性能更加出色。未来我们也会持续根据市场上流行的工作负载,不断改进 CPU 架构,让它能够给玩家提供最好的游戏性能。因为游戏是 PC 产品最看重的软件类别之一,游戏体积会越来越大,游戏对 CPU 的要求会越来越高,它是我们最关注的,相信未来在游戏方面我们会持续加强,我们团队也会持续对游戏开发者提供帮助。
除了硬件本身之外,其实软件的优化再怎么强调都不过分,它也是非常重要的。英特尔其实在X86架构上耕耘了几十年,服务了几乎所有的基于 X86 的软件产品,游戏也是非常重要的一块。几十年来,英特尔投入了很多资源来开发性能分析工具,来培养性能分析、性能优化的工程师团队,让他们帮助行业当中的开发者能够充分和硬件结合起来,提供最好的性能和游戏体验。
我们可以畅想一下,其实在游戏领域还有很多性能问题是需要我们和所有的开发者一起来解决的。《Warhammer》是一个对战游戏,一个游戏场景中可以有上千个不同的单元同时出现,每一个单元都有自己的 AI,都有自己的动画,每一个都有互相之间的碰撞。
还有前两年 Unreal 宣布的 Chaos 物理破坏引擎,整个游戏中的东西我们都可以进行破坏,破坏出来的粒子和石块之间还可以互相碰撞。现在这样复杂系统的效果,其实只有大的公司才可以做。我们希望有一天所有这些东西,即便是小的游戏工作室也可以唾手可得,到了这一天,这是我们团队希望在这方面尽的一点努力。
今天我跟大家分享一下为什么游戏性能很复杂,英特尔可以提供什么帮助,以及简单的游戏优化的方法。
这是一个最简单的游戏架构,可以看到最下面是驱动和硬件,上面就有 Graphics Runtime,包括 DirectX、OpenGL 或者是很多其他的中间件。再上一层就是引擎,还有最上面的游戏,每一个模块里都有非常多的公司去提供解决方案。
比如说中间的游戏引擎,像Unreal、Cryengine、Frostbite、Unity等,这里面 Unreal 和 Unity 是商业化最成功的引擎,也是大家听得最多的,不管是手游还是 PC 游戏都在用。它们非常复杂,当中都有上百万行的代码,因为都是开放的,可能会有两三百万行的代码,非常复杂。模块也非常多,包括资源管理、内存管理、角色行为、AI、图形渲染、声音、网络、物理、UI、特效、动画、输入等等,非常复杂。
当中的厂商很多、模块很多、代码巨大,游戏类型也是非常大的。比如说一个车枪球,这种游戏的玩法差别是非常大的。但是有一个好处是说,一个系统太复杂之后,就像人类社会一样,我们会把它分工,每个人把自己的那一块做大。
游戏系统也是如此,有专门做引擎的,有专门做声音的,有专门做物理的,有专门做渲染的等。有了这些非常专精的公司把很多内容包装好之后,对很多游戏开发者来说就非常容易了。其实在图中黄线以下,就像 Unreal 的引擎,把很多内容都已经包装好了,即便你只是一个开发者,你也可以使用它的引擎去开发一个还不错的游戏,极大的方便了游戏开发者,也很大程度上推动了游戏行业的发展。
对于一些大的游戏公司来说,即便是用 Unity、Unreal 等引擎仍然需要进行二次开发,这时性能问题就需要你自己非常关注,因为经过二次开发,很多代码已经被改变,要支持这么复杂的游戏系统,性能优化就非常重要了,而这个时候我们就可以提供帮助。
性能优化如何去做呢?其实非常简单,就像你怎么把大象装到冰箱里一样,找到问题,解决问题。
这两个问题都是非常重要的,甚至某种程度上,找到问题更重要。因为解决方案其实现在这个支持在互联网时代大家都是共享的,你遇到任何的问题都不是你独有的问题,在互联网上会有很多人也许就这个问题进行过讨论,你可以从中得到很多的启示。
在这里面,英特尔能够提供什么帮助呢?
我们说工欲善其事,必先利其器。英特尔这几年的经验有相当一部分的资源就是有一整套的性能分析工具。一个负责任的性能分析工具应该是什么样的?应该是自上而下的把程序的问题搞的清清楚楚、明明白白。
英特尔 Vtune 分析工具在行业里面名气还是响当当的,无论还是服务器还是客户端,它可以从系统层面一直到每一个线程,每一个DLL,每一个函数,再到每一行代码,再到汇编都可以给你整的清清楚楚,明明白白的。这也是经过了我们几十年的沉淀,而且它是免费的。
下面是一个非常简单的截屏,当你用 Vtune 跑的时候,它会有一个整体概况,左边我们可以看到,这个程序花了多长时间,对多线程的利用是多少,右边还会去建议你下一步还可以用微架构再跑一次,更详细的针对微架构的分析,或者再跑一次针对内存的分析,可以让你进一步了解。
右边的就是针对微架构的分析,可以看到是前端有问题,还是在解码有问题,还是说内存有问题,L1、L2、L3,包括 DRAM Bound 各自的百分比是多少,都会给你演算出来,这是一个非常整体的概况。
左下角是每个线程的概况,每个线程在每个时间点的活动是怎么样的,线程之间有没有一些同步关系,替代关系,都可以看得很清楚。在每一个时间段,每一个线程当中是哪些函数在运行,甚至是说每一个函数运行,再往下面直到每一行代码都可以给你指出来,每一行代码主要 Bound 的原因是什么,花了多长时间,都可以给你指出来。
这样对开发者来说,就可以对程序有一个非常总体的了解,哪一个线程是瓶颈,哪一个模块是瓶颈,哪一个函数是瓶颈,甚至具体到哪一个代码,真正让你清清楚楚,明明白白,知道在哪里改进会得到最好的优化。