性能优化:Cesium 懒加载+后台预载、按需渲染、射线检测节流、城市标签 primitive 化、时间轴纹理跟随可视区域

- Cesium 改为动态加载(vite 插件不再注入 6MB 脚本),首屏零 Cesium 请求
- 首帧渲染后后台预载地理视图,loading 展示 8 秒期间并行,就绪前地理按钮置灰
- Three.js 按需渲染:静止停止重绘,动画/交互/状态变化时渲染
- 射线检测合帧节流,binder 只测当前页±1、时间轴只测可视窗口
- 移除 vignette 的 mix-blend-mode 全屏合成
- 7342 个城市从 entity 改为 PointPrimitiveCollection + LabelCollection
- 时间轴懒加载窗口跟随可视区域(拖拽/缩放实时跟随)
This commit is contained in:
2026-09-19 03:21:27 +08:00
parent 0c7990a9a8
commit f701862e5a
8 changed files with 175 additions and 32 deletions
+11 -10
View File
@@ -9,15 +9,16 @@ for (const ev of ['copy', 'cut', 'contextmenu']) {
const app = new App();
window.__app = app; // 便于调试
// 加载界面:等三个视图初始化完成(最少展示 1 秒,最多等 8 秒)后淡出
// 加载界面:等首帧渲染后立即后台预载地理视图(与 loading 并行,不等其淡出);
// loading 最少展示 3 秒(期间 Cesium 预载已同步进行)。
const t0 = Date.now();
const MIN_DISPLAY = 1000;
Promise.race([
app.globe.ready,
new Promise((r) => setTimeout(r, 8000)),
]).then(() => {
const wait = Math.max(0, MIN_DISPLAY - (Date.now() - t0));
setTimeout(() => {
document.getElementById('loading').classList.add('hidden');
}, wait);
const MIN_DISPLAY = 8000;
requestAnimationFrame(() => {
requestAnimationFrame(() => {
app.preloadGlobe(); // 首帧已渲染,立即预载地理界面
const wait = Math.max(0, MIN_DISPLAY - (Date.now() - t0));
setTimeout(() => {
document.getElementById('loading').classList.add('hidden');
}, wait);
});
});