Files
dogfather-universe/patch15.py
T
DogFatherGitandClaude Opus 5 bd0346f785 Verwaltung wird fluessig: von 4,5 auf 60 Bilder pro Sekunde
Bei der Systemabnahme gemessen und fuer untragbar befunden: Die
Verwaltung lief mit 4,5 Bildern je Sekunde, sobald die Maus bewegt
wurde. Die Startseite lag bei 60. Ein Arbeitswerkzeug, das bei jeder
Mausbewegung ruckelt, ist kein Gewinn an Schoenheit.

WAS GEMESSEN WURDE, STATT GERATEN

Jeder Effekt einzeln abgeschaltet, mit echter Mausbewegung:

  alles an                6,4 Bilder/s
  ohne Glas               9,7
  ohne Lampe              9,2
  ohne Kachel-Neigung     6,4   (kostet NICHTS)
  ohne Glas UND Lampe    16,4

Kein einzelner Schuldiger -- es war die Wechselwirkung. Die Lampe
verschiebt den Untergrund, woraufhin JEDE Glasflaeche darueber ihre
Rueckseiten-Unschaerfe neu berechnen muss. Beide zusammen kosteten mehr
als beide einzeln.

Die Neigung ist gratis: Sie laeuft auf der Grafikkarte.

Ein zweiter Posten kam dazu: Solange die Kacheln durchscheinend sind,
muss das bildschirmfuellende Buehnenbild bei jeder Neuzeichnung
mitgerechnet werden. Ohne Buehnenbild stieg die Rate von 24 auf 34,6.

DREI EINGRIFFE

1. Glas nur noch auf dem Detailblatt. Davon gibt es immer genau eines,
   und es liegt gross ueber der Seite -- dort faellt die Rechenzeit
   einmal an, nicht pro Listeneintrag. Kacheln, Reiter und Knoepfe
   bekommen stattdessen eine dichte Flaeche. Optisch kaum ein
   Unterschied, weil die Struktur des Bildes ohnehin verschwindet.

2. Die Vollbild-Zeigerlampe ist abgeschaltet. Das Licht, das dem Zeiger
   folgt, gibt es weiterhin -- auf den Kacheln selbst. Das ist der
   Effekt, der zaehlt, und er ist billig: Er betrifft nur die Kachel
   unter dem Zeiger statt des ganzen Bildschirms.

3. Die Kachelflaeche ist dichter (.92/.96 statt .52/.68). Die Buehne
   bleibt rings um die Kacheln voll sichtbar, durch die Kachel selbst
   schimmert sie nur noch als Ahnung.

ERGEBNIS

  in Ruhe (lesen)        55,6 -> 60,6 Bilder/s
  beim Scrollen          54,0
  Zeiger bewegt           4,5 ->   28

DIE BILDRATE IST JETZT SELBST EIN PRUEFPUNKT

Ohne ihn kaeme jederzeit ein weiterer huebscher Effekt dazu, der die
Seite still wieder zaeh macht -- und niemand wuesste, welcher es war.
Der Durchlauf verlangt jetzt ueber 45 Bilder je Sekunde in Ruhe.

NEBENBEFUND

Die Regel fuer das Detailblatt stand unter "#vw-bereich" -- das Blatt
liegt aber in einer eigenen Ueberlagerung. Die Regel griff also nie:
Ausgerechnet die eine Flaeche, die eine Unschaerfe wirklich verdient,
hatte als einzige keine. Gefunden hat das der neue Test.

Geprueft: 1281 Pruefungen gruen (Browser 715, Server 566), i18n ohne
Fehler, WCAG ohne Fundstellen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-08-25 17:34:53 +02:00

108 lines
4.6 KiB
Python

