Ir al contenido
Todos los proyectos

Caso de estudio 01 / 21JS Front-End

Mapas 3D sin conexión por cliente, recortados al corredor del ducto

El build de cada cliente lleva solo sus mapas 3D, recortados al corredor de cada línea: de 17.1 GB a 45 MB para un cliente con dos sistemas.

Stack

  • CesiumJS
  • WebGL
  • Leaflet
  • nginx
  • Node.js
  • Next.js
  • TypeScript
  • WebP

01 · Cómo funciona

  • HoyaModificado en este trabajo
  • Flujo de datos

Qué hace

Los mapas 3D en vivo con los que los operadores siguen alarmas y fugas funcionan sin conexión en los sitios de los clientes, en equipos modestos con unos 8 GB de RAM y solo un navegador. Rehice cómo se empaquetan y cómo arrancan: el build de cada cliente lleva solo sus sistemas, recortados al corredor de cada línea; cada fila del tablero muestra su mapa como imagen antes de que el 3D esté listo, y un sistema cuyo mapa era solo un dibujo ganó las mismas funciones en vivo que los demás.

6 conexiones· elige un componente para ver su recorrido
  1. Perfil del cliente a Build por cliente: lista sus sistemas
  2. Build por cliente a Paquete sin conexión: sus mapas y el corredor
  3. Paquete sin conexión a Fila del tablero: imagen de inicio enseguidamodificado
  4. Paquete sin conexión a Motor de mapas 3D: terreno y teselas de suelo
  5. Motor de mapas 3D a Fila del tablero: entra el 3D en vivo
  6. Fila del tablero a Operador: imagen y luego mapa vivo

02Resultados

  • R01Cuanto más bajo, mejor

    Datos de mapas enviados a un cliente con dos sistemas

    Antes 17,132 MB, después 45 MB, 381× menor. Cuanto más bajo, mejor.
    Antes
    Después
  • R02Cuanto más bajo, mejor

    Tablero, primera visita: imagen del mapa en cada fila

    Antes 9.3 s, después 2.5 s, 3.7× menor. Cuanto más bajo, mejor.
    Antes
    Después
  • R03Cuanto más alto, mejor

    Funciones en vivo del mapa que era solo un dibujo (de 8)

    Antes 0, después 8, desde 0. Cuanto más alto, mejor.
    Antes
    Después

Qué logró

  • Datos de mapas para un cliente con dos sistemas: 17.1 GB, todos los mapas para todos los clientes → 45 MB: sus propios mapas y estilo de suelo, con el terreno recortado a sus corredores
  • Clientes sin mapas: 17.1 GB de teselas → ninguna; la app muestra solo el gráfico y la página de salud marca gris, nunca rojo
  • El mapa que era solo un dibujo: 0 de 8 funciones en vivo → 8 de 8, sobre todo con datos y configuración, sin ningún nombre de sistema en el código
  • Estilos de suelo: foto y mapas de calles → dos más, curvas de nivel y relieve, en claro y oscuro en todos los mapas, con 0 cambios en lo que se dibuja encima
Leer más
  • Tablero en la primera visita: el cuarto mapa en pantalla a los 9.3 s → una imagen de inicio en cada fila a los 2.5 s, generada en el build, sobre la que entra el 3D en vivo con un fundido
  • Filas del tablero en 2D, probadas en A/B y guardadas en una rama aparte (el 3D sigue por defecto): 2.3–2.7 s de espera por los programas de la GPU → 0, la última fila en vivo un 86–93 % antes, 94 % menos peticiones de mapa

El desafío

Cada instalación recibía los 19 juegos de teselas de mapas, 17.1 GB, aunque sus sistemas estuvieran en una sola región, y el 40 % cubría regiones sin ningún sistema. Dentro de la carpeta de cada mapa, una copia del terreno base del mundo entero pesaba más que el terreno propio del mapa. Con cualquier estilo de suelo, un mapa sin conexión ocupaba 1.3–1.9 GB de RAM del navegador, casi la mitad en memoria de GPU.

Leer más

En el tablero los mapas arrancaban uno detrás de otro: en una primera visita el cuarto aparecía a los 9.3 s, con el hilo principal ocupado 8.3 s, de los cuales 2.4 s se iban en esperar a que la GPU compilara sus programas de sombreado. Y el mapa de un sistema era solo un dibujo de color fijo, sin ninguna de las 8 funciones en vivo de los demás mapas, aunque el backend ya consultaba sus datos.

Qué aprendí

El peso no estaba donde parecía. El motor, no las imágenes, definía la memoria de cada mapa: un modo ligero que bajaba 24–36 % la RAM de un mapa se perdía en el ruido con cuatro mapas en el tablero. Tampoco la red era el cuello de botella: nginx delante y un paquete de arranque por mapa bajaron 20 % las peticiones y 12 % el tiempo del tablero, pero el hilo principal seguía ocupado.

Leer más

Por eso descarté un solo motor 3D para los cuatro mapas, porque arrancar sus marcos costaba solo 0.45 s, y un build a medida del motor que ahorraría menos de 0.1 s por mapa. Además, un control por hash no vio 88 teselas de aviso en pantalla, cada una con otro trozo de una marca de agua; ahora se detectan por su brillo.

Stack

  • CesiumJS
  • WebGL
  • Leaflet
  • nginx
  • Node.js
  • Next.js
  • TypeScript
  • WebP

Habilidades

  • Empaquetado de mapas sin conexión
  • Renderizado 3D en la web
  • Perfilado de rendimiento
  • Medición con pruebas A/B
  • Herramientas de build
Portada de Mapas 3D sin conexión por cliente, recortados al corredor del ductoPortada de Mapas 3D sin conexión por cliente, recortados al corredor del ducto