以前经常用GPA来perf端游的绘制,很多perf工具例如perfhud,pix对于加壳的程序总是束手无策,但是GPA却不受这个限制,可以自动HOOK 3D程序的子进程。

对于Perf手游的分析软体也有很多,例如AdrenoProfiler、SnapdragonProfiler、UnityProfile、Mali_Graphics_Debugger等工具,但都有诸多限制:

1、 还得找个对应晶元的真机,最好还ROOT过

2、 USB连接线不稳,总是容易断开,重新连接

于是就想著能否使用GPA等工具来分析android模拟器,经过一番折腾,发现奏效了。

其实方法很简单,记得把Android模拟器改为DirectX的渲染模式,然后找到模拟器的EXE,当成一般的3D程序HOOK工具就可以了。

然后就可以看看一些游戏是咋渲染的了:

可以看到角色渲染方面使用的Sampler和Shader,不过很遗憾,代码是Assembly的,需要自行的转成HLSL。

附带个决战平安京的渲染分析:

角色绘制:

展示角色 与 战斗角色,使用完全不同的Mesh、Texture来制作,相当于两个完全不同的模型。

展示角色,渲染效果:仿PBR的次世代材质制作。通过MASK来区分不同区域,调节金属度,粗糙度,高光范围等,shader共91条指令数。无阴影计算

对应的 战斗角色的几何有 1857 个三角面

角色渲染的材质也很简单,使用了单个shader,指令数很低,使用了两张贴图,256*256 ColorTexture(RGB)+AlphaTexture(A8),并通过_change_color和_AlphaMtl分别控制颜色和Alpha的调制。

角色的两张贴图均未使用Mipmap。

角色阴影采用最简单的平面阴影计算,类似FakeShadow的效果。

战斗场景绘制

战斗场景地面:

地面绘制很简单的,用一张4096*4096的32位精度贴图绘制,贴图中直接包含了场景的光照和阴影信息,地面网格就是两个三角形的PLANE,无任何额外光照阴影计算和LightMap,可调节的Parameter也仅用于控制整体的alpha和color表现。

4096*4096的大地表贴图

场景细节物体

场景细节物体使用与地面网格相同的材质表达,均使用一张贴图,带Mipmap生成

欢迎交流 [email protected]

推荐阅读:

相关文章