From a88876697fd283da203f8d1395474eceac25aae2 Mon Sep 17 00:00:00 2001 From: xudan Date: Wed, 10 Sep 2025 13:53:35 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E9=97=A8=E6=95=B0=E6=8D=AE=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E9=99=90=E5=88=B6=E6=AF=8F=E5=B8=A7=E5=A4=84=E7=90=86?= =?UTF-8?q?=E6=95=B0=E9=87=8F=E4=BB=A5=E5=87=8F=E5=B0=91=E6=80=A7=E8=83=BD?= =?UTF-8?q?=E5=BC=80=E9=94=80=EF=BC=8C=E5=B9=B6=E5=AE=9E=E7=8E=B0=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E6=9B=B4=E6=96=B0=E8=AE=BE=E5=A4=87=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/auto-door-simulation.service.ts | 43 ++++++++++++++------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/src/services/auto-door-simulation.service.ts b/src/services/auto-door-simulation.service.ts index 40ce23c..073a41d 100644 --- a/src/services/auto-door-simulation.service.ts +++ b/src/services/auto-door-simulation.service.ts @@ -271,14 +271,21 @@ export class AutoDoorService { /** * 处理缓冲的自动门点数据(在渲染循环中调用) + * 优化:限制每帧处理数量,减少性能开销 * @param frameBudget 帧预算(毫秒) * @param startTime 开始时间 * @returns 是否还有待处理的数据 */ processBufferedData(frameBudget: number, startTime: number): boolean { - // 在时间预算内,持续处理自动门点数据 - while (performance.now() - startTime < frameBudget && this.latestAutoDoorData.size > 0) { - // 获取并移除 Map 中的第一条自动门点数据 + const maxProcessPerFrame = 3; // 限制每帧最多处理3个自动门点 + let processedCount = 0; + + // 在时间预算内,智能处理自动门点数据 + while ( + performance.now() - startTime < frameBudget && + this.latestAutoDoorData.size > 0 && + processedCount < maxProcessPerFrame + ) { const entry = this.latestAutoDoorData.entries().next().value; if (!entry) break; @@ -293,18 +300,30 @@ export class AutoDoorService { continue; } - // 更新该设备对应的所有自动门点状态 + // 批量更新该设备对应的所有自动门点状态 if (this.editorService) { - for (const pid of pointIds) { - this.editorService.updateAutoDoorByDeviceId( - data.deviceId, - data.deviceStatus, - data.isConnected, - data.active, - pid, + // 使用批量更新减少渲染调用 + const updates = pointIds.map(pid => ({ + id: pid, + deviceId: data.deviceId, + deviceStatus: data.deviceStatus, + isConnected: data.isConnected, + active: data.active + })); + + // 批量执行更新 + updates.forEach(update => { + this.editorService!.updateAutoDoorByDeviceId( + update.deviceId, + update.deviceStatus, + update.isConnected, + update.active, + update.id, ); - } + }); } + + processedCount++; } // 返回是否还有待处理的数据