Adreno Profiler 分析任意安卓游戏特效、抓取资源
发布日期:2021-07-01 05:53:39 浏览次数:3 分类:技术文章

本文共 3605 字,大约阅读时间需要 12 分钟。

 

转载自: 【网上转载这篇的太多了,但是这个地址才是原作,我之前也误会了。。。 =_=

为了尊重原作者,放一张大佬的简介镇楼

大神真身

 以下是文章正文

前言

最近发现了一个非常好用的工具 Adreno Profiler还有新的工具 Snapdragon Profiler,也是高通的工具,,可以用来分析安卓手机上 OpenGL ES 绘制过程。这个东西牛的地方在于可以抓取任何可以运行的 App,而且使用起来非常方便、没有额外限制。这个工具本质上是一个 OpenGL ES Draw Call Replay;如果你用过 PIX 或者 GPA,就会感到很非常熟悉了。下图是贵易的魔天记,挂起来毫无压力233

adreno_mtj

由于这个工具是高通提供的,所以只能运行在高通芯片的安卓机上。为什么要强调这一点呢?其实其他厂商也有类似工具,但是从使用限制、方便程度上来说差太多了:

  • iOS可以用XCode自带的 ,但是这货用起来很不顺手,而且没法抓取第三方应用。
  • 其他安卓厂商也有类似的工具,例如 ,但是使用起来比较麻烦,譬如需要越狱、上传 so 到系统目录之类的。

下面将具体介绍其使用,然后用两个例子来讲解,一个是抓取分析聚爆 Implosion 的特效绘制另一个是用来做 cocos2d-x 图形性能优化

ps. 我习惯说 Draw Call(DC),工具里是 Render Call,下文会混用...

环境配置

软件配置

下载  并安装,需要注意以下几点:

  • Adreno SDK 不是必须的,可以无视;
  • 虽然 Adreno Profiler 提供了跨平台版本,但这货貌似是 c# 的,我尝试在 OSX 下用 Mono 跑但是折腾不出来,所以最好还是Windows;
  • 需要将 adb 添加到系统路径,可以直接下载一个  ,但是我国国情导致你不一定能很方便的下载下来;还有一种取巧的办法是所谓的 xx 手机助手、豌豆荚等工具目录下一般都会自带,指向 adb.exe 所在目录即可。

硬件配置

需要一个有高通芯片的手机,我这里强烈推荐 G 家亲儿子 Nexus 系列!如果手头没有的话,可以去淘宝买个 Nexus 4,虽然是几年前的机器、不过一点都不卡,而且一千块钱都不到。

注意目前 Android 5.1 上可能出现连接不稳定的情况,见,我这边测试 5.0 倒是一直能用~所以如果遇到这个问题,建议降低系统版本再说。

再注意需要打开手机的开发者模式,并把电脑设为信任,偷懒的方法是用豌豆荚连一次,跟着指示做就行,驱动都自己装好了。

基础教程

如何抓取一帧

首先手机上打开游戏,运行到需要抓取的界面。然后在电脑打开 Adreno Profiler,点左上角的 Connect 。这里有两种连接方式:手机直接插到电脑上,或者在同一个局域网内使用 IP 连接。准备好了之后点击 Refresh ,直至刷出对应的设备和应用:

adreno_connect

双击连接之后,点击 Scrubber GL 弹出抓取界面,然后点击Capture Frame等待即可

adreno_connect2

这样其实就完成了抓取工作,是不是感觉 so easy! 下面将从例子出发,介绍具体的使用。

小技巧:抓取完成之后,可以点击上方的 Save 将帧数据保存成 apr 文件,这样可以之后 Open,省的每次分析都需要连接手机、打开游戏。

基础使用

这个工具使用非常简单,核心是左下角的 Render Calls。它其实是抓取了一帧中所有 GL 部分的调用及相关数据,然后按照绘制命令组织。当选中不同的 Render Call 时,工具会显示从一开始到这一个命令的绘制结果,方便看到每一个中间过程。此外,在API Calls 中,还可以看到每一个 Render Call 之前的其他命令,包括各种对 GL 状态机的修改:

adreno_api_calls

从图中可以看到,在这个绘制动作前,对模板状态进行了设置,然后传了一些 Uniform 变量,并修改了顶点属性~ 更方便的是,具体的顶点数据什么也能直接看到!

adreno_vertex_data

如何查看、导出资源

就纹理来说,在右边可以看到所有显存里的纹理资源,点开可以看到具体的纹理参数和缩略图。在上面有一个小的按钮,可以将所有纹理都保存成一个个文件:

