实现Android下的FPS实时显示工具
来源:互联网 发布:radius协议认证端口 编辑:程序博客网 时间:2024/05/16 04:16
http://blog.csdn.net/jinzhuojun/article/details/10428435
原文地址:http://blog.csdn.NET/ariesjzj/article/details/10428435
FPS是图形性能的主要指标之一,Android中的一些应用有显示FPS的功能,如Bsplayer,Skype,Antutu等,但绝大多数应用并不提供显示FPS的功能。而且应用提供的往往是应用本身的刷新率,并不等于最终用户所看到的刷新率,因为屏幕上往往不止一个应用参与显示。我们知道Android中每个应用都会绘制自己的Surface,完了都丢给Surfaceflinger,Surfaceflinger统一对它们进行composition,然后swap framebuffer输出到屏幕。前文介绍了Android中的so注入和hook技巧(http://blog.csdn.net/ariesjzj/article/details/9900105),示例了如何动态hook系统中的Surfaceflinger中的eglSwapBuffers函数。那么很自然的,我们就可以通过它来计算当前的FPS,并实时显示在屏幕上。
ARM下有FPS实时显示工具-FPS meter,不过要收费。本文中我们自己做一个功能类似的免费工具,而且x86和ARM平台通用。整个应用分为几个部分,首先是用于so注入的native程序和要注入的动态链接库。这部分是前文(http://blog.csdn.net/ariesjzj/article/details/9900105)中主要涉及的内容,不再累述。基本思想是在要注入的so中定义自己的eglSwapBuffers函数,然后在初始化时将之替换got表中老的eglSwapBuffers函数地址。这样,当Surfaceflinger需要刷新屏幕时,就会先调用我们定义的eglSwapBuffers函数,在这个函数被调用时,它会记录和统计调用次数,并写入一个专用的pipe文件,然后调用系统自己的eglSwapBuffers。在应用端我们需要以下几个部分:一个Activity用于显示界面与用户交互,一个Service用于主要工作,即从pipe读取FPS信息并且实时显示在屏幕上,最后是一个native的程序,用于在service启动时完成so的注入。
大体流程如下:
Activity启动时根据平台ABI将相应版本的用于注入的native程序和要注入的so拷贝到应用私有目录:
然后等待用户启动service:Service启动时的onCreate()函数,做一坨初始化工作,包括创建pipe,显示悬浮文字,执行注入等:
其中的执行注入和hook程序是要root权限的,所以要通过:
加悬浮文字,其实就是加个Layout:
Service启动时onStartCommand()会被调用,其中会启动线程:
实现的时候还有些细节需要考虑,比如当启动多个应用后,后台非关键Service会被Android杀掉。为了解决这个问题,可以仿照Android官方例子中ApiDemo中的ForegroundService例子将Service设为前台进程,这样就不容易被杀了。另外在屏幕显示FPS的话,如果一秒更新一次,那显示FPS本身也会影响FPS(尽管只有一帧),如果觉得有影响可以把它关掉,让FPS只输出到log。
效果截图:
- 顶
- 2
- 踩
- 实现Android下的FPS实时显示工具
- 实现Android下的FPS实时显示工具
- 实现Android下的FPS实时显示工具
- 基于Unity3D的OnGUI实时显示FPS的实现
- Unity中显示实时FPS值
- Unity3D基于OnGUI实时显示FPS
- Android性能指标FPS获取的JAVA实现
- Android性能指标FPS获取的JAVA实现
- Android 实时时间显示实现
- 用vc++实现矢量地图背景下的实时显示
- unity实时显示fps脚本、设置分辨率脚本、设置shader的最大lod
- Unity 实时显示FPS——移动端测试神器
- Unity3D实时显示FPS(移动端测试神器)
- Android搜索实时显示功能实现
- Android获取FPS的方式
- 使用util.concurrent并发包下的工具类,实现实时通知对方线程
- unity3D显示帧率FPS的脚本
- unity中FPS的设置与显示
- torch入门笔记12:数据的预处理
- 数据库事务隔离级别
- 网站分析方法
- java8 read file 读文件
- 芯片驱动之充电芯片2
- 实现Android下的FPS实时显示工具
- Maven2的配置文件settings.xml
- 测试
- snprintf()函数:最多从源串中拷贝n-1个字符到目标串中,后加一个0
- Android:布局中的view存成图片
- HTML聚美优品
- 扩展,有空慢慢看SpannableString、SpannableStringBuilder与String的关系
- 如何搭建lamp(CentOS7+Apache+MySQL+PHP)环境
- VS2012 + CPLEX12.6.1