观察游戏卡顿时,平均值会把短暂的慢帧摊到很多快帧里。百分位从排序后的位置描述尾部,但不同计算约定会产生不同结果,所以应先把取法写明。
先固定规则和输入
本例每组记录六十帧,单位毫秒。使用最近秩约定:百分位p取排序后第ceil(p乘六十)个值,编号从一开始。统计中同时给出中位附近的P50以及P90、P95、P99。
六十个原始帧时间(毫秒) [16, 18, 11, 12, 12, 14, 18, 12, 14, 8, 16, 12, 18, 10, 8, 14, 18, 8, 8, 17, 18, 14, 26, 18, 18, 12, 12, 10, 9, 16, 17, 17, 10, 118, 9, 11, 25, 30, 16, 14, 8, 8, 11, 32, 10, 26, 9, 16, 18, 8, 18, 10, 14, 16, 18, 17, 14, 14, 9, 15] 从小到大 [8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 12, 12, 12, 12, 12, 12, 14, 14, 14, 14, 14, 14, 14, 14, 15, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 25, 26, 26, 30, 32, 118]
把结果按步骤记下来
P50的位置是ceil(50×60/100)=30,从小到大第30帧耗时14毫秒。其前一个排序值14,不能用平均值代替这个位置。
P90的位置是ceil(90×60/100)=54,从小到大第54帧耗时18毫秒。其前一个排序值18,不能用平均值代替这个位置。
P95的位置是ceil(95×60/100)=57,从小到大第57帧耗时26毫秒。其前一个排序值26,不能用平均值代替这个位置。
P99的位置是ceil(99×60/100)=60,从小到大第60帧耗时118毫秒。其前一个排序值32,不能用平均值代替这个位置。
本组最大慢帧是单独的一项,占六十分之一,因此P99会取到它,P95在第57项,只覆盖更靠前的尾部位置。
把慢帧数量比例和耗时比例并排记录,能区分快帧很多但少数停顿很长的情况。统计单位始终是毫秒,比例不附带毫秒。
平均耗时65/4毫秒。慢帧6个,占帧数1/10;其总耗时257毫秒,占全部975毫秒的257/975。
自己复核的办法
既统计超过二十毫秒的帧数占比,也统计这些帧耗时占整段总耗时的比例。两种分母不同,不能混成一个卡顿百分比;较少的慢帧也可能占据明显的一段时间。
建议先遮住结果,用本例原始输入独立完成一遍,再逐项对照。若出现差异,先找最早不一致的位置,检查索引从零还是从一开始、边界是否包含,以及比较或更新发生的先后。只比较最后一个数,往往无法分辨规则理解与计算步骤分别出了什么问题。
使用这个练习的边界
示例是自定样本,不代表某款游戏或某类硬件。六十帧只能说明这段短记录,不能代表长期表现。比较两次测试时还要保持场景、采样长度和统计约定一致。
