腾讯GT的流畅度测试方案研究

GT源码:https://github.com/TencentOpen/GT

一.流畅度模块的代码结构

流畅度插件总共就几个类,其实处理方式也比较简单粗暴,就是通过Choreographer输出的log信息获取跳帧数据。SMActivity.java为插件的入口类,你可以通过预设环境操作来实现log打印操作,然后通过SMLogService.java过滤出当前进程的丢帧值,最后由SMServiceHelper.java来进行数据处理。流畅度值为60减去1s内的跳帧数。

二.流畅度测试

1.简要流程

  • 执行setprop debug.choreographer.skipwarning 1
  • 执行getprop debug.choreographer.skipwarning判断,为1则可以进行测试
  • 执行adb logcat -v time -s Choreographer:I *:S
  • 过滤获取当前pid丢帧值
  • 数据处理得到sm值

2.代码流程

  • 执行setprop debug.choreographer.skipwarning 1

    View.OnClickListener button_write_property = new View.OnClickListener() {
     
            @Override
            public void onClick(View v) {
                String cmd = "setprop debug.choreographer.skipwarning 1";
                ProcessBuilder execBuilder = new ProcessBuilder("su", "-c", cmd);
                execBuilder.redirectErrorStream(true);
                try {
                    execBuilder.start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };
  • 执行getprop debug.choreographer.skipwarning判断,为1则可以进行测试

    View.OnClickListener button_check_status = new View.OnClickListener() {
     
            @Override
            public void onClick(View v) {
                String cmd = "getprop debug.choreographer.skipwarning";
                ProcessBuilder execBuilder = new ProcessBuilder("sh", "-c", cmd);
                execBuilder.redirectErrorStream(true);
                try {
                    TextView textview = (TextView) findViewById(R.id.textviewInformation);
                    Process p = execBuilder.start();
                    InputStream is = p.getInputStream();
                    InputStreamReader isr = new InputStreamReader(is);
                    BufferedReader br = new BufferedReader(isr);
                    Boolean flag = false;
                    String line;
                    while ((line = br.readLine()) != null) {
                        if (line.compareTo("1") == 0) {
                            flag = true;
                            break;
                        }
                    }
     
                    if (flag) {
                        textview.setText("OK");
                    } else {
                        textview.setText("NOT OK");
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };
  • 执行adb logcat -v time -s Choreographer:I *:S
  • 过滤获取当前pid丢帧值

    protected void onHandleIntent(Intent intent) {
            try {
     
                String str = intent.getStringExtra("pid");
                int pid = Integer.parseInt(str);
     
                List<String> args = new ArrayList<String>(Arrays.asList("logcat", "-v", "time", "Choreographer:I", "*:S"));
     
                dumpLogcatProcess = RuntimeHelper.exec(args);
                reader = new BufferedReader(new InputStreamReader(dumpLogcatProcess.getInputStream()), 8192);
     
                String line;
     
                while ((line = reader.readLine()) != null && !killed) {
     
                    // filter "The application may be doing too much work on its main thread."
                    if (!line.contains("uch work on its main t")) {
                        continue;
                    }
                    int pID = LogLine.newLogLine(line, false).getProcessId();
                    if (pID != pid){
                        continue;
                    }
     
                    line = line.substring(50, line.length() - 71);
                    Integer value = Integer.parseInt(line.trim());
     
                    SMServiceHelper.getInstance().dataQueue.offer(value);
                }
            } catch (IOException e) {
                Log.e(TAG, e.toString() + "unexpected exception");
            } finally {
                killProcess();
            }
        }
     
  • 数据处理得到sm值

     腾讯这边的处理方案是:当丢帧<60时,流畅度SM =60-frame; 当丢帧frame>60时,流畅度SM = 60-frame%60。不过这种处理方式是有问题的。在这里要先说下流畅度计算的原理:

   VSync机制可以通过其Loop来了解当前App最高绘制能力,固定每隔16.6ms执行一次,这样最高的刷新的帧率就控制在60FPS以内,Choreographer日志可以打印当前丢帧数,因此通过计算,得到当前APP的流畅度。

        而计算这样来计算可能会更加准确:

        SM= 60-丢帧frame/每两行同一线程的丢帧时间差(单位:s),如果只关心UI线程,那就只需要统计UI线程即可。

  • while (true) {
        if (pause) {
            break;
        }
        int x = count.getAndSet(0);
        // 卡顿大于60时,要将之前几次SM计数做修正
        if (x > 60) {
            int n = x / 60;
            int v = x % 60;
            TagTimeEntry tte = OpPerfBridge.getProfilerData(key);
            int len = tte.getRecordSize();
            // 补偿参数
            int p = n;
            //Math.min(len, n);
            /*
            * n > len是刚启动测试的情况,日志中的亡灵作祟,这种情况不做补偿;
            * 并且本次也记为60。本逻辑在两次测试间会清理数据的情况生效。
            */
            if (n > len) {
                globalClient.setOutPara(key, 60);
    //          globalClient.setOutPara(SFKey, 0);
            } else {
                for (int i = 0; i < p; i++) {
                TimeEntry te = tte.getRecord(len - 1 - i);
                te.reduce = 0;
                }
            globalClient.setOutPara(key, v);
    //      globalClient.setOutPara(SFKey, 60 - v);
            }
        } else {
            int sm = 60 - x;
            globalClient.setOutPara(key, sm);
    //      globalClient.setOutPara(SFKey, x);
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 腾讯gt测试app是一款专业的手机性能测试软件,它可以为您的手机提供全方位的测评服务,以便您更好地了解您的手机性能情况。这个应用程序可以从腾讯应用宝进行下载。下载和安装很简单,只需要在应用宝中搜索“腾讯gt测试app”并点击下载即可。此外,该应用程序还可以在腾讯gt测试官网上进行下载,用户可以选择指定的版本进行下载。这个应用程序可以对您的手机的CPU、内存、网络、存储等方面进行全面测试,检测您的手机的性能是否满足您的需求。使用腾讯gt测试app,您可以轻松了解手机的性能表现、消耗电量以及热等指标数据,为您的手机性能提升提供科学可行的依据,值得一试! ### 回答2: 腾讯GT测试APP是一款测试网络速和网速稳定性的工具应用。在下载和使用这个应用前,我们可以先了解一下它的特点和功能。 首先,腾讯GT测试APP表现十分稳定,具有极高的精准。用户在使用该应用进行测试时能够直观地看到网速数据的变化,进而更好地调整自己的网络环境。其次,该应用不仅支持WiFi网络,还可以测试2G/3G/4G网络,方便用户全面了解自己的网络速情况以及衡量网络的可靠性,提高用户的网速体验感受。 下载腾讯GT测试APP也很简单,可以通过应用商店或者腾讯官网进行下载,而且这款测试工具是完全免费的。具体下载方式为,在应用商店搜索“腾讯GT测速器”或“腾讯GT测试”,即可找到并下载;或者在腾讯官网上下载安装文件,进行手动安装。 总之,腾讯GT测试APP下载简单,使用方便,是一款非常优秀的网络测试工具,对于大家了解自己的网络环境,提升网速体验有着极大的帮助。 ### 回答3: 腾讯游戏测试APP(GT)是由腾讯游戏官方推出的一款游戏测试工具。GT可以让玩家提前接触游戏测试版,了解游戏的玩法、画面、操作等,还可以在测试过程中提供反馈和bug报告,帮助游戏开发人员改进游戏品质。 GT测试APP下载非常简单,只需在应用商店中搜索“腾讯游戏测试”或“GT测试”即可,也可以通过腾讯游戏官网进行下载。下载完毕后,即可进行游戏测试,根据个人喜好选择游戏种类和版本进行测试,还可以参加游戏测试活动,有机会获得游戏周边和奖励。 总的来说,腾讯GT测试APP是游戏爱好者和游戏开发人员的一款重要工具,既可以让玩家提前体验游戏,也可以在游戏开发过程中提供反馈和建议,促进游戏的不断优化和改进,值得玩家们下载并使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值