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