1fb726d48Sopenharmony_ci/* 2fb726d48Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd. 3fb726d48Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4fb726d48Sopenharmony_ci * you may not use this file except in compliance with the License. 5fb726d48Sopenharmony_ci * You may obtain a copy of the License at 6fb726d48Sopenharmony_ci * 7fb726d48Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8fb726d48Sopenharmony_ci * 9fb726d48Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10fb726d48Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11fb726d48Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12fb726d48Sopenharmony_ci * See the License for the specific language governing permissions and 13fb726d48Sopenharmony_ci * limitations under the License.?? 14fb726d48Sopenharmony_ci */ 15fb726d48Sopenharmony_ci 16fb726d48Sopenharmony_ciimport { SpSystemTrace } from '../SpSystemTrace'; 17fb726d48Sopenharmony_ciimport { TraceRow } from '../trace/base/TraceRow'; 18fb726d48Sopenharmony_ciimport { renders } from '../../database/ui-worker/ProcedureWorker'; 19fb726d48Sopenharmony_ciimport { FlagsConfig } from '../SpFlags'; 20fb726d48Sopenharmony_ciimport { CpuFreqStruct } from '../../database/ui-worker/ProcedureWorkerFreq'; 21fb726d48Sopenharmony_ciimport { 22fb726d48Sopenharmony_ci queryFanceNameList, 23fb726d48Sopenharmony_ci queryFpsNameList, 24fb726d48Sopenharmony_ci queryRealFpsList, 25fb726d48Sopenharmony_ci queryRSNowTimeList, 26fb726d48Sopenharmony_ci querySignaledList, 27fb726d48Sopenharmony_ci querySkipDataList, 28fb726d48Sopenharmony_ci} from '../../database/sql/Ltpo.sql'; 29fb726d48Sopenharmony_ciimport { LtpoRender, LtpoStruct } from '../../database/ui-worker/ProcedureWorkerLTPO'; 30fb726d48Sopenharmony_ciimport { HitchTimeStruct, hitchTimeRender } from '../../database/ui-worker/ProcedureWorkerHitchTime'; 31fb726d48Sopenharmony_ciimport { lostFrameSender } from '../../database/data-trafic/LostFrameSender'; 32fb726d48Sopenharmony_ci 33fb726d48Sopenharmony_ciexport class SpLtpoChart { 34fb726d48Sopenharmony_ci private readonly trace: SpSystemTrace | undefined; 35fb726d48Sopenharmony_ci static APP_STARTUP_PID_ARR: Array<number> = []; 36fb726d48Sopenharmony_ci static jsonRow: TraceRow<CpuFreqStruct> | undefined; 37fb726d48Sopenharmony_ci static trace: SpSystemTrace; 38fb726d48Sopenharmony_ci static presentArr: Array<LtpoStruct> = []; 39fb726d48Sopenharmony_ci static fanceNameList: Array<LtpoStruct> = []; 40fb726d48Sopenharmony_ci static fpsnameList: Array<LtpoStruct> = []; 41fb726d48Sopenharmony_ci static realFpsList: Array<LtpoStruct> = []; 42fb726d48Sopenharmony_ci static rsNowTimeList: Array<LtpoStruct> = []; 43fb726d48Sopenharmony_ci static skipDataList: Array<LtpoStruct> = []; 44fb726d48Sopenharmony_ci static ltpoDataArr: Array<LtpoStruct> = []; 45fb726d48Sopenharmony_ci static sendLTPODataArr: Array<LtpoStruct> = []; 46fb726d48Sopenharmony_ci static sendHitchDataArr: Array<LtpoStruct> = []; 47fb726d48Sopenharmony_ci static signaledFence: Array<LtpoStruct> = []; 48fb726d48Sopenharmony_ci static tempRsNowTimeList: Array<LtpoStruct> = []; 49fb726d48Sopenharmony_ci static threadName: String = 'Present%'; 50fb726d48Sopenharmony_ci static funName: String = 'H:Waiting for Present Fence%'; 51fb726d48Sopenharmony_ci static signaledList: Array<LtpoStruct> = []; 52fb726d48Sopenharmony_ci constructor(trace: SpSystemTrace) { 53fb726d48Sopenharmony_ci SpLtpoChart.trace = trace; 54fb726d48Sopenharmony_ci } 55fb726d48Sopenharmony_ci 56fb726d48Sopenharmony_ci async init() { 57fb726d48Sopenharmony_ci let loadLtpo: boolean = FlagsConfig.getFlagsConfigEnableStatus('LTPO'); 58fb726d48Sopenharmony_ci if (!loadLtpo) { 59fb726d48Sopenharmony_ci return; 60fb726d48Sopenharmony_ci } 61fb726d48Sopenharmony_ci SpLtpoChart.ltpoDataArr = []; 62fb726d48Sopenharmony_ci SpLtpoChart.fanceNameList = await queryFanceNameList(); 63fb726d48Sopenharmony_ci SpLtpoChart.fpsnameList = await queryFpsNameList(); 64fb726d48Sopenharmony_ci SpLtpoChart.realFpsList = await queryRealFpsList(); 65fb726d48Sopenharmony_ci SpLtpoChart.rsNowTimeList = await queryRSNowTimeList(); 66fb726d48Sopenharmony_ci SpLtpoChart.skipDataList = await querySkipDataList(); 67fb726d48Sopenharmony_ci SpLtpoChart.signaledList = await querySignaledList(); 68fb726d48Sopenharmony_ci this.initFenceName(); 69fb726d48Sopenharmony_ci this.initFpsName(); 70fb726d48Sopenharmony_ci if (SpLtpoChart.realFpsList.length > 0) { 71fb726d48Sopenharmony_ci this.initRealFps(); 72fb726d48Sopenharmony_ci } 73fb726d48Sopenharmony_ci this.initRsNowTime(); 74fb726d48Sopenharmony_ci //特殊情况:当前trace的RSHardwareThrea泳道最前面多一个单独的fence 75fb726d48Sopenharmony_ci if (SpLtpoChart.fpsnameList.length > 0 && SpLtpoChart.fanceNameList.length - SpLtpoChart.fpsnameList.length === 1) { 76fb726d48Sopenharmony_ci if (Number(SpLtpoChart.fanceNameList[0].ts) < Number(SpLtpoChart.fpsnameList[0].ts)) { 77fb726d48Sopenharmony_ci SpLtpoChart.fanceNameList.splice(0, 1); 78fb726d48Sopenharmony_ci } 79fb726d48Sopenharmony_ci } 80fb726d48Sopenharmony_ci if (SpLtpoChart.fanceNameList!.length && SpLtpoChart.fpsnameList.length !== SpLtpoChart.fanceNameList.length) { 81fb726d48Sopenharmony_ci let fpsIndex = 0; 82fb726d48Sopenharmony_ci let fanceIndex = 0; 83fb726d48Sopenharmony_ci while (fpsIndex < SpLtpoChart.fpsnameList!.length) { 84fb726d48Sopenharmony_ci if (SpLtpoChart.fanceNameList[fanceIndex] && SpLtpoChart.fpsnameList[fpsIndex]) { 85fb726d48Sopenharmony_ci if ( 86fb726d48Sopenharmony_ci SpLtpoChart.fanceNameList[fanceIndex].ts! > SpLtpoChart.fpsnameList[fpsIndex].ts! && 87fb726d48Sopenharmony_ci SpLtpoChart.fanceNameList[fanceIndex].ts! < 88fb726d48Sopenharmony_ci SpLtpoChart.fpsnameList[fpsIndex].ts! + SpLtpoChart.fpsnameList[fpsIndex].dur! 89fb726d48Sopenharmony_ci ) { 90fb726d48Sopenharmony_ci fpsIndex++; 91fb726d48Sopenharmony_ci fanceIndex++; 92fb726d48Sopenharmony_ci } else if (SpLtpoChart.fanceNameList[fanceIndex].ts! < SpLtpoChart.fpsnameList[fpsIndex].ts!) { 93fb726d48Sopenharmony_ci SpLtpoChart.fanceNameList.splice(fanceIndex, 1); 94fb726d48Sopenharmony_ci } else if ( 95fb726d48Sopenharmony_ci SpLtpoChart.fanceNameList[fanceIndex].ts! > 96fb726d48Sopenharmony_ci SpLtpoChart.fpsnameList[fpsIndex].ts! + SpLtpoChart.fpsnameList[fpsIndex].dur! 97fb726d48Sopenharmony_ci ) { 98fb726d48Sopenharmony_ci SpLtpoChart.fpsnameList.splice(fpsIndex, 1); 99fb726d48Sopenharmony_ci } 100fb726d48Sopenharmony_ci } else if (SpLtpoChart.fanceNameList[fanceIndex] && !SpLtpoChart.fpsnameList[fpsIndex]) { 101fb726d48Sopenharmony_ci SpLtpoChart.fanceNameList.splice(fanceIndex); 102fb726d48Sopenharmony_ci } else if (!SpLtpoChart.fanceNameList[fanceIndex] && SpLtpoChart.fpsnameList[fpsIndex]) { 103fb726d48Sopenharmony_ci SpLtpoChart.fpsnameList.splice(fpsIndex); 104fb726d48Sopenharmony_ci } else { 105fb726d48Sopenharmony_ci return; 106fb726d48Sopenharmony_ci } 107fb726d48Sopenharmony_ci } 108fb726d48Sopenharmony_ci } 109fb726d48Sopenharmony_ci if (SpLtpoChart.fanceNameList!.length && SpLtpoChart.fpsnameList.length === SpLtpoChart.fanceNameList.length) { 110fb726d48Sopenharmony_ci for (let i = 0; i < SpLtpoChart.fanceNameList.length; i++) { 111fb726d48Sopenharmony_ci let tmpFps = SpLtpoChart.fpsnameList[i]!.fps ? Number(SpLtpoChart.fpsnameList[i]!.fps) : 60; 112fb726d48Sopenharmony_ci let signaled = Number(SpLtpoChart.fanceNameList[i]!.signaled); 113fb726d48Sopenharmony_ci let startTime = Number(SpLtpoChart.fanceNameList[i]!.ts); 114fb726d48Sopenharmony_ci let durtaion = Number(SpLtpoChart.fanceNameList[i]!.dur); 115fb726d48Sopenharmony_ci if (SpLtpoChart.fanceNameList[i]!.signaled) { 116fb726d48Sopenharmony_ci this.pushLtpoData( 117fb726d48Sopenharmony_ci SpLtpoChart.ltpoDataArr, 118fb726d48Sopenharmony_ci SpLtpoChart.fanceNameList[i]!.fanceId!, 119fb726d48Sopenharmony_ci tmpFps, 120fb726d48Sopenharmony_ci signaled, 121fb726d48Sopenharmony_ci startTime, 122fb726d48Sopenharmony_ci durtaion, 123fb726d48Sopenharmony_ci 0, 124fb726d48Sopenharmony_ci 0 125fb726d48Sopenharmony_ci ); 126fb726d48Sopenharmony_ci } else { 127fb726d48Sopenharmony_ci this.pushLtpoData(SpLtpoChart.ltpoDataArr, SpLtpoChart.fanceNameList[i]!.fanceId!, tmpFps, 0, 0, 0, 0, 0); 128fb726d48Sopenharmony_ci } 129fb726d48Sopenharmony_ci } 130fb726d48Sopenharmony_ci } else { 131fb726d48Sopenharmony_ci return; 132fb726d48Sopenharmony_ci } 133fb726d48Sopenharmony_ci this.fenceToFps(); 134fb726d48Sopenharmony_ci this.fpsToRenderService(); 135fb726d48Sopenharmony_ci this.filterNowTime(); 136fb726d48Sopenharmony_ci if (SpLtpoChart.fanceNameList && SpLtpoChart.fanceNameList.length) { 137fb726d48Sopenharmony_ci await this.initFolder(); 138fb726d48Sopenharmony_ci await this.initHitchTime(); 139fb726d48Sopenharmony_ci } 140fb726d48Sopenharmony_ci } 141fb726d48Sopenharmony_ci //提取FenceId 142fb726d48Sopenharmony_ci initFenceName(): void { 143fb726d48Sopenharmony_ci SpLtpoChart.fanceNameList.map((item) => { 144fb726d48Sopenharmony_ci let cutFanceNameArr = item.name!.split(' '); 145fb726d48Sopenharmony_ci if (cutFanceNameArr[cutFanceNameArr.length - 1] === 'signaled') { 146fb726d48Sopenharmony_ci item.fanceId = Number(cutFanceNameArr[2]); 147fb726d48Sopenharmony_ci item.signaled = 1; 148fb726d48Sopenharmony_ci SpLtpoChart.signaledFence.push(item); 149fb726d48Sopenharmony_ci } else { 150fb726d48Sopenharmony_ci item.fanceId = Number(cutFanceNameArr[cutFanceNameArr.length - 1]); 151fb726d48Sopenharmony_ci } 152fb726d48Sopenharmony_ci }); 153fb726d48Sopenharmony_ci } 154fb726d48Sopenharmony_ci //从数据库中查询的name中提取fps 155fb726d48Sopenharmony_ci initFpsName(): void { 156fb726d48Sopenharmony_ci SpLtpoChart.fpsnameList.map((item) => { 157fb726d48Sopenharmony_ci if (item.name!.indexOf('=') === -1) { 158fb726d48Sopenharmony_ci let cutFpsNameArr = item.name!.split(',')[0].split(':'); 159fb726d48Sopenharmony_ci let cutFpsNameTimeArr = item.name!.split(',')[1].split(':'); 160fb726d48Sopenharmony_ci item.fps = Number(cutFpsNameArr[cutFpsNameArr.length - 1]); 161fb726d48Sopenharmony_ci item.nowTime = Number(cutFpsNameTimeArr[cutFpsNameTimeArr.length - 1]); 162fb726d48Sopenharmony_ci } else { 163fb726d48Sopenharmony_ci let cutFpsNameArr = item.name!.split('='); 164fb726d48Sopenharmony_ci item.fps = Number(cutFpsNameArr[cutFpsNameArr.length - 1]); 165fb726d48Sopenharmony_ci } 166fb726d48Sopenharmony_ci }); 167fb726d48Sopenharmony_ci } 168fb726d48Sopenharmony_ci //如果存在切帧,提取fps 169fb726d48Sopenharmony_ci initRealFps(): void { 170fb726d48Sopenharmony_ci SpLtpoChart.realFpsList.map((item) => { 171fb726d48Sopenharmony_ci let cutRealFpsArr = item.name!.split(' '); 172fb726d48Sopenharmony_ci item.fps = Number(cutRealFpsArr[cutRealFpsArr.length - 1]); 173fb726d48Sopenharmony_ci }); 174fb726d48Sopenharmony_ci this.setRealFps(); 175fb726d48Sopenharmony_ci } 176fb726d48Sopenharmony_ci //从render_service中获取nowTime 177fb726d48Sopenharmony_ci initRsNowTime(): void { 178fb726d48Sopenharmony_ci SpLtpoChart.rsNowTimeList.map((item) => { 179fb726d48Sopenharmony_ci let cutRsNameArr = item.name!.split(' ')[2].split(':'); 180fb726d48Sopenharmony_ci item.nowTime = Number(cutRsNameArr[cutRsNameArr.length - 1]); 181fb726d48Sopenharmony_ci }); 182fb726d48Sopenharmony_ci } 183fb726d48Sopenharmony_ci //处理fps 184fb726d48Sopenharmony_ci setRealFps(): void { 185fb726d48Sopenharmony_ci let moreIndex = 0; 186fb726d48Sopenharmony_ci let reallIndex = 0; 187fb726d48Sopenharmony_ci while (moreIndex < SpLtpoChart.fpsnameList.length) { 188fb726d48Sopenharmony_ci let itemMoreEndTs = 189fb726d48Sopenharmony_ci Number(SpLtpoChart.fpsnameList[moreIndex].ts) + Number(SpLtpoChart.fpsnameList[moreIndex].dur); 190fb726d48Sopenharmony_ci if (Number(SpLtpoChart.realFpsList[reallIndex].ts) < itemMoreEndTs) { 191fb726d48Sopenharmony_ci //此时这一帧包含了两个fps,将真实的fps赋给SpLtpoChart.fpsnameList 192fb726d48Sopenharmony_ci SpLtpoChart.fpsnameList[moreIndex].fps = SpLtpoChart.realFpsList[reallIndex].fps; 193fb726d48Sopenharmony_ci moreIndex++; 194fb726d48Sopenharmony_ci if (reallIndex < SpLtpoChart.realFpsList.length - 1) { 195fb726d48Sopenharmony_ci //判断SpLtpoChart.realFpsList有没有遍历完,没有就继续 196fb726d48Sopenharmony_ci reallIndex++; 197fb726d48Sopenharmony_ci } else { 198fb726d48Sopenharmony_ci //否则跳出 199fb726d48Sopenharmony_ci return; 200fb726d48Sopenharmony_ci } 201fb726d48Sopenharmony_ci } else { 202fb726d48Sopenharmony_ci //如果不满足的话,SpLtpoChart.fpsnameList数组往下走,而reallIndex不变 203fb726d48Sopenharmony_ci moreIndex++; 204fb726d48Sopenharmony_ci } 205fb726d48Sopenharmony_ci } 206fb726d48Sopenharmony_ci } 207fb726d48Sopenharmony_ci //RSHardwareThread泳道的fps数组集成FenceId数组中的FenceId和signaled 208fb726d48Sopenharmony_ci fenceToFps() { 209fb726d48Sopenharmony_ci if (SpLtpoChart.fanceNameList.length === SpLtpoChart.fpsnameList.length) { 210fb726d48Sopenharmony_ci let fenceIndex = 0; 211fb726d48Sopenharmony_ci let fpsIndex = 0; 212fb726d48Sopenharmony_ci while (fpsIndex < SpLtpoChart.fpsnameList.length) { 213fb726d48Sopenharmony_ci if (SpLtpoChart.fpsnameList[fpsIndex] && SpLtpoChart.fanceNameList[fenceIndex]) { 214fb726d48Sopenharmony_ci if ( 215fb726d48Sopenharmony_ci SpLtpoChart.fanceNameList[fenceIndex].ts! > SpLtpoChart.fpsnameList[fpsIndex].ts! && 216fb726d48Sopenharmony_ci SpLtpoChart.fanceNameList[fenceIndex].ts! < 217fb726d48Sopenharmony_ci SpLtpoChart.fpsnameList[fpsIndex].ts! + SpLtpoChart.fpsnameList[fpsIndex].dur! 218fb726d48Sopenharmony_ci ) { 219fb726d48Sopenharmony_ci SpLtpoChart.fpsnameList[fpsIndex].fanceId = SpLtpoChart.fanceNameList[fenceIndex].fanceId; 220fb726d48Sopenharmony_ci if (SpLtpoChart.fanceNameList[fenceIndex].signaled) { 221fb726d48Sopenharmony_ci SpLtpoChart.fpsnameList[fpsIndex].signaled = SpLtpoChart.fanceNameList[fenceIndex].signaled; 222fb726d48Sopenharmony_ci } 223fb726d48Sopenharmony_ci fenceIndex++; 224fb726d48Sopenharmony_ci fpsIndex++; 225fb726d48Sopenharmony_ci } else if (SpLtpoChart.fanceNameList[fenceIndex].ts! < SpLtpoChart.fpsnameList[fpsIndex].ts!) { 226fb726d48Sopenharmony_ci fenceIndex++; 227fb726d48Sopenharmony_ci } else if ( 228fb726d48Sopenharmony_ci SpLtpoChart.fanceNameList[fenceIndex].ts! > 229fb726d48Sopenharmony_ci SpLtpoChart.fpsnameList[fpsIndex].ts! + SpLtpoChart.fpsnameList[fpsIndex].dur! 230fb726d48Sopenharmony_ci ) { 231fb726d48Sopenharmony_ci fpsIndex++; 232fb726d48Sopenharmony_ci } 233fb726d48Sopenharmony_ci } else { 234fb726d48Sopenharmony_ci return; 235fb726d48Sopenharmony_ci } 236fb726d48Sopenharmony_ci } 237fb726d48Sopenharmony_ci } 238fb726d48Sopenharmony_ci } 239fb726d48Sopenharmony_ci //render_service的nowTime 集成RSHardThread泳道Fps数组的FenceId和Signaled 240fb726d48Sopenharmony_ci fpsToRenderService(): void { 241fb726d48Sopenharmony_ci let rsIndex = 0; 242fb726d48Sopenharmony_ci let hardIndex = 0; 243fb726d48Sopenharmony_ci while (rsIndex < SpLtpoChart.rsNowTimeList.length) { 244fb726d48Sopenharmony_ci if (SpLtpoChart.fpsnameList[hardIndex] && SpLtpoChart.rsNowTimeList[rsIndex]) { 245fb726d48Sopenharmony_ci if (SpLtpoChart.rsNowTimeList[rsIndex].nowTime! > SpLtpoChart.fpsnameList[hardIndex].nowTime!) { 246fb726d48Sopenharmony_ci //处理nowTime不一致的情况 247fb726d48Sopenharmony_ci hardIndex++; 248fb726d48Sopenharmony_ci } else if (SpLtpoChart.rsNowTimeList[rsIndex].nowTime! < SpLtpoChart.fpsnameList[hardIndex].nowTime!) { 249fb726d48Sopenharmony_ci rsIndex++; 250fb726d48Sopenharmony_ci } else { 251fb726d48Sopenharmony_ci SpLtpoChart.rsNowTimeList[rsIndex].fanceId = SpLtpoChart.fpsnameList[hardIndex].fanceId; 252fb726d48Sopenharmony_ci SpLtpoChart.rsNowTimeList[rsIndex].fps = SpLtpoChart.fpsnameList[hardIndex].fps; 253fb726d48Sopenharmony_ci if (SpLtpoChart.fpsnameList[hardIndex].signaled) { 254fb726d48Sopenharmony_ci SpLtpoChart.rsNowTimeList[rsIndex].signaled = SpLtpoChart.fpsnameList[hardIndex].signaled; 255fb726d48Sopenharmony_ci } 256fb726d48Sopenharmony_ci hardIndex++; 257fb726d48Sopenharmony_ci rsIndex++; 258fb726d48Sopenharmony_ci } 259fb726d48Sopenharmony_ci } else { 260fb726d48Sopenharmony_ci return; 261fb726d48Sopenharmony_ci } 262fb726d48Sopenharmony_ci } 263fb726d48Sopenharmony_ci } 264fb726d48Sopenharmony_ci //render_service中找出skip和signaled,将需要从上平时间减去的时间计算出来存在对应的nowTime的item中 265fb726d48Sopenharmony_ci filterNowTime(): void { 266fb726d48Sopenharmony_ci let skipIndex = 0; 267fb726d48Sopenharmony_ci let nowTimeIndex = 0; 268fb726d48Sopenharmony_ci let cutTimeSum = 0; 269fb726d48Sopenharmony_ci let tempFps = 0; //如果中间出现signaled,记录一下fps; 270fb726d48Sopenharmony_ci //将render_service中的nowTime数组中的skip去除掉 271fb726d48Sopenharmony_ci SpLtpoChart.tempRsNowTimeList = SpLtpoChart.rsNowTimeList.filter((item) => item.fps); 272fb726d48Sopenharmony_ci while (skipIndex < SpLtpoChart.skipDataList.length) { 273fb726d48Sopenharmony_ci if (SpLtpoChart.skipDataList[skipIndex] && SpLtpoChart.tempRsNowTimeList[nowTimeIndex]) { 274fb726d48Sopenharmony_ci if (SpLtpoChart.skipDataList[skipIndex].ts! > SpLtpoChart.tempRsNowTimeList[nowTimeIndex].ts!) { 275fb726d48Sopenharmony_ci if (cutTimeSum > 0 && nowTimeIndex > 0) { 276fb726d48Sopenharmony_ci SpLtpoChart.tempRsNowTimeList[nowTimeIndex - 1].cutTime = cutTimeSum; 277fb726d48Sopenharmony_ci if (!SpLtpoChart.tempRsNowTimeList[nowTimeIndex].signaled) { 278fb726d48Sopenharmony_ci cutTimeSum = 0; 279fb726d48Sopenharmony_ci } 280fb726d48Sopenharmony_ci } 281fb726d48Sopenharmony_ci if (SpLtpoChart.tempRsNowTimeList[nowTimeIndex].signaled && nowTimeIndex > 0) { 282fb726d48Sopenharmony_ci //两帧之间初心signaled 283fb726d48Sopenharmony_ci tempFps = SpLtpoChart.tempRsNowTimeList[nowTimeIndex].fps!; 284fb726d48Sopenharmony_ci cutTimeSum += 1000 / tempFps; 285fb726d48Sopenharmony_ci SpLtpoChart.tempRsNowTimeList[nowTimeIndex - 1].cutTime = cutTimeSum; 286fb726d48Sopenharmony_ci SpLtpoChart.tempRsNowTimeList.splice(nowTimeIndex, 1); 287fb726d48Sopenharmony_ci } else { 288fb726d48Sopenharmony_ci nowTimeIndex++; 289fb726d48Sopenharmony_ci cutTimeSum = 0; 290fb726d48Sopenharmony_ci tempFps = 0; 291fb726d48Sopenharmony_ci } 292fb726d48Sopenharmony_ci } else if (SpLtpoChart.skipDataList[skipIndex].ts! <= SpLtpoChart.tempRsNowTimeList[nowTimeIndex].ts!) { 293fb726d48Sopenharmony_ci if (nowTimeIndex > 0) { 294fb726d48Sopenharmony_ci cutTimeSum += tempFps ? 1000 / tempFps : 1000 / SpLtpoChart.tempRsNowTimeList[nowTimeIndex - 1].fps!; 295fb726d48Sopenharmony_ci } 296fb726d48Sopenharmony_ci skipIndex++; 297fb726d48Sopenharmony_ci } 298fb726d48Sopenharmony_ci } else { 299fb726d48Sopenharmony_ci return; 300fb726d48Sopenharmony_ci } 301fb726d48Sopenharmony_ci } 302fb726d48Sopenharmony_ci } 303fb726d48Sopenharmony_ci pushLtpoData( 304fb726d48Sopenharmony_ci lptoArr: unknown[] | undefined, 305fb726d48Sopenharmony_ci fanceId: Number, 306fb726d48Sopenharmony_ci fps: Number, 307fb726d48Sopenharmony_ci signaled: Number, 308fb726d48Sopenharmony_ci startTs: Number, 309fb726d48Sopenharmony_ci dur: Number, 310fb726d48Sopenharmony_ci nextStartTs: Number, 311fb726d48Sopenharmony_ci nextDur: number 312fb726d48Sopenharmony_ci ): void { 313fb726d48Sopenharmony_ci lptoArr?.push({ 314fb726d48Sopenharmony_ci fanceId: fanceId, 315fb726d48Sopenharmony_ci fps: fps, 316fb726d48Sopenharmony_ci signaled: signaled, 317fb726d48Sopenharmony_ci startTs: startTs, 318fb726d48Sopenharmony_ci dur: dur, 319fb726d48Sopenharmony_ci nextStartTs: nextStartTs, 320fb726d48Sopenharmony_ci nextDur: nextDur, 321fb726d48Sopenharmony_ci }); 322fb726d48Sopenharmony_ci } 323fb726d48Sopenharmony_ci sendDataHandle(presentArr: LtpoStruct[], ltpoDataArr: LtpoStruct[]): Array<LtpoStruct> { 324fb726d48Sopenharmony_ci let sendDataArr: LtpoStruct[] = []; 325fb726d48Sopenharmony_ci let ltpoDataIndex = 0; 326fb726d48Sopenharmony_ci let tempRsNowTimeIndex = 0; 327fb726d48Sopenharmony_ci let presentIndex = 0; 328fb726d48Sopenharmony_ci let ltpoIndex = 0; 329fb726d48Sopenharmony_ci //当有present缺失时: 330fb726d48Sopenharmony_ci this.deleteUselessFence(presentArr, ltpoDataArr); 331fb726d48Sopenharmony_ci while (presentIndex < presentArr.length) { 332fb726d48Sopenharmony_ci if (presentArr[presentIndex] && ltpoDataArr[ltpoIndex]) { 333fb726d48Sopenharmony_ci if ( 334fb726d48Sopenharmony_ci // @ts-ignore 335fb726d48Sopenharmony_ci presentArr[presentIndex].startTime! + presentArr[presentIndex].dur! - (window as unknown).recordStartNS === 336fb726d48Sopenharmony_ci TraceRow.range!.totalNS 337fb726d48Sopenharmony_ci ) { 338fb726d48Sopenharmony_ci presentArr.splice(presentIndex, 1); 339fb726d48Sopenharmony_ci } 340fb726d48Sopenharmony_ci if (presentArr[presentIndex].presentId === ltpoDataArr[ltpoIndex].fanceId) { 341fb726d48Sopenharmony_ci // @ts-ignore 342fb726d48Sopenharmony_ci ltpoDataArr[ltpoIndex].startTs = Number(presentArr[presentIndex].startTime) - (window as unknown).recordStartNS; 343fb726d48Sopenharmony_ci ltpoDataArr[ltpoIndex].dur = presentArr[presentIndex].dur; 344fb726d48Sopenharmony_ci ltpoDataArr[ltpoIndex].nextStartTs = presentArr[presentIndex + 1] 345fb726d48Sopenharmony_ci // @ts-ignore 346fb726d48Sopenharmony_ci ? Number(presentArr[presentIndex + 1].startTime) - (window as unknown).recordStartNS 347fb726d48Sopenharmony_ci : ''; 348fb726d48Sopenharmony_ci ltpoDataArr[ltpoIndex].nextDur = presentArr[presentIndex + 1] ? presentArr[presentIndex + 1].dur : 0; 349fb726d48Sopenharmony_ci presentIndex++; 350fb726d48Sopenharmony_ci ltpoIndex++; 351fb726d48Sopenharmony_ci } else if (presentArr[presentIndex].presentId! < ltpoDataArr[ltpoIndex].fanceId!) { 352fb726d48Sopenharmony_ci presentArr.splice(presentIndex, 1); 353fb726d48Sopenharmony_ci } else if (presentArr[presentIndex].presentId! > ltpoDataArr[ltpoIndex].fanceId!) { 354fb726d48Sopenharmony_ci ltpoDataArr.splice(ltpoIndex, 1); 355fb726d48Sopenharmony_ci } 356fb726d48Sopenharmony_ci } else { 357fb726d48Sopenharmony_ci break; 358fb726d48Sopenharmony_ci } 359fb726d48Sopenharmony_ci } 360fb726d48Sopenharmony_ci while (ltpoDataIndex < ltpoDataArr.length) { 361fb726d48Sopenharmony_ci let sendStartTs: number | undefined = 0; 362fb726d48Sopenharmony_ci let sendDur: number | undefined = 0; 363fb726d48Sopenharmony_ci let cutSendDur: number | undefined = 0; 364fb726d48Sopenharmony_ci if (ltpoDataArr[ltpoDataIndex] && SpLtpoChart.tempRsNowTimeList[tempRsNowTimeIndex]) { 365fb726d48Sopenharmony_ci if (ltpoDataArr[ltpoDataIndex].fanceId! < SpLtpoChart.tempRsNowTimeList[tempRsNowTimeIndex].fanceId!) { 366fb726d48Sopenharmony_ci if (ltpoDataArr[ltpoDataIndex].fanceId !== -1 && ltpoDataArr[ltpoDataIndex].nextDur) { 367fb726d48Sopenharmony_ci sendStartTs = Number(ltpoDataArr[ltpoDataIndex].startTs) + Number(ltpoDataArr[ltpoDataIndex].dur); 368fb726d48Sopenharmony_ci sendDur = 369fb726d48Sopenharmony_ci Number(ltpoDataArr[ltpoDataIndex].nextStartTs) + Number(ltpoDataArr[ltpoDataIndex].nextDur) - sendStartTs; 370fb726d48Sopenharmony_ci } 371fb726d48Sopenharmony_ci let tmpDur = cutSendDur ? Math.ceil(cutSendDur / 100000) / 10 : Math.ceil(sendDur / 100000) / 10; 372fb726d48Sopenharmony_ci if (tmpDur < 170) { 373fb726d48Sopenharmony_ci sendDataArr.push({ 374fb726d48Sopenharmony_ci dur: sendDur, 375fb726d48Sopenharmony_ci cutSendDur: cutSendDur, 376fb726d48Sopenharmony_ci value: 0, 377fb726d48Sopenharmony_ci startTs: sendStartTs, 378fb726d48Sopenharmony_ci pid: ltpoDataArr[ltpoDataIndex].fanceId, 379fb726d48Sopenharmony_ci itid: ltpoDataArr[ltpoDataIndex].fanceId, 380fb726d48Sopenharmony_ci name: undefined, 381fb726d48Sopenharmony_ci presentId: ltpoDataArr[ltpoDataIndex].fanceId, 382fb726d48Sopenharmony_ci ts: undefined, 383fb726d48Sopenharmony_ci fanceId: ltpoDataArr[ltpoDataIndex].fanceId, 384fb726d48Sopenharmony_ci fps: ltpoDataArr[ltpoDataIndex].fps, 385fb726d48Sopenharmony_ci nextStartTs: ltpoDataArr[ltpoDataIndex].nextStartTs, 386fb726d48Sopenharmony_ci nextDur: ltpoDataArr[ltpoDataIndex].nextDur, 387fb726d48Sopenharmony_ci translateY: undefined, 388fb726d48Sopenharmony_ci isHover: false, 389fb726d48Sopenharmony_ci startTime: undefined, 390fb726d48Sopenharmony_ci signaled: undefined, 391fb726d48Sopenharmony_ci nowTime: undefined, 392fb726d48Sopenharmony_ci cutTime: undefined, 393fb726d48Sopenharmony_ci frame: undefined, 394fb726d48Sopenharmony_ci }); 395fb726d48Sopenharmony_ci } 396fb726d48Sopenharmony_ci ltpoDataIndex++; 397fb726d48Sopenharmony_ci } else if (ltpoDataArr[ltpoDataIndex].fanceId! > SpLtpoChart.tempRsNowTimeList[tempRsNowTimeIndex].fanceId!) { 398fb726d48Sopenharmony_ci tempRsNowTimeIndex++; 399fb726d48Sopenharmony_ci } else { 400fb726d48Sopenharmony_ci if (SpLtpoChart.tempRsNowTimeList[tempRsNowTimeIndex].cutTime) { 401fb726d48Sopenharmony_ci cutSendDur = sendDur - SpLtpoChart.tempRsNowTimeList[tempRsNowTimeIndex].cutTime! * 1000000; 402fb726d48Sopenharmony_ci cutSendDur = cutSendDur < 0 ? 0 : cutSendDur; 403fb726d48Sopenharmony_ci } 404fb726d48Sopenharmony_ci if (ltpoDataArr[ltpoDataIndex].fanceId !== -1 && ltpoDataArr[ltpoDataIndex].nextDur) { 405fb726d48Sopenharmony_ci sendStartTs = Number(ltpoDataArr[ltpoDataIndex].startTs) + Number(ltpoDataArr[ltpoDataIndex].dur); 406fb726d48Sopenharmony_ci sendDur = 407fb726d48Sopenharmony_ci Number(ltpoDataArr[ltpoDataIndex].nextStartTs) + Number(ltpoDataArr[ltpoDataIndex].nextDur) - sendStartTs; 408fb726d48Sopenharmony_ci } 409fb726d48Sopenharmony_ci let tmpDur = cutSendDur ? Math.ceil(cutSendDur / 100000) / 10 : Math.ceil(sendDur / 100000) / 10; 410fb726d48Sopenharmony_ci if (tmpDur < 170) { 411fb726d48Sopenharmony_ci sendDataArr.push({ 412fb726d48Sopenharmony_ci dur: sendDur, 413fb726d48Sopenharmony_ci cutSendDur: cutSendDur, 414fb726d48Sopenharmony_ci value: 0, 415fb726d48Sopenharmony_ci startTs: sendStartTs, 416fb726d48Sopenharmony_ci pid: ltpoDataArr[ltpoDataIndex].fanceId, 417fb726d48Sopenharmony_ci itid: ltpoDataArr[ltpoDataIndex].fanceId, 418fb726d48Sopenharmony_ci name: undefined, 419fb726d48Sopenharmony_ci presentId: ltpoDataArr[ltpoDataIndex].fanceId, 420fb726d48Sopenharmony_ci ts: undefined, 421fb726d48Sopenharmony_ci fanceId: ltpoDataArr[ltpoDataIndex].fanceId, 422fb726d48Sopenharmony_ci fps: ltpoDataArr[ltpoDataIndex].fps, 423fb726d48Sopenharmony_ci nextStartTs: ltpoDataArr[ltpoDataIndex].nextStartTs, 424fb726d48Sopenharmony_ci nextDur: ltpoDataArr[ltpoDataIndex].nextDur, 425fb726d48Sopenharmony_ci translateY: undefined, 426fb726d48Sopenharmony_ci isHover: false, 427fb726d48Sopenharmony_ci startTime: undefined, 428fb726d48Sopenharmony_ci signaled: undefined, 429fb726d48Sopenharmony_ci nowTime: undefined, 430fb726d48Sopenharmony_ci cutTime: undefined, 431fb726d48Sopenharmony_ci frame: undefined, 432fb726d48Sopenharmony_ci }); 433fb726d48Sopenharmony_ci } 434fb726d48Sopenharmony_ci ltpoDataIndex++; 435fb726d48Sopenharmony_ci tempRsNowTimeIndex++; 436fb726d48Sopenharmony_ci } 437fb726d48Sopenharmony_ci } else { 438fb726d48Sopenharmony_ci break; 439fb726d48Sopenharmony_ci } 440fb726d48Sopenharmony_ci } 441fb726d48Sopenharmony_ci return sendDataArr; 442fb726d48Sopenharmony_ci } 443fb726d48Sopenharmony_ci deleteUselessFence(presentArr: LtpoStruct[], ltpoDataArr: LtpoStruct[]) { 444fb726d48Sopenharmony_ci //当有present缺失时: 445fb726d48Sopenharmony_ci let presentIndex = 0; 446fb726d48Sopenharmony_ci let fpsIndex = 0; 447fb726d48Sopenharmony_ci while (fpsIndex < ltpoDataArr.length) { 448fb726d48Sopenharmony_ci //遍历present,把ltpoDataArr中不包含present中presentFance的item舍弃掉 449fb726d48Sopenharmony_ci if (presentArr[presentIndex] && ltpoDataArr[fpsIndex]) { 450fb726d48Sopenharmony_ci if (Number(presentArr[presentIndex].presentId) < Number(ltpoDataArr[fpsIndex].fanceId)) { 451fb726d48Sopenharmony_ci presentArr.splice(presentIndex, 1); 452fb726d48Sopenharmony_ci } else if (Number(presentArr[presentIndex].presentId) > Number(ltpoDataArr[fpsIndex].fanceId)) { 453fb726d48Sopenharmony_ci ltpoDataArr.splice(fpsIndex, 1); 454fb726d48Sopenharmony_ci } else { 455fb726d48Sopenharmony_ci if (presentIndex === presentArr.length - 1 && fpsIndex < ltpoDataArr.length - 1) { 456fb726d48Sopenharmony_ci //此时present已经遍历到最后一项,如果ltpoDataArr还没有遍历到最后一项,就把后面的舍弃掉 457fb726d48Sopenharmony_ci ltpoDataArr.splice(fpsIndex); 458fb726d48Sopenharmony_ci } 459fb726d48Sopenharmony_ci presentIndex++; 460fb726d48Sopenharmony_ci fpsIndex++; 461fb726d48Sopenharmony_ci } 462fb726d48Sopenharmony_ci } else { 463fb726d48Sopenharmony_ci return; 464fb726d48Sopenharmony_ci } 465fb726d48Sopenharmony_ci } 466fb726d48Sopenharmony_ci } 467fb726d48Sopenharmony_ci //六舍七入 468fb726d48Sopenharmony_ci specialValue(num: number) { 469fb726d48Sopenharmony_ci if (num < 0.7) { 470fb726d48Sopenharmony_ci return 0; 471fb726d48Sopenharmony_ci } else { 472fb726d48Sopenharmony_ci if (!num.toString().split('.')[1]) { 473fb726d48Sopenharmony_ci return num; 474fb726d48Sopenharmony_ci } else { 475fb726d48Sopenharmony_ci let tempNum = Number(num.toString().split('.')[1].charAt(0)); 476fb726d48Sopenharmony_ci if (tempNum > 6) { 477fb726d48Sopenharmony_ci return Math.ceil(num); 478fb726d48Sopenharmony_ci } else { 479fb726d48Sopenharmony_ci return Math.floor(num); 480fb726d48Sopenharmony_ci } 481fb726d48Sopenharmony_ci } 482fb726d48Sopenharmony_ci } 483fb726d48Sopenharmony_ci } 484fb726d48Sopenharmony_ci 485fb726d48Sopenharmony_ci async initFolder() { 486fb726d48Sopenharmony_ci SpLtpoChart.presentArr = []; 487fb726d48Sopenharmony_ci let row: TraceRow<LtpoStruct> = TraceRow.skeleton<LtpoStruct>(); 488fb726d48Sopenharmony_ci row.rowId = SpLtpoChart.fanceNameList!.length ? `LTPO ${SpLtpoChart.fanceNameList[0].fanceId}` : ''; 489fb726d48Sopenharmony_ci row.rowParentId = ''; 490fb726d48Sopenharmony_ci row.rowType = TraceRow.ROW_TYPE_LTPO; 491fb726d48Sopenharmony_ci row.folder = false; 492fb726d48Sopenharmony_ci row.style.height = '40px'; 493fb726d48Sopenharmony_ci row.name = `Lost Frames`; 494fb726d48Sopenharmony_ci row.favoriteChangeHandler = SpLtpoChart.trace.favoriteChangeHandler; 495fb726d48Sopenharmony_ci row.selectChangeHandler = SpLtpoChart.trace.selectChangeHandler; 496fb726d48Sopenharmony_ci row.supplierFrame = () => { 497fb726d48Sopenharmony_ci return lostFrameSender(SpLtpoChart.threadName, SpLtpoChart.funName, row).then((res) => { 498fb726d48Sopenharmony_ci SpLtpoChart.presentArr = res; 499fb726d48Sopenharmony_ci SpLtpoChart.sendLTPODataArr = this.sendDataHandle(SpLtpoChart.presentArr, SpLtpoChart.ltpoDataArr); 500fb726d48Sopenharmony_ci for (let i = 0; i < SpLtpoChart.sendLTPODataArr.length; i++) { 501fb726d48Sopenharmony_ci let tmpDur = SpLtpoChart.sendLTPODataArr[i].cutSendDur 502fb726d48Sopenharmony_ci ? SpLtpoChart.sendLTPODataArr[i].cutSendDur! / 1000000 503fb726d48Sopenharmony_ci : SpLtpoChart.sendLTPODataArr[i].dur! / 1000000; 504fb726d48Sopenharmony_ci let mathValue = (tmpDur * Number(SpLtpoChart.sendLTPODataArr[i].fps)) / 1000 - 1; 505fb726d48Sopenharmony_ci SpLtpoChart.sendLTPODataArr[i].value = this.specialValue(mathValue); 506fb726d48Sopenharmony_ci } 507fb726d48Sopenharmony_ci return SpLtpoChart.sendLTPODataArr; 508fb726d48Sopenharmony_ci }); 509fb726d48Sopenharmony_ci }; 510fb726d48Sopenharmony_ci row.focusHandler = () => { 511fb726d48Sopenharmony_ci SpLtpoChart.trace?.displayTip( 512fb726d48Sopenharmony_ci row!, 513fb726d48Sopenharmony_ci LtpoStruct.hoverLtpoStruct, 514fb726d48Sopenharmony_ci `<span>${LtpoStruct.hoverLtpoStruct?.value!}</span>` 515fb726d48Sopenharmony_ci ); 516fb726d48Sopenharmony_ci }; 517fb726d48Sopenharmony_ci row.findHoverStruct = (): void => { 518fb726d48Sopenharmony_ci LtpoStruct.hoverLtpoStruct = row.getHoverStruct(true, false, 'value'); 519fb726d48Sopenharmony_ci }; 520fb726d48Sopenharmony_ci row.onThreadHandler = (useCache): void => { 521fb726d48Sopenharmony_ci let context: CanvasRenderingContext2D; 522fb726d48Sopenharmony_ci if (row.currentContext) { 523fb726d48Sopenharmony_ci context = row.currentContext; 524fb726d48Sopenharmony_ci } else { 525fb726d48Sopenharmony_ci context = row.collect ? SpLtpoChart.trace.canvasFavoritePanelCtx! : SpLtpoChart.trace.canvasPanelCtx!; 526fb726d48Sopenharmony_ci } 527fb726d48Sopenharmony_ci row.canvasSave(context); 528fb726d48Sopenharmony_ci (renders['ltpo-present'] as LtpoRender).renderMainThread( 529fb726d48Sopenharmony_ci { 530fb726d48Sopenharmony_ci ltpoContext: context, 531fb726d48Sopenharmony_ci useCache: useCache, 532fb726d48Sopenharmony_ci type: `ltpo-present ${row.rowId}`, 533fb726d48Sopenharmony_ci }, 534fb726d48Sopenharmony_ci row 535fb726d48Sopenharmony_ci ); 536fb726d48Sopenharmony_ci row.canvasRestore(context); 537fb726d48Sopenharmony_ci }; 538fb726d48Sopenharmony_ci SpLtpoChart.trace.rowsEL?.appendChild(row); 539fb726d48Sopenharmony_ci } 540fb726d48Sopenharmony_ci async initHitchTime() { 541fb726d48Sopenharmony_ci SpLtpoChart.presentArr = []; 542fb726d48Sopenharmony_ci let row: TraceRow<HitchTimeStruct> = TraceRow.skeleton<HitchTimeStruct>(); 543fb726d48Sopenharmony_ci this.takeStaticArg(row); 544fb726d48Sopenharmony_ci row.supplierFrame = () => { 545fb726d48Sopenharmony_ci return lostFrameSender(SpLtpoChart.threadName, SpLtpoChart.funName, row).then((res) => { 546fb726d48Sopenharmony_ci SpLtpoChart.presentArr = res; 547fb726d48Sopenharmony_ci SpLtpoChart.sendHitchDataArr = this.sendDataHandle(SpLtpoChart.presentArr, SpLtpoChart.ltpoDataArr); 548fb726d48Sopenharmony_ci for (let i = 0; i < SpLtpoChart.sendHitchDataArr.length; i++) { 549fb726d48Sopenharmony_ci let tmpVale = 0; 550fb726d48Sopenharmony_ci let tmpDur = 0; 551fb726d48Sopenharmony_ci if (SpLtpoChart.sendHitchDataArr[i].cutSendDur) { 552fb726d48Sopenharmony_ci tmpVale = 553fb726d48Sopenharmony_ci SpLtpoChart.sendHitchDataArr[i].cutSendDur! / 1000000 - 1000 / SpLtpoChart.sendHitchDataArr[i].fps!; 554fb726d48Sopenharmony_ci tmpDur = SpLtpoChart.sendHitchDataArr[i].cutSendDur! / 1000000; 555fb726d48Sopenharmony_ci } else { 556fb726d48Sopenharmony_ci tmpVale = SpLtpoChart.sendHitchDataArr[i].dur! / 1000000 - 1000 / SpLtpoChart.sendHitchDataArr[i].fps!; 557fb726d48Sopenharmony_ci tmpDur = SpLtpoChart.sendHitchDataArr[i].dur! / 1000000; 558fb726d48Sopenharmony_ci } 559fb726d48Sopenharmony_ci 560fb726d48Sopenharmony_ci let mathValue = (tmpDur * Number(SpLtpoChart.sendHitchDataArr[i].fps)) / 1000 - 1; 561fb726d48Sopenharmony_ci let finalValue = (tmpVale! / (1000 / SpLtpoChart.sendHitchDataArr[i].fps!)) < 0.7 ? 0 : tmpVale; 562fb726d48Sopenharmony_ci SpLtpoChart.sendHitchDataArr[i].value = Number(finalValue.toFixed(1)); 563fb726d48Sopenharmony_ci SpLtpoChart.sendHitchDataArr[i].name = this.specialValue(mathValue)!.toString(); 564fb726d48Sopenharmony_ci } 565fb726d48Sopenharmony_ci return SpLtpoChart.sendHitchDataArr; 566fb726d48Sopenharmony_ci }); 567fb726d48Sopenharmony_ci }; 568fb726d48Sopenharmony_ci row.focusHandler = () => { 569fb726d48Sopenharmony_ci SpLtpoChart.trace?.displayTip( 570fb726d48Sopenharmony_ci row!, 571fb726d48Sopenharmony_ci HitchTimeStruct.hoverHitchTimeStruct, 572fb726d48Sopenharmony_ci `<span>${HitchTimeStruct.hoverHitchTimeStruct?.value!}</span>` 573fb726d48Sopenharmony_ci ); 574fb726d48Sopenharmony_ci }; 575fb726d48Sopenharmony_ci row.findHoverStruct = (): void => { 576fb726d48Sopenharmony_ci HitchTimeStruct.hoverHitchTimeStruct = row.getHoverStruct(true, false, 'value'); 577fb726d48Sopenharmony_ci }; 578fb726d48Sopenharmony_ci row.onThreadHandler = (useCache): void => { 579fb726d48Sopenharmony_ci let context: CanvasRenderingContext2D; 580fb726d48Sopenharmony_ci if (row.currentContext) { 581fb726d48Sopenharmony_ci context = row.currentContext; 582fb726d48Sopenharmony_ci } else { 583fb726d48Sopenharmony_ci context = row.collect ? SpLtpoChart.trace.canvasFavoritePanelCtx! : SpLtpoChart.trace.canvasPanelCtx!; 584fb726d48Sopenharmony_ci } 585fb726d48Sopenharmony_ci row.canvasSave(context); 586fb726d48Sopenharmony_ci (renders['hitch'] as hitchTimeRender).renderMainThread( 587fb726d48Sopenharmony_ci { 588fb726d48Sopenharmony_ci hitchTimeContext: context, 589fb726d48Sopenharmony_ci useCache: useCache, 590fb726d48Sopenharmony_ci type: `hitch ${row.rowId}`, 591fb726d48Sopenharmony_ci }, 592fb726d48Sopenharmony_ci row 593fb726d48Sopenharmony_ci ); 594fb726d48Sopenharmony_ci row.canvasRestore(context); 595fb726d48Sopenharmony_ci }; 596fb726d48Sopenharmony_ci SpLtpoChart.trace.rowsEL?.appendChild(row); 597fb726d48Sopenharmony_ci } 598fb726d48Sopenharmony_ci takeStaticArg(row: TraceRow<HitchTimeStruct>) { 599fb726d48Sopenharmony_ci row.rowId = SpLtpoChart.fanceNameList!.length ? `hitch-time ${SpLtpoChart.fanceNameList[0].fanceId}` : ''; 600fb726d48Sopenharmony_ci row.rowParentId = ''; 601fb726d48Sopenharmony_ci row.rowType = TraceRow.ROW_TYPE_HITCH_TIME; 602fb726d48Sopenharmony_ci row.folder = false; 603fb726d48Sopenharmony_ci row.style.height = '40px'; 604fb726d48Sopenharmony_ci row.name = `Hitch Time`; 605fb726d48Sopenharmony_ci row.favoriteChangeHandler = SpLtpoChart.trace.favoriteChangeHandler; 606fb726d48Sopenharmony_ci row.selectChangeHandler = SpLtpoChart.trace.selectChangeHandler; 607fb726d48Sopenharmony_ci } 608fb726d48Sopenharmony_ci} 609