最近研究了GPU Debugger工具,因为菜,以前不知道有GPU Debugger这么个东东,直到指导老师介绍了才知道。简直相见恨晚哈哈,太好用了,研究游戏的一大利器,不仅可以看看其他优秀游戏的渲染实现方式,还可以精确debug shader。
首先我要吐槽一下,一开始手上只有Mali的android机器,所以就从Mali Graphics Debugger入手了,从此就开始掉坑了,Mali而且需要机器root,导出文件非常麻烦费时,关联文件(图片,shader,模型)要自己一点点去找,反正谁用谁知道,如果不是非要Mali来Debug什么的,还是远离的好。
后来切换到了Adreno profiler 4.0,生活幸福起来了,不仅连接方便,机器不用root,重点是可以自定义。对adreno的使用目前还不算深入,暂时停留在,debug shader,和 导出资源分析上,不涉及用adreno来优化游戏的分析。所以以下的介绍也是偏向基础的,大神可飘过。
- 1.连接真机
电脑上需要安装AndroidSDK,就不赘述如何安装,然后所要debug的app需要是需要在Manifest中android.permission.INTERNET,网络游戏肯定permission了的。
还需在命令行中输入
adb.exe shell setprop debug.egl.profiler <1 to enable, 0 to disable>
我们要enable所以输入adb.exe shell setprop debug.egl.profiler 1 。
adreno 需要电脑和真机处于同一网段,因为公司wifi和电脑是不同网段,所以首先搞个无线网卡插到电脑上,让手机和电脑处于同一网段。再用USB线连接真机到电脑。这样硬件配置就齐活了。
打开Adreno,点击左上角Connect,如图:
弹出链接界面,在IP(1)里面填入手机的IP,然后点击Refresh(2)等待刷新,不要着急,不用狂点,有时候需要等那么一分钟的样子。然后在Location(3)会出现需要Debug的APP ID。选择后,点击Connect(4)。就连上了
接下来就是Areno内部的界面,出现Disconnect(1)就表示已经连接好了,然后点击Scrubber GL(2)
点击Capture Frame
点击后页面是没有反应了,如果adreno没有崩溃的话,右下角有个flushing或者Capture Texuture之类的指示,等这些指示完了后,就捕捉好了,可以开始分析了。
- 2.adreno 界面介绍
对于界面上,我们只需要关注三大块,就够我们一般菜鸟用了,其他强大的功能模块,有时间再来研究。首先是(1)Render Call,对应Draw Call;(2)是每个drawcall的具体数据,(3)是资源模块,图片,所有的program(组合vert和fragment shader的),可以导出图片和shader。
点击RenderCall里的某一条,界面会只显示这条drawcall渲染的内容,并且刷新右边的具体数据栏,我们主要关注APICalls这一栏,因为有具体的渲染参数,比如使用了什么图片,使用了哪个programId. 知道了programID后我们再去资源窗口,查找具体的shader。
我们知道ProgramID 后我们来到资源窗口,找到我们对应的shader,然后就可以分析shader了。
adreno的界面介绍就完了,也算一个简短的使用流程。保存图片,模型,shader,大家自行在界面上找找吧。总之我想导出图片上出现的bill的全部资料,我需要点至少二十多下吧,而且导出的Obj文件是不能直接用的,需要替换一些字段,在加上找资源关联的时间,更是白白浪费了不少生命。还好Areno安装文件下的dll可以自定义。我就立刻反编译,写起了自己需要的工具了。
- 3. 自定义adreno
Adreno界面显示控制的代码都在这个QXProfilerControlsCS.dll中。反编译了QXProfilerControlsCS.dll后,我修改了TraceViewES20.cs 中的保存vertexdata的按钮回调方法。
private void toolStripSaveVertexDataButton_Click(object sender, System.EventArgs e)
{
if (this._State != TraceViewES20.State.Idle)
{
return;
}
CustomSavaAll.SaveAll( this );
}
CustomSaveAll比较长我就不贴出来了 大家自行下载阅读吧。
CustomSaveAll.cs
http://git.oschina.net/longxiaomao/codes/nyfjqb24cmk0u1v56twpg85
编译好的dll
http://git.oschina.net/longxiaomao/codes/7qx6d8ac512uozblgh0n987
- 3. 用 adreno debug shader 示例
之前遇到一个lightmap在android手机上和电脑上显示不一致的问题,在手机上非常亮。但是不知道出了啥问题,是shader不对呢,还是哪里的设置不对。于是我使用adreno去检查我们的shader。发现lightmap的解析是这样的(手敲的伪代码,原理是对的)
float lightmap = tex2D(unity_Lightmap,unity_Lightmap_uv) * 2.0;
具体查UnityCG.cginc,对于lightmap的编码有两种方式DoubleLDR和RGBM。Adreno显示我们的shader使用了LDR解析方式。unity解析对了没有很难讲。于是我打算测试一下,自己从新编写shader,在真机测试LDR和RGBM解码结果。结果使用RGBM解码后,真机和电脑上的显示是一致的,而使用LDR在真机上则非常的亮。说明lightmap可能是用RGBM编码的,结果在真机上解码的时候又是LDR。在UnityCG。cginc中区别用哪种解码方式的是UNITY_NO_RGBM这个宏,这个宏是unity内部开启关闭的,那必然有个设置,那哪里在设置捏。最后发现是lightmap.exr在inspector中的格式选项必须选成LightMap,而我们的是Default。哈哈哈。
所以下次碰到真机上奇奇怪怪的显示问题,不用再猜了,打开adreno检查,问题说不定会迎刃而解捏。