在上一篇文章中我简要的介绍了一下我们要采用的平台(PowerVR GPU+Cocos2d-x),以及一些列的评测规则和工具。这本篇文章中我将向大家展示如何使用PVRTune工具来鉴别性能瓶颈。
搭建测试环境
如果你想体验一下Fantasy Warrior 3D(幻想勇士3D)这个游戏,你可以访问“这里”,提供了游戏视频介绍,然后访问“这里”下载这个游戏的源代码。
第一步我们需要按照Fantasy Warrior 3D(幻想勇士3D)工程目录下的README.md文件说明编译游戏。然后我们才能够使用PVRHub和PVRTune工具记录性能分析文件。我已经将我的记录文件提交到了“这里”。这些文件记录了如下环境下分析信息:
? 硬件信息
o 设备名称:昂达V989平板电脑(Allwinner A80芯片,PowerVR Series6G6230 GPU)
? 软件信息
o 安卓系统版本:4.4.2
o 驱动信息:版本1.4 Rogue_DDK_Android_RSCompute rogueddk @3234138 (正式版) sunxi_android
o PVRTuneDeveloper:版本V14.111.1(SDK bulid 3.5@3530647)
o PVRpPefServerDeveloper:版本V14.111.1(SDK build 3.5@3533642)
o PVRTrace记录库文件:版本V20(SDK build 3.5@3533642)
鉴别性能瓶颈
在这游戏中要想鉴别性能瓶颈,我们可以采用PVRTune工具。在所有的记录文件(*.pvrtune)中我提取了一个具有代表性性的数据文件(2338)。我将用下面列出的几条标准向大家解释如何借助PVRTune工具来鉴别性能瓶颈。性能瓶颈一般可分为以下五种类型:
? CPU局限
? 顶点局限(游戏中一般有顶点着色渲染)
? 垂直同步局限
? 碎片局限
? 带宽局限
CPU局限
CPU性能显示还是很容易鉴别的,尽管显卡的使用率不高但是我们可以明显感觉到性能很差,帧率很低。借助PVRTune工具更能直观的鉴别出来,受CPU性能局限的应用往往CPU的负载会达到或者接近100%(a)。
其它鉴别因素还有着色器加载的间隔,这个间隔表示PowerVR硬件将进行暂时休眠,因为它可能正在等待CPU操作完成
(b)或者GPU正在等待下一次的帧同步。
以Fantasy Warrior 3D(幻想勇士3D)为测试对象,我们收集了如下数据:
从分析图中我们可以看出CPU的负载率仅为12.0%,但是在Tiler和渲染之间出现很多较长的间隔。因此PowerVR硬件在等待来自渲染线程(10612)指令的同时进入了休眠。所以此游戏的最大问题就是Cocos2d-x引擎不支持独立的渲染线程。每一帧的渲染都需要等待游戏逻辑完成后才能进行。在第三行的时序图中你可以发现每一帧的图像API调用之间都有很大的间隔,这表明CPU的性能局限。
Vertex(顶点)局限
顶点局限的原因是每一帧都有很多定点需要处理或者是使用了复杂的顶点着色器,亦或者是两者共同的原因。我们也可以通过时序间隔来鉴别,在渲染操作(a)时序中会有很多大的间隔,而在Tiler操作(b)时序中只有很小或者没有间隔。
我们可以从顶点加载处理过程和Tiler加载计数器中获取更多更详细的分析数据。如果Tiler激活指示曲线(c)是很高的一条线而加载处理过程不是:说明Vertex(顶点)过程并没有很多顶点元素需要处理,性能的支出主要用于Tiler操作。相反如果加载处理过程中Vertex指示曲线(d)很高而Tiler操作不是,那么性能的瓶颈主要是因为顶点的着色操作。
我们可以很明显的看出,在渲染(Render)操作和Tiler操作曲线之间有很多的间隔。处理加载均值Vertex是1.6%,峰值达14.4%,Tiler操作均值为10%。尽管实际上每一帧的加载处理包括Vertex和Tiler效率均值都很低,我们可以借助PVRSaderEditor工具优化Vertex(顶点)着色。所幸的是Fantasy Warrior 3D(幻想勇士3D)并没有vertex(顶点)局限的问题。
垂直同步(V-sync)局限
垂直同步(V-sync)显示上的一种设置,即在某一应用中将图形的更新速率与显示器的更新速率进行同步。这会造成一些帧有稍微延后的情况,强制设置为最快的刷新速率,减少屏幕的卡顿且降低功耗。具有V-sync局限应用的特点是在图形视图中连续的帧之间会出现断续的间隔,帧刷新速率被限制设置为最大值。如果可能的话,在分析某一应用时v-sync应该被禁用,否则它会给PVRTune的输出数据增加干扰,这会让我们更加难判断哪些优化工作是有用的或者各种优化措施已经见效。
下面我们分析一下幻想勇士(Fantasy Warrior 3D)的数据,我们可以看出帧之间的间隔很稳定(1-2ms)。除此之外,这一帧的FPS数值会保持在29.3。因为每一帧的FPS值都不会超过最大值,所以我们可以判定这个游戏没有V-sync局限问题。
碎片局限
碎片局限的应用比较普遍,在大部分情景下都可能会发生,通常在帧缓存区中顶点的数量会比像素点的数量少。碎片局限的应用可以从以下特点来判定:在渲染操作(a)之间没有间隔,在Tiler操作之间有很大的间隔或者很高的像素处理负载(c)。
对于这个游戏我们得到的数据如下:
像素处理负载是46.3%且在渲染操作之间总是有很大的间隔,所以Fantasy Warrior 3D(幻想勇士3D)这个游戏并没有碎片局限的问题。
带宽局限
带宽局限的应用很难看出来也很难判定,因为它们的表象像其他性能瓶颈。如果有以下特点那么就可能有带宽局限的问题:
? 从时序图中可以看出有碎片局限问题,但是像素处理负载却很低。
? 从时序图中可以看出有Vertex(顶点)局限问题,但是Vertex(顶点)和Tiler的处理负载率都很低。
其它一些带宽局限的问题也可能发生。例如片上系统(SoC)的带宽是被片上的各部分共享的。没有图形处理器的芯片(例如CPU)会占用大部分的带宽,这会导致应用程序图形操作带宽受限。这是一个特定的测试平台,没有计数器用来记录它,从以往的经验来看,当我们进行纹理压缩,网格优化等操作时我们要采用适当的措施来减少带宽的使用,同时要避免不必要的纹理读操作等。
根据前面Vertex(顶点)局限和Pixel(像素)局限部分分析得出的结论,我们可以推断出这个游戏不存在带宽局限的问题。
总结
这个游戏存在典型的CPU局限问题,正如前面CPU局限部分分析的那样,将OpenGL ES的调用由专用的CPU线程来完成会让CPU忙碌起来并且能够在很多设备上提升帧速率。在下一篇文章中,我将向大家介绍PVRTune有哪些高级的特性,同样是以Fantasy Warrior 3D(幻想勇士3D)这个游戏为例来分析造成性能瓶颈的具体原因。
下面我列出了“优化系列”所有已经发表的文章,你可以直接访问:
? 使用PowerVR图形工具进行分析和调试
? PowerVR图形SDK工具说明:PVRTune GUI基础入门
? PowerVR图形SDK工具说明:使用PVRTune分析渲染操作
? PowerVR图形SDK工具说明:PVRTrace GUI基础入门
? PowerVR图形SDK工具说明:使用PVRTrace捕获渲染操作
? PowerVR图形SDK工具说明:PVRTrace GUI的高级特性
? 掌握使用PVRTraceGUI进行正则表达式搜索
对于已经发表的文章如果你有任何的想法请让我们知道,你可以留言期望看到的分析文章。当然你可以在Twitter上关注我们(@Imagination,@GPUCompute,
@PowerVRInsider),Imagination公司会发表更多的新闻和声明。
评论
查看更多