# 参数说明

软件数据采集说明

Perfeye支持移动平台和Windows平台的所有应用程序(游戏、APP应用、浏览器等),桌面应用程序Perfeye支持在Windows机器使用运行。

# Windows平台

  • Screenshot(主屏幕截图)

  • FPS(1秒内游戏画面或者应用界面真实平均刷新次数,俗称帧率/FPS)

    1. Avg(FPS):平均帧率(一段时间内平均FPS)
    2. Var(FPS):帧率方差(一段时间内FPS方差)
    3. Drop(FPS):降帧次数(平均每小时相邻两个FPS点下降大于8帧的次数)
  • Jank(1s内卡顿次数。iOS9.1以下系统暂时不支持。类似Android的Jank卡顿和iOS的FramePacing平滑度统计原理。帧率FPS高并不能反映流畅或不卡顿。比如:FPS为50帧,前200ms渲染一帧,后800ms渲染49帧,虽然帧率50,但依然觉得非常卡顿。同时帧率FPS低,并不代表卡顿,比如无卡顿时均匀FPS为15帧。所以,平均帧率FPS与卡顿无任何直接关系)

    • 计算方法:同时满足两条件,则认为是一次卡顿Jank.

      1. 当前帧耗时>前三帧平均耗时2倍。
      2. 当前帧耗时>两帧电影帧耗时(1000ms/24*2=84ms)。
    • 同时满足两条件,则认为是一次严重卡顿BigJank.

      1. 当前帧耗时>前三帧平均耗时2倍。
      2. 当前帧耗时>三帧电影帧耗时(1000ms/24*3=125ms)。
    • 计算思路:考虑视觉惯性,假设以前三帧的平均帧耗时为参考,作为vsync时间间隔,连续两次vsync没有新渲染画面刷新,则认为是一次潜在卡顿,也就是说下一帧耗时大于前三帧平均帧耗时2倍,则认为一次潜在卡顿。同时单帧耗时满足大于两倍电影帧耗时1000ms/24*2 (由于人眼低于24帧才能辨别画面不连续性),则认为是一次真正卡顿。同时若单帧耗时大于3倍电影帧耗时,则认为是一次严重卡顿。

    • 注解:为什么是两次vsync?GPU一般是3重缓冲buffer,当前帧已占用一个buffer,即剩余2缓冲buffer,人眼一般可容忍2帧延迟。 为什么是两帧电影帧耗时?低于24帧画面,人眼就能感知到画面不连续性,电影一般都是24帧。即电影帧耗时1000ms/24=41.67ms,两帧电影帧耗时也就是41.67ms2,三帧电影帧耗时是41.67ms3。

      1. BigJank:1s内严重卡顿次数
      2. Jank(/10min):平均每10分钟卡顿次数。
      3. BigJank(/10min):平均每10分钟严重卡顿次数
  • FTime(上下帧画面显示时间间隔,即认为帧耗时,iOS9.1以下系统暂时不支持)

    1. Avg(FTime):平均帧耗时
    2. Delta(FTime):增量耗时(平均每小时两帧之间时间差>100ms的次数)
  • DrawCall 每一帧画面绘制所调用函数
    ID3D11DeviceContext:: (opens new window),
    ID3D11DeviceContext::Draw (opens new window),
    ID3D11DeviceContext::DrawInstanced (opens new window),
    ID3D11DeviceContext::DrawIndexedInstanced (opens new window),
    ID3D11DeviceContext::DrawInstancedIndirect (opens new window),
    ID3D11DeviceContext::DrawIndexedInstancedIndirect (opens new window)
    方法的次数。

  • Vertice 每一帧所有经过处理的顶点数量总和

  • Primitive 每一帧所有经过处理的图片( 三角形,点,线) 的数量总和

  • Dispatch 调用 ID3D11DeviceContext::Dispatch, ID3D11DeviceContext::DispatchIndirect的次数 (dispatch) 次数

  • CPU Usage(Total整机/App目标进程,统计结果和任务管理器一致)

  • CPU Core Usage(系统每个CPU核心的使用率)

  • Memory (进程的Private Bytes,统计结果和VMMap Private Bytes结果一致,与任务管理器-详细信息-提交内存也一致。)

