Modest performance improvements

This commit is contained in:
connor committed 2026-10-14 22:50:00 -04:00
1 parent 377bdc92df
commit 0e8134aa59
8 files changed
+283 -70

No files matched your search

+9 -6
View File
@@ -30,14 +30,15 @@ step up is visible at a glance.
| Tier | Lighting | Camera | RTX 3060 | lavapipe (CPU) | Sample |
|---|---|---|---|---|---|
| L0 / C0 | Lambertian surfaces, Earth's and the Moon's limbs exact, eclipse by Earth and the Moon, no shadows on the target, no light from Earth | Pinhole, absolute radiometry to 12-bit DN, no noise or blur | 1.8–2.1 ms | 8–65 ms | [![L0/C0](docs/images/l0-c0.png)](docs/images/l0-c0.png) |
| L0 / C0 | Lambertian surfaces, Earth's and the Moon's limbs exact, eclipse by Earth and the Moon, no shadows on the target, no light from Earth | Pinhole, absolute radiometry to 12-bit DN, no noise or blur | 0.9–1.3 ms | 6–69 ms | [![L0/C0](docs/images/l0-c0.png)](docs/images/l0-c0.png) |
Times are one 1920 x 1080 RGB frame end to end (`submit` to `wait`, readback
of the DN image included), median of criterion runs, over models from 12 to
Times are one 1920 x 1080 RGB frame end to end (`submit` to `wait_view`, with
the DN image ready to read), median of criterion runs, over models from 12 to
752,000 triangles: the box-wing, Landsat 8 and ICESat-2. The GPU's own work is
0.3 to 0.6 ms of that; reading 12 MB back and copying it out is most of the
rest. lavapipe ran on the Intel Core Ultra 9 285K's 24 cores. The run-to-run
noise is about 3 %. The sample is the Landsat 8 example scene
0.3 to 0.6 ms of that. `wait`, which copies the 12 MB image into a new `Vec`,
takes 1.6 to 2.0 ms on the RTX 3060 and 7.7 to 82 ms on lavapipe. lavapipe ran
on the Intel Core Ultra 9 285K's 24 cores. Run to run, the RTX 3060's times
vary by about 5 %, and lavapipe's by up to 15 % between sessions. The sample is the Landsat 8 example scene
(`examples/scenes/landsat8.toml`). `cargo bench -p resolved` reproduces the
numbers, and `resolved render --timings N` shows the per-pass split.
@@ -83,6 +84,8 @@ let observer = Pose::looking_at(target + Vector3::new(20.0, 0.0, 0.0), target, V
let pending = renderer.submit(&scene, &observer)?;
// ... the simulation's own work for this step overlaps the GPU's here ...
let frame = pending.wait()?;
// (`pending.wait_view()` lends the image where the GPU left it instead of copying it,
// saving 0.6 ms or more at 1920 x 1080; the next `submit` waits until it is dropped.)
// 12-bit DN, channels r, g, b interleaved. The panel faces the Sun and the camera.
assert!(frame.dn_at(960, 540, 1) > 1000);