Skip to content

Performance

Measured with npm run bench on 2026-09-06: Apple M1 Pro, 32 GB RAM, headless Chrome, a 1280x800 canvas, the Blue Marble and Landsat imagery, atmosphere and star field as the base, and the camera orbiting one degree of heading per frame for 120 frames. "Draw time" is WorldWind's own render time per frame (BEFORE_REDRAW to AFTER_REDRAW); "Setup" is the time to build the objects and draw the first frame that includes them; "Heap growth" is the JavaScript heap after setup minus before it, each measured after a forced garbage collection. Imagery tiles are loaded from NASA's servers before measuring, so the numbers describe rendering, not the network.

Every object is a real WorldWind renderable created through the kit's factories; nothing is batched or simplified by the library, so these are WorldWind's numbers as reached through worldwind-kit.

GPU

Renderer: ANGLE (Apple, ANGLE Metal Renderer: Apple M1 Pro, Unspecified Version)

ScenarioObjectsSetupDraw time avgDraw time p95Frames/sHeap growth
baseline00 ms2.1 ms3.3 ms600.2 MB
placemarks-1k1,00012 ms2.9 ms3.5 ms601.9 MB
placemarks-10k10,00050 ms14 ms18.6 ms6015.1 MB
placemarks-50k50,000204 ms69.1 ms73.5 ms1474.3 MB
clustered-10k10,00048 ms5.2 ms6.1 ms603.8 MB
clustered-50k50,00056 ms5 ms5.5 ms605.8 MB
geojson-10k10,500154 ms23.5 ms25.3 ms4218.9 MB
paths-50050014 ms2.9 ms3.5 ms602 MB

Software (SwiftShader)

What a CI runner or a machine without a usable GPU sees. Renderer: ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (LLVM 10.0.0) (0x0000C0DE)), SwiftShader driver)

ScenarioObjectsSetupDraw time avgDraw time p95Frames/sHeap growth
baseline01 ms1.3 ms1.5 ms220.2 MB
placemarks-1k1,00018 ms2.5 ms2.7 ms191.9 MB
placemarks-10k10,00063 ms110.4 ms127.3 ms915.1 MB
placemarks-50k50,000219 ms407.8 ms454.2 ms274.3 MB
clustered-10k10,00050 ms55.6 ms67.3 ms163.8 MB
clustered-50k50,00063 ms56.2 ms67.3 ms165.8 MB
geojson-10k10,500447 ms160.8 ms211 ms619 MB
paths-50050024 ms2.2 ms2.5 ms192 MB

Reading the numbers

  • Placemarks are the expensive object: each is a textured quad with its own picking colour, and WorldWind sorts and draws them one by one. Ten thousand still hit 60 frames per second on a laptop GPU; fifty thousand do not. The clustered rows draw the same points through ClusterLayer: only a few hundred markers reach the GPU at any zoom, so fifty thousand cost about as much as one thousand. The software renderer shows where the cost goes.
  • GeoJSON polygons are surface shapes: tessellated onto the terrain once, then cheap per frame. The points in that scenario are placemarks and dominate its draw time.
  • Paths are tessellated once and cost almost nothing per frame.
  • Heap growth is roughly proportional to object count and is released by globe.destroy() or by removing the layer.

To reproduce: npm run build -w bench && npm run bench. The scenarios live in examples/bench/src/main.ts.

MIT licensed. Not affiliated with NASA; WorldWind is NASA's open-source virtual globe.