Loading… 英特尔是如何优化游戏性能的?_TOM生活
首页 > 生活 > 正文
Qzone
微博
微信

英特尔是如何优化游戏性能的?

泡泡网    2021-08-01 20:22

游戏已成为ChinaJoy的重要组成部分。在今年的ChinaJoy上,英特尔特别邀请了英特尔游戏合作技术经理卢卷彬,为与会媒体们分享了很多英特尔在游戏方面的优化措施,干货颇多,值得大家细细品味!

英特尔是如何优化游戏性能的?

英特尔游戏合作技术部门是服务客户的团队,需要时常跟游戏开发者一起讨论很多技术问题,而现在的疫情对我们的团队影响也是非常大的。作为一个全球团队,英特尔游戏合作技术部门在欧洲、美国、中国、日本、韩国等所有在游戏开发上非常有实力的国家和地区都有团队在负责,我们会尽可能接触所有的游戏开发者,为他们提供技术优化的服务。我们去帮助游戏开发者是搞定性能问题,当然游戏好不好玩,我们能提供的帮助不多,但是我们希望能够在性能优化上成为客户的依靠。

为什么游戏性能很复杂?英特尔可以提供什么帮助,以及简单的游戏优化的方法。

英特尔是如何优化游戏性能的?

这是一个最简单的游戏架构,可以看到最下面是驱动和硬件,上面就有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 的原因是什么,花了多长时间,都可以给你指出来。

这样对开发者来说,就可以对程序有一个非常总体的了解,哪一个线程是瓶颈,哪一个模块是瓶颈,哪一个函数是瓶颈,甚至具体到哪一个代码,真正让你清清楚楚,明明白白,知道在哪里改进会得到最好的优化。

英特尔是如何优化游戏性能的?

在GPU上,英特尔也有一个很好的工具GPA。虽然说我们现在还是集成显卡,但是未来你懂的。在过去十来年我们和客户合作过程当中,GPA 工具也是广受客户赞誉的,它会对整个游戏总体的情况,具体到每一个 Pass,每一个 Draw call,每一个Shader,每一个参数都可以通过这个能够发现,你可以方便定位这些问题,然后让开发者知道是什么情况。这个截屏也是一个整体的概况,从这里面可以看到它有很多的性能指标,包括你有多少个 Draw call,你每一帧的情况都能详尽展示。

英特尔是如何优化游戏性能的?

当你只有一台机器的时候,你可以像右边这样。左边这个情况是说你可以连到局域网当中的任何一台机器上,互不影响的收集这些信息。右边这个是说你也可以直接切换到程序界面上,用一台机器就可以看到这些性能信息,非常的方便。

英特尔是如何优化游戏性能的?

客户还会经常碰到一个问题,我在玩一个游戏的时候突然掉帧,但是我不知道它是在哪掉的,我根本来不及抓取。我们还提供这样的功能,你可以抓一段时间里面的每一帧的 Frame,抓出来之后,它可以把每一帧的时间都显示来,然后你可以点其中最耗时的那一帧然后去播放。它从前面一直播放到这一帧就会停止,然后再把你这一帧的数据打开。比如说播放到这里就停止了,这就是最耗时的那一帧,接着把这一帧打开,你可以明显看到你有多少个 Draw call,比如说这一帧上面有多少个 Draw call都可以看到,每一个 Draw call 的时间花费多少都显示的非常清楚明白。

英特尔是如何优化游戏性能的?

它也会对你整个这一帧有一个根据你的 3D Pipeline 来的分析。比如说右边就是在 3D 当中,我渲染一帧要经过哪些步骤之类的。左边对应的我们的 GPA 就会告诉你,你在渲染这一帧的时候,其实是你的 Back-End 这边有最明显的问题。英特尔和游戏开发者就知道,我们怎么着手去搞定这个问题。

英特尔是如何优化游戏性能的?

另外是说我可以看到每一个 Draw call 里面我用到了哪些模型,这些模型究竟有多少个顶点我都可以看得很清楚。比如说这块石头用了 8000 多个顶点,这样是不是就合适呢?它耗时多长时间都会显示出来。这段Shader代码是什么样的都会显示出来。

英特尔是如何优化游戏性能的?

除了工具之外,人也是非常重要的。英特尔有一些技术工程师在游戏开发的早期就会进去。另外英特尔在发布一些新的平台的时候,我们会在测试版的机器就会给到这些开发者,让他们提前进行适配。我刚刚也说了,我们是一个全球团队,我们本地有一些问题能够解决的我们就解决,不能解决的还可以把这些问题带回给其他的团队来帮助我们解决。国外和其他的大厂做过什么样的优化,有什么好的优化方法,也可以带回来介绍给国内的开发者。另外我们还有测试服务,一个游戏过来,我会帮你测试你所关注的好几个平台上的性能。很多开发者本身也许拥有的机器是很少的,但是他想进适配或者是覆盖的玩家设备,这个时候就可以帮到他们对大部分的平台做性能分析或者是测试,然后反馈给他们,当你发现一些问题的时候,他才会有目的性的去准备一些平台进行这种优化。

