Исследование PerfDog4.0, поддержка пользователей в создании собственного веб-облака

контрольная работа

После периода оптимизации PerfDog4.0 является новым, давайте взглянем на обновленную Shenma.

1. Предварительное изучение функций новой версии

  • [Новое] Добавлена ​​функция общих подсказок по работе с графиками
  • [Новое] Добавлены высокоуровневые функции, точный тест частоты кадров подпроцесса.
  • [Оптимизация] Полностью решить проблему, из-за которой некоторые телефоны Android не могут получить питание и память.
  • [Оптимизация] Решена проблема с тем, что младшая версия iOS не может получить FPS и другие проблемы.
  • 【Исправить】Исправить некоторые известные проблемы

Мы обнаружили, что в новой версии добавлено несколько общих советов.


Оптимизирована проблема, из-за которой некоторые модели Android и ios или версии системы не могут получить некоторые данные.Если все еще есть проблемы, из-за которых не удается получить данные или соединение, проверьте
PerfDog использует инструкции, связанные с подключением

Во-вторых, точное описание теста частоты кадров подпроцесса

Это получение частоты кадров подпроцесса очень полезно для приложений, которые в настоящее время используют несколько процессов.Возможно, некоторые студенты не очень понимают эту концепцию, давайте рассмотрим ее шаг за шагом;

这是啥?干啥用?怎么用?
что это? для чего? как пользоваться?

Введение в многопроцессорность:
Платформа Android, общие крупномасштабные приложения, такие как игры, иногда запускаются совместно с несколькими процессами (мини-игры WeChat, Weishi и другие приложения и игры, такие как Honor of Kings и другие игры, имеют несколько подпроцессов), вы можете выбрать цель подпроцесс для целевого тестирования. По умолчанию это основной процесс. Как показано на картине славы короля

Прежде чем выяснять частоту кадров дочернего процесса, нужно разобраться, что такое окно Android. Ниже приведен краткий обзор, если вы не понимаете деталей, пожалуйста, сделайтеSurfaceFliger, или ознакомьтесь с этой статьей

Проще говоря, Surfaceflinger — это сервис системы Android, функция которого состоит в том, чтобы принимать данные графического отображения из нескольких источников, синтезировать их, а затем отправлять на устройство отображения;
Давайте посмотрим на официальное описание

Как правило, в главном окне Android Activity и соответствующем ему представлении есть специальный вид, например SurfaceView, который будет совместно использовать только поверхность, а не главное окно.Независимый рендеринг очень эффективен и поддерживает рендеринг OpenglES. То есть может быть два типа оконного FPS. Одним из них является частота кадров окна Activety и частота кадров окна SurfaceView.
При каких обстоятельствах может возникнуть ситуация, когда присутствуют оба типа окон? Как правило, существует два типа окон для типа игры, прямой трансляции, потокового видео, небольшой игры и других типов приложений. В особых случаях может быть несколько Activity и несколько SurfaceView, что вызовет большие трудности при подсчете частоты кадров, и для получения частоты кадров требуется определенная стратегия.
Для игр, прямых трансляций, видео, небольших игр и других типов приложений PerfDog по умолчанию получает FPS SurfaceView. Другие традиционные приложения или веб-приложения получают частоту кадров Activity.
В то же время высокоуровневая функция PerfDog позволяет пользователю выбирать частоту кадров типа окна, особенно для небольших программ, небольших игр и т. д., что позволяет более точно проверять частоту кадров целевого окна, т.к. показано на рисунке ниже (Мини-игра WeChat — Happy Landlord)
Для небольших игр, прямых трансляций, видео, игр и других типов приложений выберите SurfaceView.


Подведем итог:
Если представлением нашего дочернего процесса является SurfaceView, то дочерний процесс будет совместно использовать Surface исключительно и не будет совместно использовать Surface с главным окном;

Вот пример страницы видео.Основной поток и подпоток на самом деле можно понимать как наложенное состояние, и они не мешают друг другу, то есть частота кадров основного потока, которую мы получаем - это данные основного процесса ниже, а частота кадров подпроцесса - средняя. Данные о частоте кадров небольшого фрагмента карусельного изображения, два независимых

