当前位置:首页 > 游戏信息 > 正文

技术精讲

技术精讲-第1张-游戏信息-龙启网

一个幽灵,性能问题的幽灵,在游戏项目内徘徊。过低的帧率、随机的卡顿,以其高度的隐蔽性和修复难度,犹如噩梦般,困扰着项目进度、程序开发以及未来的市场口碑。面对资料的匮乏或不合适的工具,开发人员难以定位并修复问题。整个项目,自上而下弥漫着担忧的氛围。

本文的主要目的,在于讲述一些通用的性能分析的方法,帮助各位定位分析游戏中的性能问题。希望这篇文章,犹如在性能分析的荒漠痛苦前行时,能够解渴的一杯水,帮助各位学会停止担忧并爱上性能分析。

在解答这个问题之前,首先需要明白,CPU在游戏这个舞台上的角色。CPU的主要角色是进行物理计算、AI计算以及提交GPU绘制命令。过多的物理和AI计算,可能影响GPU绘制命令的提交,加上不合理的GPU绘制命令提交,就会使得GPU无法发挥峰值性能。所以,游戏CPU性能问题,其实就是木桶的最短木板问题。不合理的CPU调用,就是导致木桶水位下降的那块最短木板。合理化CPU调用,使得GPU发挥峰值性能,问题自然迎刃而解。

那么,理想的CPU性能分析工具是什么样的呢?在游戏CPU性能问题浮现时,自然会去寻找分析工具。各个CPU厂商、操作系统,都有一套基于硬件性能计数器的CPU性能分析工具。然而,这些传统CPU性能分析工具是否适合游戏呢?

答案是:是,也不是。他们在游戏CPU性能分析中,发挥着重要的作用,但是不适合做初步分析。传统的CPU性能分析工具默认统计的是每个函数的运行效率,但占据CPU时间最高的函数,可能并不是导致帧率下降的罪魁祸首。游戏的表现基于时间线而非函数,前一秒表现正常的函数不代表下一秒不会导致掉帧。因此,统计结果需要基于时间线,而非函数名展现,才能找到某段时间内表现不正常的函数。

基于时间线的结果展示,很多传统CPU性能分析工具已经实现。但这仍旧缺少一个至关重要的因素:表现不正常的是哪段时间。游戏的主要性能指标是基于GPU,帧率的降低意味着CPU没有发挥出GPU的峰值性能。所以,和CPU同步的、基于时间线的GPU使用率也是必不可少的,由此就能得知GPU表现不正常的时间段。

综上所述,理想的游戏CPU性能分析工具包含:

1. 基于时间线的GPU使用率统计,用以确定帧率表现不正常的时间段。

2. 和GPU同步的、基于时间线的CPU函数调用统计,用以发现帧率表现不正常的时间段内不合理的CPU函数调用,进行初步分析。

3. CPU性能计数器,用以调查不合理的CPU函数内部硬件性能问题,进行深入分析。

为了找到合适的工具进行分析,本文将介绍一些可供选择的工具。其中,Windows Performance Toolkit (WPT) 内的Windows Performance Recorder (WPR)和Windows Performance Recorder User Interface (WPRUI)是获取事件跟踪(ETW)的标准工具。然而,由于ETW可以记录几乎所有操作系统的事件,WPR和WPRUI里的选项非常庞杂。此外,它们没有快捷键可以在后台启动,必须从游戏窗口切换到桌面开启记录,游戏窗口的失焦必定导致游戏帧率下降,从而导致收集到的数据失真。因此,一个无需设置、有快捷键、随开随用的ETW记录工具是一个理想的选择。

这里比较推荐UIforETW,它是一个开源的、可视化管理ETW的解决方案。UIforETW可以方便地管理捕获的ETW文件,并提供了后台快捷键,事件捕获随开随关。其选项足以应对绝大多数C/C++为开发语言的游戏,操作方便快捷。唯一需要注意的是GPU跟踪默认未勾选,勾选以后便能捕获GPU队列数据。

通过使用ETW进行初步性能分析,可以快速定位问题所在。例如,通过分析ETW记录,可以发现GPU渲染队列有明显的空隙,只需展开游戏进程,查看此时间段内的CPU调用,就能很容易地发现问题所在。由此,将CPU导致的GPU性能问题简化为队列填空问题,移除或修复不合理的CPU函数调用,保证GPU队列的满负荷使用。

此外,本文还提供了一个实际游戏项目的案例,通过分析并解决一个随机掉帧卡顿的问题,验证了理论的有效性。在项目中,通过清除着色器缓存,保证没有消耗资源的后台进程以减少干扰,运行游戏之后使用UIforETW开启捕获,发现卡顿后关闭捕获,便能获得一份干净的ETW记录。使用GPUView打开ETW记录,发现大量的GPU渲染队列空隙。通过配置好PDB路径,放大空隙,展开游戏进程,发现可疑的线程调用堆栈,从而找到了问题所在。

最后,本文介绍了几个可以分析ETW的工具,如GPUView、Windows Performance Analyzer (WPA)、Visual Studio Concurrency Visualizer和Superluminal。每个工具都有其特点和优势,用户可以根据自己的需求选择合适的工具。正确的问题能够促使用户寻找正确的答案,无论何时何地,答案并非唯一,但问题才是关键。

通过本文的学习,希望能帮助各位在游戏项目中更好地定位和解决性能问题。后续还将有更多专题内容分享,欢迎各位将自己感兴趣的问题在评论区告知我们,或许就会成为下次分享的主题!

Harry

AMD DevTech Engineer,专注于帮助游戏开发者高效利用AMD处理器。其工作内容包括:分析PC应用程序以及游戏在AMD处理器上的性能问题,以及开发基准测试。