Keep the day-cycle outline on its own compositing layer

The "Follows the sun" background made the plan crawl in Firefox: 23 MB of
textures per frame, sixteen of about twenty picture-cache tiles thrown
away every frame, nine frames per second. The card's own JavaScript was
idle for 89 % of that.

The cost is the outer outline. It is a triple drop-shadow over the
grouped paper footprint, and although the group holds paper silhouettes
only and never changes on hover or pan, the filter lived in the plan's
own layer — so every repaint of the plan re-ran three blur passes over
the whole sheet. One hint moves the filtered paper into its own layer
and unhooks it from the plan's repaints.

Measured on a demo-stand pan (Chromium, CDP, summed RasterTask): 1456.6
ms against a static background's 96.7 ms before, 84.7 ms against 103.2
ms after. The new smoke measures that ratio and fails above two.

The picture does not change: the outline outside the plan matches byte
for byte and the frame's mean colour moves from 176.59 to 176.66 of 255.
Splitting the layer does move the remaining content onto a different
sub-pixel grid, so the diagonal wall hatch anti-aliases differently and
the four day-cycle baselines are re-taken on the beta candidate.

Issue: #532
User-Visible: yes
This commit is contained in:
Claude
2026-09-11 17:01:04 +00:00
committed by claude[bot]
parent 7a81d41bab
commit ced9b41642
53 changed files with 677 additions and 492 deletions
+8
View File
@@ -2,6 +2,14 @@
## Unreleased
- The “Follows the sun” background no longer slows the plan down. The plan's
outer outline is a blur over the whole sheet, and it lived in the same layer
as the plan: any mouse movement made the engine re-run it. The outline now
keeps its own layer. Measured on a demo-stand pan, rasterization fell from
fifteen times a static background to the same order as one. The picture is
unchanged, to the pixel
([#532](https://github.com/Matysh/houseplan-card/issues/532)).
## v1.74.0 — 2026-09-11
- The plan is noticeably smoother, and in Firefox the difference is dramatic.
+8
View File
@@ -8,6 +8,14 @@
## Не выпущено
- Фон «Следует за Солнцем» больше не замедляет план. Внешний контур плана —
это размытие по габариту всего листа, и оно жило в общем слое с планом: любое
движение мыши заставляло движок прогонять его заново. Теперь контур держится
отдельным слоем. Замер на панораме демо-стенда: растеризация упала с
пятнадцатикратной к статичному фону до сопоставимой с ним. Картинка
не изменилась ни на пиксель
([#532](https://github.com/Matysh/houseplan-card/issues/532)).
## v1.74.0 — 2026-09-11
- План стал заметно плавнее, а в Firefox разница разительная. Перетаскивание
+7
View File
@@ -75,6 +75,13 @@ The public setting remains a two-value selector. `static` uses `bg_color`.
05:00→13:00→21:00 fallback arc. It has zero visible opacity at night.
- Four constant environment layers cross-fade for exactly 1100 ms with
`cubic-bezier(.22,.61,.36,1)`. Reduced motion disables the transition.
- The zero-offset outline is a filter over the grouped paper footprint, so it
is kept on its own compositing layer (`will-change: filter`, scoped to the
day-cycle stage). The group holds paper silhouettes only and does not change
while the plan is hovered or panned; without the hint every repaint of the
plan re-ran three blur passes over the whole sheet, which cost a Firefox
window about fifteen times the rasterization of a static background (#532).
A static background carries neither the filter nor the hint.
- Only the environment and the zero-offset alpha-aware outline outside the
grouped plan-paper footprint change. The plan, paper, floors, room fills,
Glow/spill, devices, labels, decor/backdrop, vacuum, hover, and window rays
+12 -12
View File
@@ -3,7 +3,7 @@
"fixture": "synthetic-only",
"chromium": "151.0.7922.34",
"oxipng": "oxipng 10.2.0",
"sourceFingerprint": "45f506aca7baceaa68ed03b4a7d97f05c8c22c42976287b6f3b42274f0122327",
"sourceFingerprint": "1a0b29e3e36eba71bc42630eceef108cf9a9bc82cc78aa7d1d047144086ae4f6",
"captureScriptSha256": "9e4b0ae533407fe003a129078aec020f2c83d67cdb6fc6da696ce3d829beaeb5",
"command": "npm run build && node demo/docs/capture.mjs",
"scenarios": {
@@ -15,7 +15,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "45f506aca7baceaa68ed03b4a7d97f05c8c22c42976287b6f3b42274f0122327",
"sourceSha256": "1a0b29e3e36eba71bc42630eceef108cf9a9bc82cc78aa7d1d047144086ae4f6",
"imageSha256": "76c35a87810e3dc6890bda7b43da133f57d8860031204a62cda7115c15950090"
},
"view-touch": {
@@ -26,7 +26,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "45f506aca7baceaa68ed03b4a7d97f05c8c22c42976287b6f3b42274f0122327",
"sourceSha256": "1a0b29e3e36eba71bc42630eceef108cf9a9bc82cc78aa7d1d047144086ae4f6",
"imageSha256": "795585acb09488236ebb8028a7fcbd918404c5fe01560bb9b4559de13d441625"
},
"space-create": {
@@ -37,7 +37,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "45f506aca7baceaa68ed03b4a7d97f05c8c22c42976287b6f3b42274f0122327",
"sourceSha256": "1a0b29e3e36eba71bc42630eceef108cf9a9bc82cc78aa7d1d047144086ae4f6",
"imageSha256": "9f0970de09772674c3156b9fc5b2d49de0ceb22be11ecf8b136047d37d100a84"
},
"room-contour-close": {
@@ -48,7 +48,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "45f506aca7baceaa68ed03b4a7d97f05c8c22c42976287b6f3b42274f0122327",
"sourceSha256": "1a0b29e3e36eba71bc42630eceef108cf9a9bc82cc78aa7d1d047144086ae4f6",
"imageSha256": "0c354a79f9c3660788b6c5e889a27b6bd78b1f209dc0eef6bb43e2c1344028c4"
},
"plan-context-tray": {
@@ -59,7 +59,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "45f506aca7baceaa68ed03b4a7d97f05c8c22c42976287b6f3b42274f0122327",
"sourceSha256": "1a0b29e3e36eba71bc42630eceef108cf9a9bc82cc78aa7d1d047144086ae4f6",
"imageSha256": "64169c543291bc4df806dcf8ff484b42c8ea55eb343323d945344e0e28f2ce97"
},
"device-editor": {
@@ -70,7 +70,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "45f506aca7baceaa68ed03b4a7d97f05c8c22c42976287b6f3b42274f0122327",
"sourceSha256": "1a0b29e3e36eba71bc42630eceef108cf9a9bc82cc78aa7d1d047144086ae4f6",
"imageSha256": "3c8703175605fcf0387d654cd30783ecfd33e21743e70b45190a5ae1a8d355c2"
},
"device-display-preview": {
@@ -81,7 +81,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "45f506aca7baceaa68ed03b4a7d97f05c8c22c42976287b6f3b42274f0122327",
"sourceSha256": "1a0b29e3e36eba71bc42630eceef108cf9a9bc82cc78aa7d1d047144086ae4f6",
"imageSha256": "5d6193202102f5e6d85567f1111fa105895b933979fbf369c6ba0b1029deb823"
},
"background-editor": {
@@ -92,7 +92,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "45f506aca7baceaa68ed03b4a7d97f05c8c22c42976287b6f3b42274f0122327",
"sourceSha256": "1a0b29e3e36eba71bc42630eceef108cf9a9bc82cc78aa7d1d047144086ae4f6",
"imageSha256": "375900a29aa62632883ede6727b7dbb8b48cabe9d7d0e16425f9779c837f3dd9"
},
"room-card": {
@@ -103,7 +103,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "45f506aca7baceaa68ed03b4a7d97f05c8c22c42976287b6f3b42274f0122327",
"sourceSha256": "1a0b29e3e36eba71bc42630eceef108cf9a9bc82cc78aa7d1d047144086ae4f6",
"imageSha256": "3d85424676c823ddca3fa7dab3cce089b6030e48c05d16d2d48d922c66c0cbd2"
},
"device-info": {
@@ -114,7 +114,7 @@
},
"theme": "dark",
"language": "en",
"sourceSha256": "45f506aca7baceaa68ed03b4a7d97f05c8c22c42976287b6f3b42274f0122327",
"sourceSha256": "1a0b29e3e36eba71bc42630eceef108cf9a9bc82cc78aa7d1d047144086ae4f6",
"imageSha256": "ac962820f8e1c5cb5b042d39b18dc95905fa840cb2d4749060d991be4f6977c2"
},
"pdf-export": {
@@ -125,7 +125,7 @@
},
"theme": "light",
"language": "en",
"sourceSha256": "45f506aca7baceaa68ed03b4a7d97f05c8c22c42976287b6f3b42274f0122327",
"sourceSha256": "1a0b29e3e36eba71bc42630eceef108cf9a9bc82cc78aa7d1d047144086ae4f6",
"imageSha256": "4537692fd57a3ed95528eddd748eee5cb6e456ffab7cc49169853d62459252cd"
}
},