3. Созданное пользователем веб-облако для получения данных о производительности

После обновления до 4.0 мы можем найти облачную платформу, которую можно настроить для загрузки в интерфейсе настроек.

Как это использовать здесь, если у нас есть собственная облачная платформа, то мы можем настроить запрос ссылки;
Ниже я использую фреймворк Tornado в качестве простого примера.

Сначала определите маршрут:

 (r"/", GetPerfDogData),
 (r"/icon", GetPerfDogIcon),
 (r"/screenshots", GetPerfDogScreenShots),
 (r"/done", GetPerfDogDone),

Следующий метод обработки

class GetPerfDogData(tornado.web.RequestHandler):
    """
    :fuc:获取PerfDog性能数据
    """
    def post(self):
        data = self.request.body.decode('utf8')
        data = parse.unquote(data)
        print("性能数据:",data)
        self.finish(
            {
                "errCode": 0,
                "errStr": "",
                "reportId": ""
        })

Полный код:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import tornado.web, tornado.ioloop
from urllib import parse

def Set_Ima(data):
    with open("img.jpg", "wb") as f:
        f.write(data["body"])  # 生成一张img.jpg的图片
class GetPerfDogData(tornado.web.RequestHandler):
    """
    :fuc:获取PerfDog性能数据
    """
    def post(self):
        data = self.request.body.decode('utf8')
        data = parse.unquote(data)
        print("性能数据:",data)
        self.finish(
            {
                "errCode": 0,
                "errStr": "",
                "reportId": ""
        })
class GetPerfDogIcon(tornado.web.RequestHandler):
    """
    :fuc:获取PerfDog应用图标
    """
    def put(self):
        data = self.request.files['icon']
        print("Icon图标:", data)
        for imadata in data:
            Set_Ima(imadata)
        self.finish(
            {
                "errCode": 0,
                "errStr": "",
                "reportId": ""
        })
class GetPerfDogScreenShots(tornado.web.RequestHandler):
    """
    :fuc:获取PerfDog测试过程中生成的应用截图
    """
    def post(self):
        pass
class GetPerfDogDone(tornado.web.RequestHandler):
    """
    :fuc:完成上传测试数据
    """
    def put(self):
        pass

if __name__ == '__main__':
    CONTENTS_LIST = []
    settings = {
        'template_path': 'template',
        'static_path': 'static',
    }

    application = tornado.web.Application([
        (r"/", GetPerfDogData),
        (r"/icon", GetPerfDogIcon),
        (r"/screenshots", GetPerfDogScreenShots),
        (r"/done", GetPerfDogDone),
    ], **settings)
    application.listen(8868)
    tornado.ioloop.IOLoop.instance().start()

Запускаем скрипт, заполняем ip адрес+номер порта в сервер, если есть доменное имя заполняем доменное имя,


Нажмите, чтобы загрузить данные, вы можете увидеть информацию о данных


Актуальная документация по интерфейсу размещена здесь:

接口说明
baseURL
需要配置,例如:http://abc.com/report
开始上传测试数据
•    path:
•    method: post
•    header:
–    Content-Type: 'multipart/form-data'
•    req
–    file_format: json/pb
–    data: file
•    resp
     {
    errCode: 0,
    errStr: "",
    reportId: ""
}
上传测试过程中生成性能数据,如fps、卡顿等等
设置测试应用图标
•    path: /icon
•    method: put
•    header:
–    Content-Type: 'multipart/form-data'
•    req
–    reportId
–    icon: file
•    resp
     {
    errCode: 0,
    errStr: ""    
}
上传测试过程中生成的应用截图
•    path: /screenshots
•    method: post
•    header:
–    Content-Type: 'multipart/form-data'
•    req
–    reportId
–    file1: file
–    file2: file
–    file3: file
–    file4: file
–    file5: file
–    ...
•    resp
     {
    errCode: 0,
    errStr: ""    
}
一次可以上传多张 或者使用zip压缩多张图片上传
完成上传测试数据
•    path: /done
•    method: put
•    header:
–    Content-Type: 'multipart/form-data'
•    req
–    reportId
•    resp
     {
    errCode: 0,
    errStr: ""    
}

