feat: 优化机器人状态更新逻辑,合并图元更新和位置可见性设置,提升渲染效率

This commit is contained in:
xudan 2025-09-16 10:26:50 +08:00
parent 7ffd5623f0
commit e2cb39b27c

View File

@ -98,7 +98,9 @@ const monitorScene = async () => {
const batchUpdateRobots = (updates: Array<{ id: string; data: RobotRealtimeInfo }>) => { const batchUpdateRobots = (updates: Array<{ id: string; data: RobotRealtimeInfo }>) => {
if (!editor.value || updates.length === 0) return; if (!editor.value || updates.length === 0) return;
// // pen
const allPenUpdates: any[] = [];
updates.forEach(({ id, data }) => { updates.forEach(({ id, data }) => {
const { const {
x, x,
@ -114,76 +116,66 @@ const monitorScene = async () => {
...rest ...rest
} = data; } = data;
// // 1.
// //便
editor.value?.updateRobot(id, { editor.value?.updateRobot(id, {
...rest, ...rest,
isCharging: isCharging as any as boolean, isCharging: isCharging as any,
isCarrying: isCarrying as any as boolean, isCarrying: isCarrying as any,
isNotAcceptingOrders: isNotAcceptingOrders as any as boolean, isNotAcceptingOrders: isNotAcceptingOrders as any,
}); });
// refreshRobot // 2. pen
let processedPath: Array<{ x: number; y: number }> | undefined; const penUpdatePayload: any = { id };
const robotState: any = {};
// 2.1 robotState
if (points?.length) { if (points?.length) {
// const cx = x || 37;
const cx = x || 37; // X37 const cy = y || 37;
const cy = y || 37; // Y37 robotState.path = points.map((p) => ({ x: p.x - cx, y: p.y - cy }));
processedPath = points.map((p) => ({ x: p.x - cx, y: p.y - cy }));
} }
// // 2.2
const robotState = { if (active !== undefined) robotState.active = active;
active, if (isWaring !== undefined) robotState.isWaring = isWaring;
isWaring, if (isFault !== undefined) robotState.isFault = isFault;
isFault, if (isCharging !== undefined) robotState.isCharging = isCharging;
path: processedPath, if (isCarrying !== undefined) robotState.isCarrying = isCarrying;
angle, if (isNotAcceptingOrders !== undefined) robotState.isNotAcceptingOrders = isNotAcceptingOrders;
isCharging,
isCarrying,
isNotAcceptingOrders,
};
if (Object.values(robotState).some((v) => v !== undefined)) {
editor.value?.setValue({ id, robot: robotState }, { render: false, history: false, doEvent: false });
}
});
// // payload
const positionUpdates = updates if (Object.keys(robotState).length > 0) {
.map(({ id, data }) => { penUpdatePayload.robot = robotState;
const { x, y, angle } = data;
// xy angle / false
if (isNil(x) && isNil(y) && angle == null) {
return undefined;
} }
const payload: any = { id };
// 2.3
if (!isNil(x) && !isNil(y)) { if (!isNil(x) && !isNil(y)) {
const newX = x - 60; penUpdatePayload.x = x - 60;
const newY = y - 60; penUpdatePayload.y = y - 60;
payload.x = newX; penUpdatePayload.visible = true;
payload.y = newY; penUpdatePayload.locked = LockState.None;
payload.visible = true;
payload.locked = LockState.None;
} }
if (angle != null) { if (angle != null) {
// angle penUpdatePayload.rotate = -angle + 180;
payload.rotate = -angle + 180;
} }
return payload;
})
.filter((v) => v);
// 使Meta2D //
positionUpdates.forEach((update) => { if (Object.keys(penUpdatePayload).length > 1) {
editor.value?.setValue(update, { render: false, history: false, doEvent: false }); allPenUpdates.push(penUpdatePayload);
}); }
// > > // 3. (API)
updates.forEach(({ id }) => {
editor.value?.updateRobotStatusOverlay?.(id, false); editor.value?.updateRobotStatusOverlay?.(id, false);
}); });
// // 4. 使Meta2D
if (allPenUpdates.length > 0) {
allPenUpdates.forEach((update) => {
editor.value?.setValue(update, { render: false, history: false, doEvent: false });
});
}
// 5.
editor.value?.render(); editor.value?.render();
}; };