• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (C) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16/**
17 * 计算工具类
18 * @param fpsList
19 * @param gameFPS
20 */
21export default class CalculationUtils {
22  public TAG: String = 'CalculationTest';
23  public size: number;
24  public gameFPS: number;
25  //所有fps的集合
26  public fpsList: Array<number> = [];
27  //最低帧数
28  public point: number;
29  //低于point帧数的数量
30  public count: number = 0;
31  //所有帧数总和
32  private fpsSum: number;
33
34  constructor(fpsList: Array<number>, gameFPS: number) {
35    let removeList: Array<number> = new Array();
36    for (let i = 0; i < fpsList.length; i++) {
37      if (i < 0) {
38        removeList.push(i);
39      }
40    }
41    fpsList.filter((item) => {
42      return removeList.indexOf(item) < 0;
43    });
44    this.fpsList = fpsList;
45    this.size = fpsList.length;
46    this.gameFPS = gameFPS;
47    this.point =
48      gameFPS === 30 ? 25 : gameFPS === 40 ? 30 : gameFPS === 60 ? 45 : 10;
49  }
50
51  //抖动率计算
52  Jitter_rate(): number {
53    let jitterRite = 0;
54    let size = this.fpsList.length;
55
56    let numOfDiff3To = 0;
57    let numOfDiff5To = 0;
58    let numOfDiff8To = 0;
59    let numOfDiff12To = 0;
60    let numOfDiff16To = 0;
61
62    let numOfDiff3To5 = 0;
63    let numOfDiff5To8 = 0;
64    let numOfDiff8To12 = 0;
65    let numOfDiff6To10 = 0;
66    let numOfDiff10To16 = 0;
67
68    for (let i = 1; i < size; i++) {
69      let diff = Math.abs(this.fpsList[i] - this.fpsList[i - 1]);
70      if (diff > 3) {
71        numOfDiff3To++;
72      }
73      if (diff > 5) {
74        numOfDiff5To++;
75      }
76      if (diff > 8) {
77        numOfDiff8To++;
78      }
79      if (diff > 12) {
80        numOfDiff12To++;
81      }
82      if (diff > 16) {
83        numOfDiff16To++;
84      }
85      if (diff > 3 && diff <= 5) {
86        numOfDiff3To5++;
87      }
88      if (diff > 5 && diff <= 8) {
89        numOfDiff5To8++;
90      }
91      if (diff > 8 && diff <= 12) {
92        numOfDiff8To12++;
93      }
94      if (diff > 6 && diff <= 10) {
95        numOfDiff6To10++;
96      }
97      if (diff > 10 && diff <= 16) {
98        numOfDiff10To16++;
99      }
100    }
101
102    let percentOf3To = 0;
103    let percentOf5To = 0;
104    let percentOf8To = 0;
105    let percentOf12To = 0;
106    let percentOf16To = 0;
107
108    let percentOf3To5 = 0;
109    let percentOf5To8 = 0;
110    let percentOf8To12 = 0;
111    let percentOf6To10 = 0;
112    let percentOf10To16 = 0;
113
114    if (size !== 1) {
115      percentOf3To = numOfDiff3To / size;
116      percentOf5To = numOfDiff5To / size;
117      percentOf8To = numOfDiff8To / size;
118      percentOf12To = numOfDiff12To / size;
119      percentOf16To = numOfDiff16To / size;
120
121      percentOf3To5 = numOfDiff3To5 / size;
122      percentOf5To8 = numOfDiff5To8 / size;
123      percentOf8To12 = numOfDiff8To12 / size;
124      percentOf6To10 = numOfDiff6To10 / size;
125      percentOf10To16 = numOfDiff10To16 / size;
126    }
127    if (this.gameFPS === 25 || this.gameFPS === 30) {
128      jitterRite = percentOf3To * 100;
129    }
130    if (this.gameFPS === 40 || this.gameFPS === 45) {
131      jitterRite = (percentOf3To5 * 0.4 + percentOf5To * 0.6) * 100;
132    }
133    if (this.gameFPS === 60) {
134      jitterRite =
135        (percentOf3To5 * 0.2 + percentOf5To8 * 0.3 + percentOf8To * 0.5) * 100;
136    }
137    if (this.gameFPS === 90) {
138      jitterRite =
139        (percentOf5To8 * 0.2 + percentOf8To12 * 0.3 + percentOf12To * 0.5) *
140        100;
141    }
142    if (this.gameFPS === 120) {
143      jitterRite =
144        (percentOf6To10 * 0.2 + percentOf10To16 * 0.3 + percentOf16To * 0.5) *
145        100;
146    }
147    return jitterRite;
148  }
149
150  //低帧率计算
151  Low_Frame_Rate(): number {
152    for (let i = 0; i < this.fpsList.length; i++) {
153      if (this.fpsList[i] < this.point) {
154        this.count++;
155      }
156    }
157    return (this.count / this.size) * 100;
158  }
159
160  //卡顿次数 100ms
161  calculateCaton(fpsJitterList: Array<string>): number {
162    let num = 0;
163    for (let i = 0; i < fpsJitterList.length; i++) {
164      let jitter = fpsJitterList[i].split(';;');
165      for (let j = 0; j < jitter.length; j++) {
166        let n = Number(jitter[j]);
167        if (!isNaN(n) && n / 1e6 > 100) {
168          num++;
169        }
170      }
171    }
172    return num;
173  }
174
175  //满帧计算
176  static calculateFPSNew(fpsList: Array<number>): number {
177    let FPS = 30;
178    let moreThan34Count = 0;
179    let moreThan44Count = 0;
180    let moreThan70Count = 0;
181    let moreThan100Count = 0;
182    for (let i in fpsList) {
183      if (fpsList[i] >= 100) {
184        moreThan100Count++;
185      } else if (fpsList[i] >= 70) {
186        moreThan70Count++;
187      } else if (fpsList[i] >= 44) {
188        moreThan44Count++;
189      } else if (fpsList[i] >= 34) {
190        moreThan34Count++;
191      }
192    }
193    if (moreThan100Count >= 1) {
194      FPS = 120;
195    } else if (moreThan70Count >= 1) {
196      FPS = 90;
197    } else if (moreThan44Count >= 1) {
198      FPS = 60;
199    } else if (moreThan34Count >= 1) {
200      FPS = 45;
201    }
202    return FPS;
203  }
204}
205