Обратите внимание, что это интерфейсный документ версии 4.0. Может быть, это станет йо!

Опубликовать полную демонстрацию фреймворка фляги

Файл отчета

# coding: utf-8

import os
import uuid

from werkzeug.utils import secure_filename


class Report(object):
    def __init__(self, base_dir):
        self.base_dir = base_dir

    def set_data_by_pb(self, file):
        filename = self.get_filename('data.pb')
        file.save(filename)

    def set_data_by_json(self, file):
        filename = self.get_filename('data.json')
        file.save(filename)

    def set_icon(self, file):
        filename = self.get_filename('icon.png')
        file.save(filename)

    def add_screenshots(self, files):
        for file in files:
            filename = self.get_filename(secure_filename(file.filename))
            file.save(filename)

    def done(self):
        filename = self.get_filename('done')
        with open(filename, 'wb'):
            pass

    def get_filename(self, filename):
        return '%s%s%s' % (self.base_dir, os.sep, filename)


class ReportManager(object):
    def __init__(self):
        self.base_dir = os.path.split(os.path.realpath(__file__))[0] + os.sep + 'data'
        if not os.path.exists(self.base_dir):
            os.mkdir(self.base_dir)

    def create_report(self):
        report_id = str(uuid.uuid4())
        report_dir = self.get_report_dir(report_id)
        os.mkdir(report_dir)
        return report_id, Report(report_dir)

    def get_report(self, report_id):
        report_dir = self.get_report_dir(report_id)
        return Report(report_dir)

    def get_report_dir(self, report_id):
        return '%s%s%s' % (self.base_dir, os.sep, report_id)


reportManager = ReportManager()


def create_by_pb(file):
    (report_id, report) = reportManager.create_report()
    report.set_data_by_pb(file)
    return report_id


def create_by_json(file):
    (report_id, report) = reportManager.create_report()
    report.set_data_by_json(file)
    return report_id


def set_icon(report_id, value):
    report = reportManager.get_report(report_id)
    report.set_icon(value)


def add_screenshots(report_id, screenshots):
    report = reportManager.get_report(report_id)
    report.add_screenshots(screenshots)


def done(report_id):
    report = reportManager.get_report(report_id)
    report.done()

демонстрационный файл

#! /usr/bin/python
# coding: utf-8

from flask import Flask, request, jsonify

import report

app = Flask(__name__)


@app.route('/report', methods=['POST'])
def create_report():
    file_format = request.form['file_format']
    if file_format == 'pb':
        report_id = report.create_by_pb(request.files['data'])
    elif file_format == 'json':
        report_id = report.create_by_json(request.files['data'])

    if report_id is None:
        res = {'errCode': -1, 'errStr': 'invalid arguments'}
    else:
        res = {'errCode': 0, 'errStr': 'success', 'reportId': report_id}

    return jsonify(res)


@app.route('/report/icon', methods=['PUT'])
def set_icon():
    report_id = request.form['reportId']
    report.set_icon(report_id, request.files['icon'])
    return jsonify({'errCode': 0, 'errStr': 'success'})


@app.route('/report/screenshots', methods=['POST'])
def add_screenshots():
    report_id = request.form['reportId']
    files = []
    for name in request.files:
        files.append(request.files[name])

    report.add_screenshots(report_id, files)
    return jsonify({'errCode': 0, 'errStr': 'success'})


@app.route('/report/done', methods=['PUT'])
def done():
    report_id = request.form['reportId']
    report.done(report_id)
    return jsonify({'errCode': 0, 'errStr': 'success'})

Что ж, можно начинать веселиться!

Дальнейшее чтение:

Как настроить адрес файлового сервера данных и создать собственное веб-облако

https://bbs.perfdog.qq.com/detail-217.html