adreno_textures

就 Shader 来说,同样也是可以看到所有 Program,工具还会贴心的标出所有利用了该 Shader 的 Render Call,下面可以看到反汇编出来的指令:【当然美图已经做了加密措施,除了少部分简单的没加密外,其他都看不到的

adreno_shaders

就模型来说,选中一个 Render Call 然后 Save Vertex Data 就可以导出 obj,但是生成的文件还需要稍微修改下才能导入,具体打开看看就懂了~

adreno_obj

我曾经把驯龙高手的地形导出之后放到Unity,毫无压力-。-

adreno_dragons

 

进阶使用

游戏性能优化

之前 zhiwei 写过,下面我从图形性能为例,来介绍需要注意的几个点~

首先需要看一下每一个 Render Call 干了什么,是否有意义。根据不同游戏类型,对 Draw Call 个数应该有个大概掌握。这个当然是越少越好啦~

  • 是否有无效 Render Call,我曾经见过一个全屏绘制“无效果”,也就是屏幕内容在绘制前后结果完全一致,不知道到底干啥了...
  • 是否有绘制到屏幕外的 Render Call,也就是模型在屏幕外的情况;这个其实应该是引擎自动优化掉相机范围外的物体,不过有的引擎不具有这个能力
  • 是否有被完全挡住的 Render Call,这时候需要完全干掉,不然也是会造成性能损失的;话说这个其实也应该引擎自动优化Occlusion 来着 (╯‵□′)╯︵┻━┻
  • 是否有能够合并的 Draw Call,像 Unity 里有 Dynamic/Static Batching 技术。
  • 是否有负担比较重的 API 调用,譬如每帧都修改顶点数据,是否能避免或绕开。

然后需要看一下显存中的纹理数量和大小,这个肯定也是越小越好~

  • 能用压缩纹理的地方就用压缩纹理,RGB444能忍的地方就不要用RGB888;
  • 少用透明贴图,可以节约掉一个A;
  • 可以用NPOT;(ps:作者的意思可能是检查是否能用NPOT)
  • 无用的纹理尽量不要放太多显存。

需要注意的是显存中纹理占用和包里的纹理占用不同,因为所有纹理资源在进入显存之前会进行解压操作,这就是为什么建议使用压缩纹理。

此外,Adreno Profiler还提供了 Graph 工具,可以看到应用的许多性能信息,用来对比不同游戏场景下负载:

adreno_graph

工具本身也提供了一些建议供参考:

adreno_suggestions

聚爆特效分析

这个其实源自我之前在知乎上的一个回答:。

在介绍如何绘制被遮挡部分的特效,用了一个小技巧:查看 GL Context 状态机,这里就可以看到 ztest 被改成了 GREATER,也就是绘制完场景之后直接绘制被挡住的部分~

adreno_gl_context

当然,还可以点击上方的 Depth 切换出 zbuffer 查看

adreno_depth

 

解释刀光特效的时候,主要靠经验积累,大概看下绘制的中间结果就猜出来了-。- 本质还是一个很简单的特效。亮点在于绘制第二道刀光时,先绘制了整个场景,然后对其进行了一定的扭曲~

adreno_distort

Adreno Profiler提供了一些很方便的可视化功能,譬如选中一个纹理或者 Shader,可以标记出所有使用该资源的 Render Call;选中 Render Call 的时候会在屏幕上标记其绘制效果~

总结嘛,总之很方便的工具一只~我现在就等着泰坦黎明的安卓版,好好分析下它咋做的啦o(╯□╰)o

 

  • 简单的Python处理脚本

    评论区有几个需要的,就贴一下~其实特别简单粗暴,只是文本替换而已

    import sysdef replaceAll(filename):	f = open(filename,'r')	filedata = f.read()	f.close()	newdata = filedata.replace("#position", "v").replace("#normal", "vn").replace("#texcoord0", "vt")	f = open(filename,'w')	f.write(newdata)	f.close()if __name__ == '__main__':	if len(sys.argv) == 1:		print("Please provide filename")	else:		files = sys.argv[1:]		for x in files:			replaceAll(x)

     

    使用方法是 python OBJ.py kongfu_01.obj kongfu_02.obj kongfu_03.obj 这样直接传入文件名。至于为什么这么做,其实打开下 obj 文件看下最上面的注释就懂了…

转载地址:https://panda1234lee.blog.csdn.net/article/details/56484034 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:C 语言高效编程与代码优化
下一篇:调试 OpenGL 4.2 和 Shader - 基于 NVIDIA Nsight Visual Studio 3.2

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月19日 09时10分35秒