APP性能测试-FPS测试

第一次写博客(2018-06-30),欢迎小伙伴们指点补充~~~

一:基础知识

    1、手动查看页面卡顿情况:

        ①开发者选项-GPU呈现模式分析-柱状图

        ②调试GPU过度绘制:观察页面的层:

            蓝色代表一层,白色代表没有过度绘制,绿色代表一个焦点三层,红色四层、深红色6层以上(最卡)。一般情况下不存在四层以上的。

所以判断的标准是:不应该超过4,3层的不能超过屏幕的1/4浅蓝色最棒,基本不会卡顿

    2、帧数知识

         16.67ms以内一次正常,如果一帧不到16.67,也会等待16.67才执行下一帧;

        流畅的帧数/总共用的帧数(总的帧数+额外等待的帧数)=流畅度得分(满分60)

    3、命令行下获取的帧数耗时:

        一行的加和就是一帧渲染的耗时,有时候是3个字段(Draw、Prepaare、Process、Execute)

    图1-1:数据起始位置:

    


图1-3:数据结束为止(红杠标识的行,代码中会用到)

    

二:导致页面卡顿的2点原因:

    加载数据过多、页面绘制的东西太多(过度绘制)

       

三:查看帧数耗时的命令:

        adb -s FEJC34BEKJXR1A4 shell dumpsys gfxinfo com.android.browser

        其中FEJC34BEKJXR1A4为测试包的***名,如图1-3所示:

        

四:实现代码:

    

#coding:utf-8 #FPS测试,满分60,要避免动作不流畅的最低是30,要避免动作不流畅的最低是30 import os
import time
counter =10
#通过包名与activity名,获取帧数(查看之前记得滑动APP界面,以便获取数据) content = os.popen("adb -s FEJC34BEKJXR1A4 shell dumpsys gfxinfo com.android.browser")
#读取行数 data = content.readlines()
print data
start = 0
end = 0
i = 0
#为获得帧数据,先找具有代表性的开始行与结束行的字段“Draw"、"View hierarchy:" for line in data:
    if "Draw" in line:
        start = i
        print ("start:",start)

    if "View hierarchy:" in line:
        end = i
        print ("end",end)
    i = i+1
#精确定位帧数据的开始行与结束行 result = data[start+1:end-1]
print result
#未操作所测试的APP时,没有数据 if len(result) == 0:
    print "没有数据,请操作app哈哈哈"  else:
    badcount = 0      #还的帧数(超时16.67的帧数)  addwait = 0       #额外等待的帧数  for l in result:
        #用""代替"\r\n",去掉"\r\n"  l = l.replace("\r\n","")
        print "l=" ,l
        datalist = l.split("\t")     #以"\t"对数据进行切片  print "datalist=",datalist
        #对每行帧数据进行加和操作  sum = float(datalist[1]) + float(datalist[2]) + float(datalist[3]) #+ float(datalist[4])  print sum
        if (sum - 16.67) > 0:
            badcount = badcount + 1
            # 将float类型转化为整型,若sum=32,则addwait=1,若addwait=34,则addwait=2  addwait = addwait + int(sum/16.67)
            #计算公式:流畅的帧数/总共用的帧数(总的帧数+额外等待的帧数)=流畅度得分(满分60)  fpssorce = (len(result) - badcount)*60/(len(result)+addwait)
        print "fpsscore is %d" % int(fpssorce)
        #好啦,完毕