cesium-multi-target-framework 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +474 -0
- package/dist/assets/renderWorker-118e8f3b.js +1 -0
- package/dist/cesium-multi-target-framework.js +4605 -0
- package/dist/cesium-multi-target-framework.umd.cjs +101 -0
- package/dist/cluster/QuadCluster.d.ts +66 -0
- package/dist/cluster/clusterClient.d.ts +44 -0
- package/dist/cluster/clusterWorker.d.ts +1 -0
- package/dist/config/types.d.ts +266 -0
- package/dist/core/EventEmitter.d.ts +9 -0
- package/dist/core/MultiTargetFramework.d.ts +184 -0
- package/dist/core/MultiTargetScene.d.ts +224 -0
- package/dist/data/types.d.ts +67 -0
- package/dist/events/bus.d.ts +336 -0
- package/dist/index.d.ts +22 -0
- package/dist/render/AirGroundReferenceRenderer.d.ts +20 -0
- package/dist/render/InstancedGltfBatch.d.ts +37 -0
- package/dist/render/InstancedSymbolRenderer.d.ts +65 -0
- package/dist/render/LowModelInstancedRenderer.d.ts +39 -0
- package/dist/render/ModelPoolRenderer.d.ts +43 -0
- package/dist/render/PointCloudRenderer.d.ts +135 -0
- package/dist/render/SelectionOverlayRenderer.d.ts +37 -0
- package/dist/render/targetVisualMetrics.d.ts +9 -0
- package/dist/site/SiteLayer.d.ts +43 -0
- package/dist/site/SiteLowModelRenderer.d.ts +12 -0
- package/dist/site/SiteSpatialIndex.d.ts +10 -0
- package/dist/site/types.d.ts +72 -0
- package/dist/track/TrackHoverPicker.d.ts +26 -0
- package/dist/track/TrackManager.d.ts +42 -0
- package/dist/track/TrackRenderer.d.ts +29 -0
- package/dist/track/types.d.ts +27 -0
- package/dist/worker/protocol.d.ts +182 -0
- package/dist/worker/renderWorker.d.ts +1 -0
- package/doc//345/244/232/347/233/256/346/240/207/344/274/230/345/214/226/344/270/216/351/242/204/346/265/213/346/270/262/346/237/223/350/257/264/346/230/216.md +186 -0
- package/doc//345/244/232/347/273/204/344/273/266/344/272/213/344/273/266/346/226/271/346/241/210.md +410 -0
- package/doc//345/257/271/345/244/226/346/216/245/345/217/243/350/257/264/346/230/216.md +519 -0
- package/doc//345/267/245/344/275/234/350/256/241/345/210/222.md +59 -0
- package/doc//346/270/262/346/237/223/344/270/232/345/212/241/351/200/273/350/276/221.md +202 -0
- package/doc//347/253/231/347/202/271/346/270/262/346/237/223/344/270/216/345/217/263/351/224/256/350/217/234/345/215/225/345/256/236/347/216/260/350/257/264/346/230/216.md +49 -0
- package/doc//350/247/206/345/217/243/351/251/261/345/212/250/346/225/260/346/215/256/346/265/201/347/250/213/344/277/256/346/224/271/350/256/241/345/210/222.md +69 -0
- package/doc//351/241/271/347/233/256/350/257/264/346/230/216/344/271/246.md +729 -0
- package/package.json +51 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# 渲染业务逻辑
|
|
2
|
+
|
|
3
|
+
本文档记录当前目标渲染链路,用于排查点模式、低模模式、高模模式、视口裁剪、合并、统计口径之间的关系。
|
|
4
|
+
|
|
5
|
+
## 总体流程
|
|
6
|
+
|
|
7
|
+
1. 主线程接收目标数据,写入 `MultiTargetScene`。
|
|
8
|
+
2. `MultiTargetScene` 根据相机视口、相机高度、配置项向 worker 请求当前渲染 packet。
|
|
9
|
+
3. worker 根据视口、缓冲区、合并层级、距离裁剪和最大渲染上限选出一批渲染项。
|
|
10
|
+
4. worker 给每个渲染项写入 LOD 标记:点、低模或高模。
|
|
11
|
+
5. 主线程收到 packet 后分发给三条渲染链路:
|
|
12
|
+
- `ModelPoolRenderer`:渲染低模和高模模型。
|
|
13
|
+
- `PointCloudRenderer`:渲染点图标、发光效果、姓名版。
|
|
14
|
+
- `SelectionOverlayRenderer` / `TrackManager`:渲染选中态和轨迹相关效果。
|
|
15
|
+
|
|
16
|
+
## LOD 切换规则
|
|
17
|
+
|
|
18
|
+
当前基础 LOD 由相机高度决定:
|
|
19
|
+
|
|
20
|
+
| 条件 | 基础模式 |
|
|
21
|
+
| --- | --- |
|
|
22
|
+
| `cameraHeight > lod.pointAbove` | 点模式 |
|
|
23
|
+
| `lod.animatedBelow < cameraHeight <= lod.pointAbove` | 低模模式 |
|
|
24
|
+
| `cameraHeight <= lod.animatedBelow` | 高模模式 |
|
|
25
|
+
|
|
26
|
+
demo 当前配置大致是:
|
|
27
|
+
|
|
28
|
+
| 配置 | 值 | 含义 |
|
|
29
|
+
| --- | --- | --- |
|
|
30
|
+
| `pointAbove` | `150_000` | 高于 150km 使用点模式 |
|
|
31
|
+
| `animatedBelow` | `10_000` | 低于等于 10km 使用高模模式 |
|
|
32
|
+
|
|
33
|
+
因此相机高度 14.9km 时,基础模式应该是低模模式。
|
|
34
|
+
|
|
35
|
+
## 强制高模规则
|
|
36
|
+
|
|
37
|
+
低模模式下,部分目标类型可以强制使用高模。
|
|
38
|
+
|
|
39
|
+
规则在 worker 的 `lodKindForCategory` 中:
|
|
40
|
+
|
|
41
|
+
```ts
|
|
42
|
+
if (baseLodKind !== 1) return baseLodKind;
|
|
43
|
+
return cfg?.forceHighModelInLowLod ? 2 : 1;
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
也就是说:
|
|
47
|
+
|
|
48
|
+
| 基础模式 | `forceHighModelInLowLod` | 最终渲染 |
|
|
49
|
+
| --- | --- | --- |
|
|
50
|
+
| 点模式 | 任意 | 点 |
|
|
51
|
+
| 低模模式 | `false` | 低模 |
|
|
52
|
+
| 低模模式 | `true` | 高模 |
|
|
53
|
+
| 高模模式 | 任意 | 高模 |
|
|
54
|
+
|
|
55
|
+
配置解析时,空中目标默认会开启 `forceHighModelInLowLod`。所以在 14.9km 低模阶段看到少量高模是合理的,例如低空目标、无人机等。
|
|
56
|
+
|
|
57
|
+
## 视口与缓冲区
|
|
58
|
+
|
|
59
|
+
worker 会同时选择两类渲染项:
|
|
60
|
+
|
|
61
|
+
| 类型 | 来源 | 标记 | 目的 |
|
|
62
|
+
| --- | --- | --- | --- |
|
|
63
|
+
| 视口内项 | 当前视口范围内 | `FLAG_IN_VIEWPORT` | 主要可见目标 |
|
|
64
|
+
| 缓冲区项 | 扩展视口范围内但不在视口内 | 无 `FLAG_IN_VIEWPORT` | 减少移动、缩放时边缘空白 |
|
|
65
|
+
|
|
66
|
+
当前 packet 中会同时包含视口内项和缓冲区项。左上角的“视野内目标”和“缓冲区目标”来自 worker 对原始数据范围的统计;packet 的实际长度可能更大,因为还会受到合并层级、内外预算、全局缓存等影响。
|
|
67
|
+
|
|
68
|
+
## 模型渲染规则
|
|
69
|
+
|
|
70
|
+
`ModelPoolRenderer` 不会直接渲染 packet 里的所有模型 LOD 项,它还会做二次过滤:
|
|
71
|
+
|
|
72
|
+
1. 跳过点模式项。
|
|
73
|
+
2. 跳过合并簇。
|
|
74
|
+
3. 跳过没有 `FLAG_IN_VIEWPORT` 的项。
|
|
75
|
+
4. 跳过没有模型资源配置的项。
|
|
76
|
+
5. 再分别按低模池和高模池容量截断。
|
|
77
|
+
|
|
78
|
+
因此当前结论是:
|
|
79
|
+
|
|
80
|
+
**视口外/缓冲区目标不会实际渲染成低模或高模模型。**
|
|
81
|
+
|
|
82
|
+
如果面板上看到低模或高模数量,这个数量应该来自模型渲染器实际接收并通过过滤后的候选项。
|
|
83
|
+
|
|
84
|
+
## 点渲染规则
|
|
85
|
+
|
|
86
|
+
`PointCloudRenderer` 当前会接收 packet 全量项,包括视口内项和缓冲区项。
|
|
87
|
+
|
|
88
|
+
在模型模式下,点和模型之间有 handoff 逻辑:
|
|
89
|
+
|
|
90
|
+
1. `ModelPoolRenderer.setPacket()` 返回实际进入模型渲染的目标 id。
|
|
91
|
+
2. `PointCloudRenderer.setModelTargetIds()` 记录这些模型目标。
|
|
92
|
+
3. 点渲染器仍然创建或更新对应点 billboard,但如果目标已经由模型渲染,会把该点逐步缩放到接近 0。
|
|
93
|
+
|
|
94
|
+
这意味着:
|
|
95
|
+
|
|
96
|
+
- 进入模型渲染的视口内目标,点会被隐藏或缩小。
|
|
97
|
+
- 没有进入模型渲染的 packet 项,仍然会以点形式存在。
|
|
98
|
+
- 缓冲区项目前不会被模型渲染,但仍可能作为点渲染。
|
|
99
|
+
|
|
100
|
+
所以如果出现“视野内目标 136,但实际渲染点 4000”的情况,主要原因不是低模视口外渲染,而是点渲染器仍在消费 packet 中的大量非模型项或缓冲项。
|
|
101
|
+
|
|
102
|
+
## 合并规则
|
|
103
|
+
|
|
104
|
+
合并发生在 worker 侧,输出的合并簇会表现为 `count > 1` 的渲染项,并写入 `FLAG_MERGED`。
|
|
105
|
+
|
|
106
|
+
当前模型渲染器会跳过所有合并簇,所以:
|
|
107
|
+
|
|
108
|
+
- 合并簇不会渲染低模。
|
|
109
|
+
- 合并簇不会渲染高模。
|
|
110
|
+
- 合并簇主要由点渲染器表现。
|
|
111
|
+
|
|
112
|
+
当相机高度较低、视口内数量未超过上限时,合并可能不触发,此时面板会显示“未触发”或合并数量为 0。
|
|
113
|
+
|
|
114
|
+
## 统计口径
|
|
115
|
+
|
|
116
|
+
当前左上角面板里的统计需要区分两个口径:
|
|
117
|
+
|
|
118
|
+
| 统计 | 含义 |
|
|
119
|
+
| --- | --- |
|
|
120
|
+
| `视野内目标` | worker 对当前视口范围内原始目标的统计 |
|
|
121
|
+
| `缓冲区目标` | worker 对扩展视口范围内原始目标的统计 |
|
|
122
|
+
| `实际渲染` | 当前 packet 内渲染项数量,可能包含视口内、缓冲区、合并层级结果 |
|
|
123
|
+
| `LOD统计 点` | 点渲染器口径下仍作为点存在的数量 |
|
|
124
|
+
| `LOD统计 低模` | 模型渲染器实际进入低模渲染队列的数量 |
|
|
125
|
+
| `LOD统计 高模` | 模型渲染器实际进入高模渲染队列的数量 |
|
|
126
|
+
| `合并` | 当前实际合并渲染项数量 |
|
|
127
|
+
|
|
128
|
+
需要注意:worker 侧的 LOD 统计是“计划口径”,模型渲染器侧的 LOD 统计是“实际模型渲染口径”。面板应该优先展示实际口径,避免把被模型渲染器过滤掉的项误认为已经渲染。
|
|
129
|
+
|
|
130
|
+
## 对当前打印的解释
|
|
131
|
+
|
|
132
|
+
示例:
|
|
133
|
+
|
|
134
|
+
```text
|
|
135
|
+
目标总数:50000(船舶 49000 / 低空 1000)
|
|
136
|
+
视野内目标:136 · 缓冲区目标:89 · 实际渲染:4225(上限 10000)
|
|
137
|
+
相机高度:14.9 km · 当前渲染:低模合批
|
|
138
|
+
LOD统计:实际渲染 点 4000 / 低模 218 / 高模 7
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
解释:
|
|
142
|
+
|
|
143
|
+
1. 14.9km 小于 25km 且大于 5km,所以基础 LOD 是低模。
|
|
144
|
+
2. 高模 7 个来自低空目标或其他开启 `forceHighModelInLowLod` 的类型,这是预期行为。
|
|
145
|
+
3. 低模 218 个是模型渲染器实际通过视口内、非合并、有模型资源等过滤后的数量。
|
|
146
|
+
4. 点 4000 个说明 packet 中仍有大量目标没有进入模型渲染,点渲染器仍然在渲染它们。
|
|
147
|
+
5. 这不是“视口外低模渲染很多”,而是“低模模式下仍保留了大量点渲染项”。
|
|
148
|
+
|
|
149
|
+
## 当前结论
|
|
150
|
+
|
|
151
|
+
1. 高度 LOD 判断本身没有明显错误。
|
|
152
|
+
2. 低模阶段出现少量高模,是由低空目标强制高模规则导致,符合当前配置。
|
|
153
|
+
3. 模型渲染器已经过滤视口外项,视口外目标不会实际渲染成低模或高模。
|
|
154
|
+
4. 低模阶段仍然渲染大量点,是当前点渲染器消费 packet 全量项导致。
|
|
155
|
+
5. 如果目标是“低模阶段只渲染近距离/视口内必要目标”,下一步应重点调整 packet 选择策略或点渲染器过滤策略,而不是模型渲染器。
|
|
156
|
+
|
|
157
|
+
## 后续可优化方向
|
|
158
|
+
|
|
159
|
+
### 方案一:低模/高模阶段限制点渲染范围
|
|
160
|
+
|
|
161
|
+
在 `PointCloudRenderer` 中按 LOD 和 `FLAG_IN_VIEWPORT` 过滤点:
|
|
162
|
+
|
|
163
|
+
- 模型模式下只渲染视口内点。
|
|
164
|
+
- 或者只保留缓冲区中少量点,避免边缘空白。
|
|
165
|
+
- 对已经进入模型渲染的目标继续使用 handoff 缩放隐藏。
|
|
166
|
+
|
|
167
|
+
优点:实现直接,能快速降低点数量。
|
|
168
|
+
|
|
169
|
+
风险:相机移动、缩放时边缘可能更容易出现短暂空白。
|
|
170
|
+
|
|
171
|
+
### 方案二:worker 侧在低模/高模阶段减少 outer budget
|
|
172
|
+
|
|
173
|
+
在低模/高模阶段降低或关闭缓冲区项预算:
|
|
174
|
+
|
|
175
|
+
- 点模式保留较大缓冲。
|
|
176
|
+
- 低模模式减少缓冲。
|
|
177
|
+
- 高模模式进一步减少缓冲。
|
|
178
|
+
|
|
179
|
+
优点:从源头减少 packet 数量,主线程压力更低。
|
|
180
|
+
|
|
181
|
+
风险:需要重新评估移动体验和边缘补偿。
|
|
182
|
+
|
|
183
|
+
### 方案三:按距离或屏幕尺寸决定点/低模/高模
|
|
184
|
+
|
|
185
|
+
当前 LOD 是全局相机高度驱动。后续可以改为:
|
|
186
|
+
|
|
187
|
+
- 近距离:高模。
|
|
188
|
+
- 中距离:低模。
|
|
189
|
+
- 远距离:点。
|
|
190
|
+
- 超远距离:不进入 packet。
|
|
191
|
+
|
|
192
|
+
优点:更符合真实可见性和性能预期。
|
|
193
|
+
|
|
194
|
+
风险:改动更大,需要统一统计、拾取、姓名版、轨迹、动画 handoff 的口径。
|
|
195
|
+
|
|
196
|
+
### 推荐下一步
|
|
197
|
+
|
|
198
|
+
如果当前主要问题是低模阶段点数量过多,建议优先做“方案二 + 小范围方案一”:
|
|
199
|
+
|
|
200
|
+
1. 先让 worker 在低模/高模阶段降低缓冲区预算。
|
|
201
|
+
2. 再让点渲染器在模型模式下只保留视口内点或有限缓冲点。
|
|
202
|
+
3. 面板统计拆分为“视口内实际渲染”和“含缓冲实际渲染”,方便继续排查。
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# 站点渲染与右键菜单实现说明
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
本次在多目标框架内接入两个独立能力:
|
|
6
|
+
|
|
7
|
+
- `SiteLayer`:用于渲染光电站、雷达站、AIS 站等站点数据,只提供图标和低模渲染,不参与目标预测、高模动画和目标聚合。
|
|
8
|
+
- 右键菜单:由框架统一创建 DOM 菜单,业务通过 `registerContextMenuItem` 注册菜单项,支持按目标类型、空地等上下文控制显示。
|
|
9
|
+
|
|
10
|
+
## 站点渲染
|
|
11
|
+
|
|
12
|
+
- 新增 `src/site/*`:
|
|
13
|
+
- `SiteLayer` 负责站点数据入口、视口筛选、LOD 切换和统计。
|
|
14
|
+
- `SiteSpatialIndex` 使用经纬度网格索引,只查询当前视口内站点,避免全量遍历。
|
|
15
|
+
- `SiteIconRenderer` 使用 Cesium `BillboardCollection` 渲染图标。
|
|
16
|
+
- `SiteLowModelRenderer` 复用现有 `LowModelInstancedRenderer` 渲染低模。
|
|
17
|
+
- 站点类型通过 `SiteTypeConfig` 注册:
|
|
18
|
+
- `type`、`category`、`iconPath` 必填。
|
|
19
|
+
- `lowModel` 可选;未配置低模的站点在低模高度下仍显示图标。
|
|
20
|
+
- 渲染策略:
|
|
21
|
+
- 相机高度高于 `modelSwitchHeight`:只渲染图标。
|
|
22
|
+
- 相机高度低于/等于 `modelSwitchHeight`:视口内可用低模的站点进入低模,数量受 `maxVisibleLowModels` 限制,其余继续显示图标。
|
|
23
|
+
- 站点只筛选视口内目标,不使用预测、回滚、聚合簇。
|
|
24
|
+
- demo 中创建了 720 个 mock 站点,并在面板展示 `siteLayer.stats`。
|
|
25
|
+
|
|
26
|
+
## 右键菜单
|
|
27
|
+
|
|
28
|
+
- `MultiTargetScene` 新增 `contextmenu` 事件:
|
|
29
|
+
- 右键目标时输出 `kind: "target"`,包含目标快照和当前渲染坐标。
|
|
30
|
+
- 右键空地时输出 `kind: "ground"`,包含经纬高。
|
|
31
|
+
- `MultiTargetFramework` 新增:
|
|
32
|
+
- `registerContextMenuItem(item): () => void`
|
|
33
|
+
- `showContextMenu(ctx): Promise<void>`
|
|
34
|
+
- `closeContextMenu(): void`
|
|
35
|
+
- 菜单项参数:
|
|
36
|
+
- `key`:唯一标识。
|
|
37
|
+
- `label`:菜单文案。
|
|
38
|
+
- `targetKinds`:可选,默认 `["target"]`。
|
|
39
|
+
- `visible(ctx)`:可选,返回 `false` 时本次右键不显示。
|
|
40
|
+
- `onClick(ctx)`:点击回调,执行前菜单会自动关闭。
|
|
41
|
+
- DOM 由框架创建,白底黑字、8px 圆角、固定定位,会自动避免溢出窗口;点击外部或按 Escape 会关闭。
|
|
42
|
+
- `SiteLayer` 会在右键站点时发出 `contextmenu` 事件,demo 通过 `showContextMenu` 转成统一菜单。
|
|
43
|
+
- `showContextMenu` 是给后续其他组件使用的扩展口子:组件只需要构造 `ContextMenuContext`,即可复用框架统一 DOM 菜单和注册项筛选逻辑。
|
|
44
|
+
|
|
45
|
+
## Verification
|
|
46
|
+
|
|
47
|
+
- `npm run typecheck`
|
|
48
|
+
- `npm run build:demo`
|
|
49
|
+
- `git diff --check`
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# 视口驱动数据流程修改计划
|
|
2
|
+
|
|
3
|
+
## 当前结论
|
|
4
|
+
|
|
5
|
+
项目主链路现在是“外部高频输入先收集,按周期提交总数据;视口变化即时重整渲染集合”:
|
|
6
|
+
|
|
7
|
+
1. 外部通过 `setData` / `applyIncremental` 高频推送全量或增量目标。
|
|
8
|
+
2. `DataManager` 在入口层合并同一周期内的变化,同一 id 只保留最新状态。
|
|
9
|
+
3. 到达 `data.commitIntervalMs` 后,`DataManager` 把本批数据提交给 Web Worker,由 Worker 统一归一化并生成一次 diff。
|
|
10
|
+
4. `NodeManager` 消费 diff,维护总数据节点与分桶索引。
|
|
11
|
+
5. 每次视口变化后,基于当前视口和已提交总数据整理命中桶、聚合并生成 `RenderItem`。
|
|
12
|
+
|
|
13
|
+
也就是说,数据总整理和视口整理是两个节奏:数据默认 2 秒一批,视口变化则即时整理渲染集合。
|
|
14
|
+
|
|
15
|
+
## 已处理
|
|
16
|
+
|
|
17
|
+
1. 新增 `data.commitIntervalMs`,默认 2000ms;设为 0 可恢复为每次写入立即提交。
|
|
18
|
+
2. 新增 `data.leading`,默认 true;第一批数据立即提交,避免初始化空等一个周期。
|
|
19
|
+
3. 新增 `data.worker`,默认 true;周期性总数据归一化与 diff 由 Web Worker 完成。
|
|
20
|
+
4. `DataManager` 改为先收集、合并,再按周期提交 diff;Worker 忙时继续累计入口数据,不丢批次。
|
|
21
|
+
5. 视口状态从 reindex 轮次中拆出,改为每帧基于当前相机刷新。
|
|
22
|
+
6. 相机稳定判定同时检查位置、朝向和 up 向量,避免原地旋转/俯仰时视口变化却不重整。
|
|
23
|
+
7. 新增 `mergeDirty` 标记,视口、数据、分帧摄入、桶索引任一变化都会触发显示集合重整。
|
|
24
|
+
8. 重整条件改为“有脏标记且相机稳定”,不再强依赖完整 reindex 一轮完成。
|
|
25
|
+
|
|
26
|
+
调整后的内部链路:
|
|
27
|
+
|
|
28
|
+
```text
|
|
29
|
+
外部高频数据 -> DataManager 收集/合并 -> 每 2s 提交 Worker -> 生成 diff -> NodeManager 入桶
|
|
30
|
+
|
|
|
31
|
+
当前视口变化 ---------------------------------------------------------------+-> 整理命中桶/聚合 -> 渲染
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
配置示例:
|
|
35
|
+
|
|
36
|
+
```ts
|
|
37
|
+
const scene = createMultiTargetScene(viewer, {
|
|
38
|
+
nodeTypes,
|
|
39
|
+
data: {
|
|
40
|
+
commitIntervalMs: 2000,
|
|
41
|
+
leading: true,
|
|
42
|
+
worker: true,
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## 后续建议
|
|
48
|
+
|
|
49
|
+
如果后续要做到“视口变换 -> 向服务端重新获取视口数据”,建议再增加一个可选数据源接口:
|
|
50
|
+
|
|
51
|
+
```ts
|
|
52
|
+
interface ViewportDataSource {
|
|
53
|
+
load(bounds: ViewportBounds, signal: AbortSignal): Promise<IncrementalPayload | TargetData[]>;
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
接入位置建议放在 `MultiTargetScene`:
|
|
58
|
+
|
|
59
|
+
1. `NodeManager` 暴露当前视口 bounds 和版本号。
|
|
60
|
+
2. `MultiTargetScene` 监听相机稳定后的视口版本变化。
|
|
61
|
+
3. 发起 `dataSource.load(bounds, signal)`,新视口请求采用 last-wins,取消旧请求。
|
|
62
|
+
4. 返回全量视口数据时调用 `setData`,返回增量时调用 `applyIncremental`。
|
|
63
|
+
5. 给视口 bounds 增加缓冲和最小变化阈值,避免拖拽时频繁打接口。
|
|
64
|
+
|
|
65
|
+
优先级建议:
|
|
66
|
+
|
|
67
|
+
1. 先稳定当前内部视口重整逻辑。
|
|
68
|
+
2. 再设计 `ViewportDataSource` 的 API 和请求取消策略。
|
|
69
|
+
3. 最后根据后端协议决定是“视口全量替换”还是“视口增量合并”。
|