PerfDog4.0 探索,支援使用者自建 web 雲
經過一段時間的最佳化,PerfDog4.0 全新來襲,先來看看都更新了神馬
一,新版功能初探
【新增】新增圖表常見操作提示功能
【新增】新增高階功能,子程序幀率精準測試
【最佳化】徹底解決部分 Android 手機無法獲取電量和記憶體等問題
【最佳化】解決 iOS 低版本無法獲取 FPS 等問題
【修復】修復一些已知問題
我們發現新版增加了一些常用 tip
最佳化了一些安卓以及 ios 部分機型或者系統版本無法獲取部分資料的問題,如果還有一些獲取不到資料或者連線的問題,請檢視
PerfDog 使用連線相關說明
二,子程序幀率精準測試說明
這個子程序幀率獲取對於目前來說使用多程序的應用來說非常有用哦,可能有些同學對於這個概念不是很清晰,我們來一步步探索;
這是啥?幹啥用?怎麼用?
這是啥?幹啥用?怎麼用?
多程序簡介:
Android 平臺,一般大型 APP,比如遊戲有時候是多程序協作執行(微信小遊戲,微視等 APP 及王者榮耀等遊戲多子程序),可選擇目標子程序進行針對性測試。預設是主程序。如圖王者榮耀
弄清出子程序幀率之前先需要搞清楚 Android 視窗是是啥。下面簡要的概述下,具體還不理解的請度娘 SurfaceFliger,或者檢視這篇文章扒一扒安卓渲染原理
簡單來說 surfaceflinger 是安卓系統的一個服務,作用是接受多個來源的圖形顯示資料,將他們合成,然後傳送到顯示裝置;
我們來看看官方的描述
大類去看,一般 Android 主視窗 Activity 和與之對應的 View,有一種特殊的 View,如 SurfaceView,他會獨享一個 Surface,不與主視窗共享 Surface,獨立渲染非常高效,支援 OpenglES 渲染。也就是說可能會出現兩類視窗 FPS。一個是 Activety 視窗幀率和 SurfaceView 視窗幀率。
在什麼情況下會出現兩種型別視窗都有的情況呢?一般是遊戲型別、直播類、視屏流、小遊戲等型別應用會出現有兩種視窗。特殊情況下,可能會出現多個 Activity 和多個 SurfaceView,對統計幀率造成很大困難,需要一定策略獲取幀率。
遊戲、直播、影片、小遊戲等型別應用,PerfDog 預設獲取的是 SurfaceView 的 FPS。其他傳統應或 Web 用獲取的是 Activity 幀率。
同時 PerfDog 高階功能,支援使用者自己選擇視窗型別幀率,特別針對小程式,小遊戲等,能更精準測試目標視窗幀率,如下圖 (微信小遊戲 - 歡樂鬥地主)
小遊戲、直播、影片、遊戲等型別應用,請選擇 SurfaceView
我們來總結一下:
如果我們子程序的 View 是 SurfaceView,那麼子程序會獨享一個 Surface,不與主視窗共享 Surface;
這裡拿一個影片頁舉例,主執行緒和子執行緒實際上可以理解為疊加的狀態,二者互不干擾;也就是說我們獲取主執行緒的幀率是下面主程序的資料,而子程序幀率是中間的一小塊輪播圖的幀率資料,二者是獨立的
三,使用者自建 Web 雲獲取效能資料
在更新 4.0 後,我們在 setting 介面可以發現可以自定義上傳的雲平臺了
這裡要怎麼使用呢,如果我們有自己的雲平臺,那我們自定義一個連結請求就可以了;
下面我用 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 地址 + 埠號填進 server 裡,如果有域名就填寫域名,
點選上傳資料,就可以看到資料資訊啦
這裡貼出一下目前的介面文件:
介面說明
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 版本的介面文件哦。以後沒準會變得喲 !
再貼一份 flask 框架完整的 demo 吧
report 檔案
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()
demo 檔案
#! /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'})
好啦,可以開始愉快的玩耍啦!
延伸閱讀:
如何自定義資料檔案伺服器地址,構建自己 web 雲
https://bbs.perfdog.qq.com/detail-217.html
相關文章
- 阿里雲HBase推出普惠性高可用服務,獨家支援使用者的自建、混合雲環境叢集阿里
- 探索Web ComponentsWeb
- 樹莓派自建 NAS 雲盤之——雲盤構建樹莓派
- 自建搜尋引擎-基於美麗雲
- WordCloudStudio:全面支援Web端,隨時隨地建立精彩文字雲CloudWeb
- web AR探索和總結Web
- 實測:雲RDS MySQL效能是自建的1.6倍MySql
- 自建Kubernetes叢集如何使用阿里雲CSI儲存元件阿里元件
- 如何從自建MySQL遷移至阿里雲RDS for MySQL的教程MySql阿里
- 阿里雲RDS與ECS自建庫搭建主從複製阿里
- 探索自由而開放的 Web 字型Web
- Linux中如何批次刪除系統中所有的自建使用者Linux
- Oracle12C查詢自建使用者(非系統自帶)Oracle
- 從自建到雲原生:資料管理的未來與變革
- 樹莓派自建 NAS 雲盤之——資料自動備份樹莓派
- Windows信任自建CAWindows
- Laravel 自建 artisan 命令Laravel
- 支援 etcdv3 的 web ui 工具WebUI
- 探索AI驅動Web開發動態UIAIWebUI
- 3D探索——Web 3D哪家強?3DWeb
- 天翼雲Web應用防火牆(邊緣雲版)支援檢測和攔截Apache Spark shell命令注入漏洞Web防火牆ApacheSpark
- 揭祕莉莉絲Metaverse:自建UGC平臺,重金砸AI、雲遊戲MetaverseGCAI遊戲
- Web 探索之旅 | 第一部分:什麼是 Web?Web
- Web探索之旅 | 第四部分 : Web程式設計師Web程式設計師
- web技術支援| Web 客戶端實現錄音、錄影Web客戶端
- 假如 Web 當初不支援動態化Web
- Mozilla Firefox開始支援Web元件技術FirefoxWeb元件
- 深入探索ArkWeb:構建高效且安全的Web元件Web元件
- Rustdesk 自建伺服器Rust伺服器
- ModSecurity 自建規則之路
- 001.03 自建 Python 庫 HelpPython
- CentOS自建yum倉庫CentOS
- Flask 自建擴充套件Flask套件
- 自建執行緒管理執行緒
- leanote自建伺服器伺服器
- 雲端計算學習路線教程大綱課件:使用自建源
- 【Web總結】使用者認證Web
- 探索Web API SpeechSynthesis:給你的網頁增添聲音WebAPI網頁