# -*- coding: utf-8 -*-
import io
p = 'pruef-verwaltung-schmuck.mjs'
s = io.open(p, encoding='utf-8').read()
# --- Glas-Abschnitt: es traegt jetzt nur noch das Detailblatt Unschaerfe ---
alt = ''' console.log("\\n===== 2. TRAEGT ALLES GLAS, WORAUF GELESEN WIRD? =====");
const glas = await seite.evaluate(() => {
const pruefen = [".vw-karte", ".vw-filter-knopf", ".vw-wer"];
const raus = {};
for (const w of pruefen) {
const el = document.querySelector("#vw-bereich " + w);
if (!el) { raus[w] = "(nicht gefunden)"; continue; }
const st = getComputedStyle(el);
raus[w] = st.backdropFilter || st.webkitBackdropFilter || "keins";
}
return raus;
});
for (const [w, wert] of Object.entries(glas)) {
if (wert === "(nicht gefunden)") continue;
pruefe(` ${w} hat Rueckseiten-Unschaerfe`, /blur/.test(wert), wert.slice(0, 34));
}'''
neu = ''' console.log("\\n===== 2. BLEIBT DER TEXT VOM BILD GETRENNT? =====");
/* Frueher wurde hier "traegt alles Glas?" geprueft. Das war zu teuer:
Eine Rueckseiten-Unschaerfe kostet Rechenzeit PRO ELEMENT, und zwar
bei jeder Bewegung neu. Mit sechs Kacheln fiel die Bildrate auf
6,4 Bilder je Sekunde, bei echter Mausbewegung sogar auf 4,5.
Entscheidend ist nicht die Unschaerfe, sondern dass der Text nicht
auf dem Bild steht. Das leistet auch eine dichte Flaeche -- und die
kostet nichts. Genau das wird jetzt geprueft. */
const flaechen = await seite.evaluate(() => {
const el = document.querySelector("#vw-probe .vw-karte");
if (!el) return null;
const st = getComputedStyle(el);
return { hintergrund: st.backgroundImage, unschaerfe: st.backdropFilter };
});
pruefe("die Kachel hat eine eigene Flaeche unter dem Text",
flaechen && /gradient/.test(flaechen.hintergrund),
flaechen ? "Verlauf vorhanden" : "keine Kachel");
/* Das Detailblatt behaelt die Unschaerfe: Davon gibt es immer nur
genau eines, und es liegt gross ueber der Seite -- dort faellt die
Rechenzeit einmal an, nicht pro Listeneintrag. */
const blatt = await seite.evaluate(() => {
const el = document.querySelector(".vw-detail-blatt");
if (!el) return "(nicht auf der Seite)";
return getComputedStyle(el).backdropFilter || "keins";
});
if (blatt !== "(nicht auf der Seite)") {
pruefe("das Detailblatt behaelt seine Unschaerfe", /blur/.test(blatt), blatt.slice(0, 30));
}
/* Die Bildrate ist selbst ein Pruefpunkt. Ohne ihn waere jederzeit
ein weiterer huebscher Effekt dazugekommen, der die Seite still
wieder zaeh macht. */
const bildrate = await seite.evaluate(() => new Promise((fertig) => {
let n = 0;
const start = performance.now();
const zaehl = () => {
n++;
if (performance.now() - start < 1200) requestAnimationFrame(zaehl);
else fertig(n / ((performance.now() - start) / 1000));
};
requestAnimationFrame(zaehl);
}));
pruefe("die Seite laeuft in Ruhe fluessig (ueber 45 Bilder/s)",
bildrate > 45, bildrate.toFixed(1) + " Bilder/s");'''
assert alt in s, 'Glas-Abschnitt nicht gefunden'
s = s.replace(alt, neu, 1)
# --- Lampen-Abschnitt: sie ist bewusst abgeschaltet ---
alt2 = ''' pruefe("Buehne und Lampe stecken in einem isolierten Raum",
extra.raumIsoliert === "isolate", extra.raumIsoliert);'''
neu2 = ''' pruefe("Buehne und Lampe stecken in einem isolierten Raum",
extra.raumIsoliert === "isolate", extra.raumIsoliert);
/* Die Vollbild-Zeigerlampe ist ABGESCHALTET -- eine Entscheidung,
kein Versehen. Zusammen mit den Glasflaechen kostete sie zwei
Drittel der Bildrate: Jede ihrer Bewegungen zwang jede Flaeche
darueber zum Neurechnen.
Das Licht, das dem Zeiger folgt, gibt es weiterhin auf den Kacheln
selbst. Es ist billig, weil es nur die Kachel unter dem Zeiger
betrifft statt des ganzen Bildschirms. */
const lampeAus = await seite.evaluate(() =>
getComputedStyle(document.querySelector(".vw-lampe")).display);
pruefe("die Vollbild-Lampe ist bewusst aus", lampeAus === "none", lampeAus);'''
assert alt2 in s, 'Lampen-Abschnitt nicht gefunden'
s = s.replace(alt2, neu2, 1)
# --- Die alten Lampen-Pruefungen entfernen ---
for weg in [
''' pruefe("die Lampe beleuchtet, statt zu ueberdecken",
extra.mischung === "soft-light", extra.mischung);''',
''' pruefe("sie folgt dem Zeiger", extra.mx === "1050px" && extra.my === "380px",
extra.mx + " / " + extra.my);''',
''' pruefe("und war vor der ersten Zeigerbewegung aus", extra.lampeAn === true);''',
]:
if weg in s:
s = s.replace(weg, '', 1)
io.open(p, 'w', encoding='utf-8', newline='').write(s)
print('Test an die neue Aufteilung angepasst')