分享一个游戏DrawCall分析利器-SpectorJS

1、简介

一个DrawCall就是CPU向GPU发送一次绘制命令,例如:某个场景的DrawCall是80,代表该场景每个渲染帧内GPU需要绘制80次。每一次DrawCall都需要传输纹理、顶点数据以及渲染上下文切换,是非常消耗性能的操作,DarwCall过高会直接影响游戏的整体性能,带来卡顿、CPU占用率高、设备发烫等问题。所以游戏的DrawCall越低越好,应该尽可能多的将节点数据合并,减少提交和绘制次数。

如果发现DrawCall已经过高,如何判断哪些DrawCall是可以合并的呢?Web端有个强大的工具SpectorJS,可以很方便的查看当前渲染状态、DrawCall等信息,以可视化的方式来帮助分析。(SpectorJS的作者也是微软开发的WebGL引擎BabylonJS的开发者)

2、安装SpectorJS

SpectorJS工具提供了npm模块、Chrome扩展程序等多种安装方式。本文以Chrome扩展程序为例。

通过Chrome浏览器的菜单,进入“扩展程序”界面,输入“Spector”,然后安装即可,如下所示。

提示:如果你未搜索到Spector,请科学上网:)

3、使用SpectorJS

3.1

SpectorJS安装完成后,Chrome浏览器的地址栏右侧将会出现一个红色小图标,如下所示。

默认情况下,SpectorJS处于非工作状态。

3.2

点击这个红色图标,图标变成绿色,SpectorJS开始工作,将重新加载当前页面,并注入调试代码用来收集当前Web页面的渲染信息,如下所示。

3.3

点击这个绿色图标,将会弹出一个提示窗口,如下所示。

3.4

点击这个窗口上方的红色圆圈,稍等片刻,SpectorJS收集完信息后,会自动新打开一个Chrome页面,并展示收集到的渲染信息,如下所示。


例如,本Web页面有4个DrawCall,则SpectorJS大约生成4-6张截图,从图中左侧图列可以看出,每一张截图对应一个DrawCall,通过比较不同图片的差异,就能看出本次DrawCall究竟绘制了什么,从而帮助判断DrawCall是否可以合并。

我在自己项目中用这个工具分析,DrawCall减少了20%,优化过程有点纠结,需要把一些正常模块和逻辑重组,以符合DrawCall批次合并需求。

26赞

推荐的 很厉害。但是纠结于工程性。我觉得可维护性更重要一些。当然绝对不是否定你的工作和努力。

1赞

原生平台有没什么工具推荐啊大兄弟

先用H5版本优化好,然后发布到原生一样的啊。

战略mark

问题是项目在浏览器上运行不了,只能用编辑器的模拟器运行

mark mark

文件夹命名我用的是小写。建议用小写。文件也建议用小写。windows不区分大小写。其他系统可不是。

牛啤牛皮,好东西,赞一个

mark

mark

mark一下

mark一下

mark一下

战略mark

mark

自动图集 预览看不到效果, 而且 浏览器支持动态图集也能降低drawcall

学习了,感谢楼主的分享:slightly_smiling:

mark

mark