前面谈到的是如何找问题,找问题是非常重要的一步。找到问题之后你如何优化呢?这里有几个办法:

英特尔是如何优化游戏性能的?

第一,发现和修正代码。因为代码的数量非常大,也非常复杂,尤其是一个游戏团队当中有程序开发,也有美工。你现在使用游戏引擎开发,美工的工作量会剧增。这两者之间可能互相之间不会相互考虑,美工考虑的是我把这个东西正确的渲染出来,但是我有没有把一些参数设置好,一些 LOD、遮挡,以及关系到性能的参数,我有没有设计到最好?

第二,并行优化。并行优化谈了很久,它包括两个层面,一个是多线程并行,也就是说四个车道跑总是比一个车道跑得快,并行优化可能是优化得到回报最高的。这当中英特尔的 TBB 可以帮助你前后线程池的调度。CPU 的多线程优化,尤其是针对游戏相对 GPU 是非常难的。因为 GPU 就是处理几百万个三角形,几百万个顶点,它是天然的顶点和顶点之间,三角形和三角形之间是没有依赖的,所以天然的我用几百个或者是几千个显卡单元去计算,都可以得到非常线性的性能提升。但是 CPU 里面,其实它有很多逻辑,有很多模块和模块之间的依赖,所以就非常难。幸运的是英特尔也在和行业当中最重要的合作伙伴合作,帮助游戏开发者解决这些问题。比如说我们和 Unity 合作,做了 ECS和Job system,现在 Unity 对多核心的支持是非常好的。另外我们还和 Unreal做了Unreal Task system,用线程池的方式,把很多的任务可以提交到 Unreal 的任务系统当中,去充分应用多线程。第二个层面的并行是指令级并行,大家知道 SIMD 指令集,在一条指令里,我可以处理 8 个顶点或者是 8 个核点数。这个到开发者手中去做也是非常难的。因为你要么手工去写一些汇编或者是写一些 Intrinsic,你需要把 C++ 的这些算法改成 Intrinsic 这种指令集还是相对来说比较复杂的。这里面英特尔也在想办法给大家提供一个简单的解决方案,我们称之为 ISPC,这是一个编辑器,它可以把你的 C 和 C++ 代码编译成能够使用上,加速计算的binary,其实在 Unreal4 和 Unreal 5 当中的 ISPC 也是我们的工程师帮助他们做的。前面大家看到的 Chaos 物理破坏引擎就是使用的英特尔 ISPC 的编译器。其实在 Unity 也有类似于 ISPC 的编译器叫 Burst,这也是属于在大范围应用的。所以你是使用 Unreal 或者是 Unity 的游戏开发者,就可以非常简单的进行一些设置和调用,就可以用上这些性能,这是我们英特尔和行业合作伙伴一起在向前推动的事情。

第三,算法优化。这是针对具体游戏具体分析,游戏场景,游戏玩法上,哪一部分是非常突出的瓶颈,应该如何优化它,是采用更好的数据算法还是调整我的数据结构,还是说开发者去调整场景布置之类的。这是需要游戏开发者跟我们一起来进行讨论,进行头脑风暴的一种优化方式。

第四,底层架构优化。英特尔也在针对每一个工作负载去分析,它在我的CPU流水线上的表现。一个游戏开发者把前面的都做好了,还是觉得性能不好,他也有余力、有时间,可以进行一些底层架构的优化,我们英特尔的工程师也会提供建议给他们,让他们去评估一下这个对我CPU代码架构改变有多大,会不会影响我的可维护性之类的东西,让他们去斟酌。

接下来分享的是英特尔在过去两三年里,在国内的一些游戏优化,其中有一些是CPU相关的,有的是集成显卡相关的。可能有一些数字比较夸张,因为本身我们进去的时间是比较早的,那么我们就开始用这些分析工具跟他们一起去斟酌,里面哪些是有问题,是需要去分析的。所以基本上得到这样的结论,开发者对我们英特尔提供的帮助非常赞赏。

英特尔是如何优化游戏性能的?

游戏开发者就是英特尔的客户,客户就是我们的上帝,我们会持续跟他们一起合作,不管是对他们未来的产品还是英特尔要发布的新架构的CPU,我们都会持续在这上面进行紧密合作。

作者:张帆

 

广告
责任编辑: 3976DBC

责任编辑: 3976DBC
人家也是有底线的啦~
广告