Working Set(进程的工作集内存,统计结果和VMMap Working Set结果一致,与任务管理器-详细信息-工作集(内存)也一致)

  • Swap Memory (系统的Swap Memory)

  • GPU Usage(GPU使用率,统计结果和GPU-Z结果一致)

  • GPU Memory Used(GPU显存,统计结果和GPU-Z结果一致)

  • Shared Usage(共享GPU内存,统计结果和任务管理器结果一致)

  • Dedicated Usage(专用GPU内存,统计结果和任务管理器结果一致)

  • Network(Recv/Send,测试目标进程流量)

  • IO

    1. appRead/appWrite(测试目标进程的IO读写量)
    2. sysRead/sysWrite(整个系统的磁盘的IO读写量)
  • DRAM Bandwidth

    1. DRAMBandwidthRead (从主内存控制器中读取的内存带宽字节数(GB/s))
    2. DRAMBandwidthWrite (向主内存控制器中写入的内存带宽字节数(GB/s))
    3. DRAMBandwidthIO (由于对内存控制器的IO请求而读/写的字节数(单位GB))
    4. DRAMBandwidthIA (由于对内存控制器的IA请求而读/写的字节数(单位GB))
    5. DRAMBandwidthGT (由于对内存控制器的GT请求而读/写的字节数(单位GB))
  • CPU Core IPC

    1. CPUCoreExecUsage (平均每个额定CPU周期内执行的指令个数[分核心]
    2. CPUCoreIPC (平均每个CPU周期内执行的指令个数[分核心])
  • CPU Core Freq

    1. CPUCoreFreq (相对频率(单位%)(分核心)大于1表示Intel Turbo Boost)
    2. CPUCoreActiveFreq (主动相对频率(单位%)(分核心)大于1表示Intel Turbo Boost)
  • CPU Core L3 Cache Miss

    1. L3CacheMisses (L3缓存(读) cache misses的字节数[分核心])
    2. L3CacheHitRatio (L3缓存(读) cache命中率(单位:%)[分核心])
    3. L3CacheMissesPerInstruction (平均每条指令发生L3缓存(读) cache misses的次数[分核心])
  • CPU Core L2 Cache Miss

    1. L2CacheMisses (L2缓存(读) cache misses的字节数[分核心])
    2. L2CacheHitRatio (L2缓存(读) cache命中率(单位:%)[分核心])
    3. L2CacheMissesPerInstruction (平均每条指令发生L2缓存(读) cache misses的次数[分核心])
  • CPU Core Temp

    1. CPUCoreTemp (距离CPU TjMax(核心最高温度)的相对温度(单位:摄氏度),0表示已经达到CPU TjMax(核心最高温度)[分核心])
  • CPU Energy

    1. CPUEnergy (CPU能耗(单位:焦耳))

# iOS 平台 (与苹果官方 Xcode 工具参数对齐一致)

  • Screenshot

  • FPS(1秒内游戏画面或者应用界面真实平均刷新次数,俗称帧率/FPS)

    1. Avg(FPS):平均帧率(一段时间内平均FPS)
    2. Var(FPS):帧率方差(一段时间内FPS方差)
    3. Drop(FPS):降帧次数(平均每小时相邻两个FPS点下降大于8帧的次数)
  • Jank(1s内卡顿次数。iOS9.1以下系统暂时不支持。类似Android的Jank卡顿和iOS的FramePacing平滑度统计原理。帧率FPS高并不能反映流畅或不卡顿。比如:FPS为50帧,前200ms渲染一帧,后800ms渲染49帧,虽然帧率50,但依然觉得非常卡顿。同时帧率FPS低,并不代表卡顿,比如无卡顿时均匀FPS为15帧。所以,平均帧率FPS与卡顿无任何直接关系)

    • 计算方法:同时满足两条件,则认为是一次卡顿Jank.

      1. 当前帧耗时>前三帧平均耗时2倍。
      2. 当前帧耗时>两帧电影帧耗时(1000ms/24*2=84ms)。
    • 同时满足两条件,则认为是一次严重卡顿BigJank.

      1. 当前帧耗时>前三帧平均耗时2倍。
      2. 当前帧耗时>三帧电影帧耗时(1000ms/24*3=125ms)。
    • 计算思路:考虑视觉惯性,假设以前三帧的平均帧耗时为参考,作为vsync时间间隔,连续两次vsync没有新渲染画面刷新,则认为是一次潜在卡顿,也就是说下一帧耗时大于前三帧平均帧耗时2倍,则认为一次潜在卡顿。同时单帧耗时满足大于两倍电影帧耗时1000ms/24*2 (由于人眼低于24帧才能辨别画面不连续性),则认为是一次真正卡顿。同时若单帧耗时大于3倍电影帧耗时,则认为是一次严重卡顿。

    • 注解:为什么是两次vsync?GPU一般是3重缓冲buffer,当前帧已占用一个buffer,即剩余2缓冲buffer,人眼一般可容忍2帧延迟。 为什么是两帧电影帧耗时?低于24帧画面,人眼就能感知到画面不连续性,电影一般都是24帧。即电影帧耗时1000ms/24=41.67ms,两帧电影帧耗时也就是41.67ms2,三帧电影帧耗时是41.67ms3。

      1. BigJank:1s内严重卡顿次数
      2. Jank(/10min):平均每10分钟卡顿次数。
      3. BigJank(/10min):平均每10分钟严重卡顿次数
  • FTime(上下帧画面显示时间间隔,即认为帧耗时,iOS9.1以下系统暂时不支持。)

    1. Avg(FTime):平均帧耗时
    2. Delta(FTime):增量耗时(平均每小时两帧之间时间差>100ms的次数)
  • smoothness的定义: 24 fps 是人眼「似动现象」最低帧率, 也就是约 41.7 ms 每帧. 低于此帧率, 人 眼会感觉到画面的不连续. 把每帧超出 41.7 ms 的时间算作造成卡顿的时间, 剩下的时间算作流畅时间. 流畅时间和总时间的比值, 定义为流畅度.

  • JX3Jank的定义: 当前帧耗时(ftime),超过前五次帧耗时(ftime)的均值的1.5倍,记为一次JX3Jank。

  • CPU Usage(Total整机/App进程,统计结果合Xcode一致)

  • Memory (是统计FootPrint,注:OOM与FootPrint有关,与系统、机型无关。只与RAM有关,如1G内存机器。FootPrint超过650MB,引发OOM)。受iOS平台限制,暂时无法获取ios10及以下系统的memory。如做性能测试,建议升级iOS系统版本

  • Xcode Memory (XCode Debug Gauges统计方式即XCode Memory)受iOS平台限制,暂时无法获取ios10及以下系统的Xcode Memory。如做性能测试,建议升级iOS系统版本

  • Real Memory(Xcode Instrument统计方式即Real Memory,实际占用物理内存。注:物理内存与系统策略有关,关注意义不大)

  • Virtual Memory(虚拟内存)

  • Wakeups(线程唤醒次数)。注:超过150进程很大可能会被系统kill

  • CSwitch(上下文切换测试)。注:单核超过14000进程会被系统Kill

  • GPU Utilization(Render/Tilter/Device)

    1. Render:渲染器利用率(像素着色处理阶段,若占比高,说明是PS阶段出现瓶颈,shader过于复杂或纹理大小、采样复杂等)
    2. Tilter:Tilter利用率(顶点着色处理阶段,若占比高,说明是VS阶段出现瓶颈,顶点数太多等原因)
    3. Device:设备利用率(整体GPU利用率)
  • Network(Recv/Send,测试目标进程流量,和Xcode结果一致)

  • Battery Power(整机实时Current电流、Voltage电压、Power功耗)(注:20s获取一次,目前最精准的统计方式,结果和Battery life结果一致,支持所有iOS机型)

  • Energy Usage(即为Xcode Energy Impact。监控应用使用的能耗情况(包括CPU、GPU、NetWork、Location、Display (iPhone X only)、Overhead)

  • BatteryTemp(电池温度)

  • IO

    1. ReadBytes/WrittenBytes(测试目标进程的IO读写量)
  • Gpu

    • GpuGeneralCounter(GPU基础信息计数器)
      1. TotalOccupancy:GPU使用率
      2. VertexOccupancy:测量用于执行顶点线程的 GPU 总线程容量的百分比
      3. FragmentOccupancy:测量用于执行片段线程的 GPU 总线程容量的百分比
      4. ComputeOccupancy:测量用于执行计算命令的 GPU 总线程容量的百分比
    • GpuMemoryCounter(显存计数器)
      1. BufferReadLimiter:GPU从 buffers 中读取数据所花费时间的占比(包含stall时间)
      2. BufferLoadUtilization:GPU从 buffers 中读取数据所花费时间的占比(排除stall时间)
      3. TextureSampleLimiter:GPU花费在 sampling texture 上的时间占比(包含stall时间)
      4. TextureSampleUtilization:GPU花费在 sampling texture 上的时间占比(排除stall时间)
      5. GpuReadBandwidth:GPU每秒从内存中读取的数据量
      6. GpuWriteBandwidth:GPU每秒向内存中写入的数据量
    • GpuShaderCounter(GPU 着色器周期计数器)
      1. AluLimiter:GPU花费在算数,逻辑,位运算上的时间占比(包含stall时间)
      2. AluUtilization:GPU花费在算数,逻辑,位运算上的时间占比(排除stall时间)
      3. F32Utilization:GPU花费在32位浮点运算上的时间占比
      4. F16Utilization:GPU花费在16位浮点运算上的时间占比

# Android 平台

  • Screenshot
  • FPS(1 秒内游戏画面或者应用界面真实平均刷新次数,俗称帧率/FPS)
    1. Avg(FPS):平均帧率(一段时间内平均 FPS)
    2. Var(FPS):帧率方差(一段时间内 FPS 方差)
    3. Drop(FPS):降帧次数(平均每小时相邻两个 FPS 点下降大于 8 帧的次数)
    4. 注解特殊情况:
 // 采样频率为1s一次, 刷新频率是dumpsys获取的数据, FTime是真实的一次刷新的时长

  FTime:        ... |<-------------1700------------>|...

  refresh freq:              |              |

  sample freq:    |            |            |
          0            1000            2000

在上图这种FTime>1000的情况下时, 因为这个FTime处于两个采样周期中, 并且该FTime在第二个采样周期结束之前完成,也就是1000-2000这个采样段中采到了1700的FTime, 因此对于上图这种情况而言, FPS是不会等于0。

 // 采样频率为1s一次, 刷新频率是dumpsys获取的数据, FTime是真实的一次刷新的时长

  FTime:                 ... |<-------------1700------------>|...

  refresh freq:              |              |

  sample freq:    |            |            |
          0            1000            2000

在上图这种FTime>1000的情况下时, 虽然这个FTime仍然为1700, 但其跨越了三个采样周期,在1000-2000这个区间内sample其实是没有拿到FTime数据的, 因此在这种情况下FPS会等于0。

  • Jank(1s 内卡顿次数。iOS9.1 以下系统暂时不支持。类似 Android 的 Jank 卡顿和 iOS 的 FramePacing 平滑度统计原理。帧率 FPS 高并不能反映流畅或不卡顿。比如:FPS 为 50 帧,前 200ms 渲染一帧,后 800ms 渲染 49 帧,虽然帧率 50,但依然觉得非常卡顿。同时帧率 FPS 低,并不代表卡顿,比如无卡顿时均匀 FPS 为 15 帧。所以,平均帧率 FPS 与卡顿无任何直接关系)

    • 计算方法:同时满足两条件,则认为是一次卡顿 Jank.

      1. 当前帧耗时>前三帧平均耗时 2 倍。
      2. 当前帧耗时>两帧电影帧耗时(1000ms/24*2=84ms)。
    • 同时满足两条件,则认为是一次严重卡顿 BigJank.

      1. 当前帧耗时>前三帧平均耗时 2 倍。
      2. 当前帧耗时>三帧电影帧耗时(1000ms/24*3=125ms)。
    • 计算思路:考虑视觉惯性,假设以前三帧的平均帧耗时为参考,作为 vsync 时间间隔,连续两次 vsync 没有新渲染画面刷新,则认为是一次潜在卡顿,也就是说下一帧耗时大于前三帧平均帧耗时 2 倍,则认为一次潜在卡顿。同时单帧耗时满足大于两倍电影帧耗时 1000ms/24*2 (由于人眼低于 24 帧才能辨别画面不连续性),则认为是一次真正卡顿。同时若单帧耗时大于 3 倍电影帧耗时,则认为是一次严重卡顿。

    • 注解:为什么是两次 vsync?GPU 一般是 3 重缓冲 buffer,当前帧已占用一个 buffer,即剩余 2 缓冲 buffer,人眼一般可容忍 2 帧延迟。 为什么是两帧电影帧耗时?低于 24 帧画面,人眼就能感知到画面不连续性,电影一般都是 24 帧。即电影帧耗时 1000ms/24=41.67ms,两帧电影帧耗时也就是 41.67ms*2,三帧电影帧耗时是 41.67ms*3。

      1. BigJank:1s 内严重卡顿次数
      2. Jank(/10min):平均每 10 分钟卡顿次数。
      3. BigJank(/10min):平均每 10 分钟严重卡顿次数
  • FTime(上下帧画面显示时间间隔,即认为帧耗时,iOS9.1 以下系统暂时不支持。)

    1. Avg(FTime):平均帧耗时
    2. Delta(FTime):增量耗时(平均每小时两帧之间时间差>100ms 的次数)
  • smoothness 的定义: 24 fps 是人眼「似动现象」最低帧率, 也就是约 41.7 ms 每帧. 低于此帧率, 人 眼会感觉到画面的不连续. 把每帧超出 41.7 ms 的时间算作造成卡顿的时间, 剩下的时间算作流畅时间. 流畅时间和总时间的比值, 定义为流畅度.

  • JX3Jank 的定义: 当前帧耗时(ftime),超过前五次帧耗时(ftime)的均值的 1.5 倍,记为一次 JX3Jank。

  • CPU Usage(Total 整机/App 目标进程,统计结果和 Android Studio Profiler 一致)

  • CPU Clock(各个 CPU 核心的频率和使用率)

  • Memory (PSS Memory,统计结果和 Android Java API 标准结果一致,与 Meminfo 也一致。

  • Swap Memory(Swap Memory)

  • Virtual Memory

  • Memory Detail(NativePSS、GFX、GL、Unknown)

  • GPU Usage(目前仅支持高通芯片手机)

  • GPU Frequency(目前仅支持高通芯片手机)

  • Network(Recv/Send)

  • CTemp(CPU 温度)

  • GTemp(GPU 温度)

  • BatteryTemp(电池温度)

  • Battery Power(Current 电流、Voltage 电压、Power 功率)(注:与仪器测试误差<3%左右)

  • MaliGpu

    • MaliGpuGeneralCounter(GPU基础信息计数器)
      1. Non-fragment queue utilization:非片段着色器耗费的GPU时间占渲染耗费的GPU时间的比例
      2. Fragment queue utilization:片段着色器耗费的GPU时间占渲染耗费的GPU时间的比例
    • MaliGpuShaderCounter(maliGPU 着色器周期计数器)
      1. Fragments/pixel:表示每个像素由多少个片段分层组成,通常用于表示像素被重复绘制的次数
      2. GPU cycles/pixel:指平均每个已着色Pixel所耗费的GPU Cycle
    • MaliGpuMemoryCounter(mali 显存计数器)
      1. Load/store bytes:Load/Store单元读取L2内存的实际带宽
      2. Texture bytes:Texture单元读取L2内存的实际带宽 (纹理采样)
      3. Read bytes:定义GPU到DRAM或者GPU外部的系统内存的实际读带宽
      4. Write bytes:定义GPU到DRAM或者GPU外部的系统内存的实际写带宽
    • Mali Geometry Usage(maliGPU 像素信息计数器)
      1. CulledPrimitives:在渲染过程中被剔除的图元个数
      2. VisiblePrimitives:在所有culling stages之后仍然可见的图元个数
      3. InputPrimitives:进入渲染过程的输入图元的总数
    • Mali Shader Cycles(maliGPU着色器计数器)
      1. Shader Cycles:shader活跃的cycles
      2. Shader Fragment Cycles:可变单元活跃的cycles
      3. Shader Arithmetic Cycles:算数单元活跃的cycles
      4. Shader LoadStore Cycles:加载单元活跃的cycles
      5. Shader Texture Cycles:纹理单元活跃的cycles
  • QComGpu

    • QComGpuGeneralCounter(QComGPU基础信息计数器)
      1. GPU % Utilization:GPU 使用率
      2. GPU % Bus Busy:GPU到内存总线的繁忙时间的百分比
      3. % Shaders Busy:shader繁忙时间的百分
      4. Pre-clipped Polygons/Second:在硬件裁剪之前每秒提交给 GPU 的多边形数
    • QComGpuMemoryCounter(QCom显存计数器)
      1. Read Total (Bytes/sec):GPU每秒从内存中读取的数据量
      2. Write Total (Bytes/sec):GPU每秒向内存中写入的数据量
      3. % Texture L2 Miss:L2纹理缓存的未命中百分比
      4. % Stalled on System Memory:L2缓存等待内存数据而被迫stall的百分比
    • QComGpuShaderCounter(QComGPU 着色器周期计数器)
      1. Vertices Shaded / Second:每秒钟提交到shader的顶点的数
      2. Fragments Shaded/ Second:每秒钟提交到shader的片段的数量
  • PVRGpu

    • PVRGpuGeneralCounter(PVRGPU基础信息计数器)
      1. RendererActive:渲染器任务处于活动状态时间的百分比
      2. TilerActive:任务处于活跃状态时间的百分比
      3. HSREfficiency:HSR Engine丢弃的模糊像素占输入像素的百分比
      4. SPMActive:表示由 SPM 引起的渲染器任务百分比
    • PVRGpuMemoryCounter(PVR显存计数器)
      1. GpuMemoryReadBytes:GPU每秒从内存中读取的数据量
      2. GpuMemoryWriteBytes:GPU每秒向内存中写入的数据量
      3. GpuMemoryTotalBytes :GPU每秒从内存中读取/写入的数据量
      4. GpuMemoryInterfaceLoad:GPU内存总线的使用率
    • PVRGpuShaderCounter(PVRGPU 着色器周期计数器)
      1. GpuMemoryInterfaceLoad:每秒钟shader产生顶点数的总数
      2. ShadedPixels:每秒钟shader产生像素点的总数
      3. OverDraw:一个像素被重复渲染的次数
上次更新: 2023/12/21 10:59:24