Compatibilitatea între browsere a jocurilor HTML5: matrice de testare
1) De ce HTML5 jocuri „rănit” cross-browsing
Jocurile afectează aproape toate straturile platformei: grafică (Canvas/WebGL/WebGPU), cronometre și fluxuri (RAF/Workers), sunet (politicile WebAudio/Media), intrare (tastatură/pointer/touch/gamepad), rețea și cache (SW/Cache/Indepad exedDB), integrare (fullscreen/orientare/PWA). Motoare diferite - Chromium (Chrome/Edge/Opera/Android), WebKit (Safari/macOS, iOS/iPadOS în toate browserele), Gecko (Firefox). Plus diferenţe în ceea ce priveşte economisirea energiei, accelerarea filelor de fundal, limitele memoriei şi politicile de joc automat.
2) Medii acceptate: matrice țintă
Browsere/OS (versiunile minime sunt un exemplu, înlocuiesc SLA-urile):- Desktop: Chrome/Edge 116 +, Firefox 115 +, Safari 16 + (macOS 12 +).
- Mobil: Chrome Android 116 + (Android 9 +), Samsung Internet 21 +, Safari iOS/iPadOS 16 +.
- WebView: Android WebView 116 +, iOS - numai WebKit (toate browserele de pe iOS folosesc WebKit).
- PWA (instalare): Chromium desktop/mobil, Safari iOS 16. 4 + (Adăugați la ecranul de pornire cu restricții).
- Redus (buget mobil, 2 GB RAM)
- Mediu (dispozitive mobile/ultrabook, 4-8 GB RAM)
- Mare (desktop/GPU de consum, 8-16 + GB)
3) Matrice de testare mare (șablon)
Formați o masă reală în tracker. Mai jos sunt blocurile cheie și stările (OK/Parțial/N/A) care trebuie măsurate.
3. 1 Grafică
3. 2 Politici audio și media
3. 3 Intrare și interfață
3. 4 Performanţă şi economie de energie
3. 5 Salvează/offline/rețea
4) Set minim de scripturi manuale (Fum)
1. Primul start: încărcarea activelor, splash, nivelul începe <3 s pe clasa de mijloc.
2. Intrare: atingeți/mouse/tastatură/gamepad, mai multe degete, țineți, glisați.
3. Ecran: ecran complet, orientare de blocare, zona de siguranță (iPhone cu breton).
4. Audio: prima notă după gestul personalizat, mut/unmute, muzică mix/FX.
5. WebGL: pierderea/recuperarea contextului (simulare), umbre/shadere/scară.
6. Ciclul de viață: colaps/extinde, apel/notificare, fila în fundal.
7. Salvează: progres/setări în IndexedDB/LocalStorage, recuperare după repornire/offline.
8. Rețea: accelerație 3G/RTT mare, pierdere de rețea, retray, caching prin SW.
9. PWA: instalare (Chromium/iOS), pictograme, pagină offline, actualizare versiune.
10. Sesiune lungă: 20-30 minute fără scurgeri (FPS/grămadă stabilă).
5) Automatizare: cum și cum
Dramaturg (recomandat): cross-motor, emulații mobile, driver WebKit, video/piese.
Cypress: buclă rapidă dev, dar WebKit/mobil este limitat.
WebDriver/Selenium: integrare în cloud.
Nori: BrowserStack, Sos Labs - dispozitive reale și iOS Safari.
Profilare: Chrome DevTools Protocol, Safari Web Inspector (Remote), Firefox Profiler.
Scripturi Perf: k6/browser pentru scripturi de încărcare a activelor asemănătoare RUM.
Sfat: păstrați un „pachet” de autoteste timp de 3-5 minute (fum) pentru fiecare PR: încărcare, un ciclu de joc, pauză, orientare de comutare, verificare salvați.
6) Performanță: măsurători țintă și telemetrie
FPS: stabil 60 fps (sau 120 pe ProMotion) - pacing cadru de captare, nu doar media.
Buget cadru: 16. 7 ms (sau 8. 3 ms) la actualizare + randare, GC <2-3 ms pe cadru.
Latenţă de intrare: <80 ms mobil, 50 ms desktop
Time-to-First-Frame (TTFF): <1. 5 s (după încărcarea activelor).
Creșterea grămezii: nu mai mult de + 10% pe 20 de minute de sesiune; lipsa alocărilor fugare.
Latență audio: <100ms roundtrip.
Încorporați RUM: trimiteți FPS, TTFF, heap, contextul WebGL a pierdut telemetria, redând erori prin „browser/os/device”.
7) Incompatibilități frecvente și cum să tratați
7. 1 Grafică/randare
Dimensiune logică = CSS px, fizică = 'css devicePixelRatio'.
Contextul WebGL pierdut: ascultați 'webglcontextlost/webglcontextreaded', stocați resurse pentru repornire.
Texturi/shadere: evitați extensiile non-universale; verificați OES _ texture _ float, EXT _ color _ buffer _ float și rezervă.
WebGPU: roll feature-flag; păstra calea WebGL2 ca o rezervă.
7. 2 Audio/autoplay
Porniți AudioContext cu un gest personalizat („atingeți/faceți clic”) și păstrați steagul „permis”.
Pe iOS, pregătiți-vă să suspendați atunci când minimizați/comutați.
7. 3 Intrare/gesturi
Ascultătorii evenimentelor fac pasiv în mod implicit; în cazul în care „preventDefault ()” este de a dezactiva în mod explicit pasiv.
Evenimente Pointer + Evenimente Touch - evitați procesarea dublă; abstractizează stratul de intrare.
Verifică navigatorul. getGamepads () "prin RAF, să ia în considerare aspectul butoanelor.
7. 4 Ecran complet/Orientare/Zonă sigură
Pentru iOS, luați în considerare „env (safe-area-inset-)”, adăugați căptușeală la interfața pânză/suprapunere.
Orientare de blocare numai după gestul utilizatorului; au un buton „rotire ecran”.
7. 5 Storigi/Offline
IndexedDB: wrap operations in timeout/retrays; pe iOS, cotele sunt mici - păstrați economii ușoare.
Lucrător în servicii: strategia „Stale-While-Revalidate” pentru active; versiuni cu handicap onest (conținut-hash).
Este posibil ca LocalStorage să nu fie disponibil în moduri private - degradează memoria de avertizare.
7. 6 Cronometre/fundal
În fundal, cronometrele se grupează până la 1 s sau mai mult. Opreşte logica grea, opreşte jocul.
Activați vizibilitatea paginii/„ vizibilitychange ”și actualizările bazate pe evenimente în loc de intervale.
8) Ansamblu de conducte pentru crossbrowser
Transpilation: TypeScript/Babel vizează „es2020” (sau mai mic pentru WebViews mai vechi).
Polifilii: numai detectarea caracteristicilor, nu și UA.
Active: foi de sprite, texturi cu formate de rezervă (WebP/PNG), audio (AAC/OGG/Opus).
Separarea codului: bucăți leneș pentru panouri editor/non-joc.
Compresie: Brotli/Zstd; HTTP/2/3; CDN cu versiuni imuabile.
Feature flags: WebGPU/OffscreenCanvas/Threads - activați de whitelist.
9) Șabloane de listă de verificare
9. 1 Smartphone (Android/Chrome, iPhone/Safari)
- Touch + multi-touch; gesturi nu „trage” pagina
- Fullscreen și orientare; zona de siguranță corectă
- Primul sunet după atingere; lucrări mute
- FPS ≥ 50 (clasă joasă), fără cadru zdrențuit
- Salvare/Restabilire progres după repornire
- Scena offline/restart SW
- Sistem de suprapunere apel (apel de intrare) → pauză corectă
9. 2 Desktop (Windows/macOS)
- Mouse + roată + tastatură, IME
- Gamepad (XInput/Generic)
- monitoare 60/120Hz: stimulare stabilă a cadrelor
- Alt-Tab/monitoare multiple/ecran complet/ferestre
- Memorie
10) Exemple de cod (fragmente)
Canvas с HiDPI:js funcție redimensionareCanvas (panza) {
const dpr = Math. min (fereastră. DispozitivPixelRatio 1, 2);
const {clientWidth: w, clientHeight: h} = panza;
pânză. lățime = Math. podea (w dpr);
pânză. înălțime = Math. podea (h dpr);
const ctx = pânză. getContext ('2d');
ctx. setTransforme (dpr, 0, 0, dpr, 0, 0);
}
WebGL: manipularea pierderilor de context:
js const gl = pânză. getContext ('webgl', {conserveDrawingBuffer: false});
pânză. addEventListener ('webglcontextlost', e => {e. preventDefault (); paused = true;});
pânză. addEventListener ('webglcontextrestored', () => {reloadResources (); paused = false;});
Audio „debloca”:
js let audioUnlocked = false;
fereastră. addEventListener ('pointerdown', () => {
dacă (! audioDeblocat) {
const ctx = nou AudioContext ();
const b = ctx. createBuffer (1, 1, 22050);
const s = ctx. createBufferSource ();
s. tampon = b; s. connect (ctx. destinație); s. start (0);
audioUnlocked = adevărat;
}
}, {o dată: adevărat, pasiv: adevărat});
Vizibilitate pagină:
js document. addEventListener ('vizibilitychange', () => {
dacă (document. ascuns) pauseGame ();
cvGame ();
});
11) Managementul riscului și prioritizarea
Legea lui Murphy pentru iOS: Testați fiecare versiune minoră a iOS din matricea dvs. - regresiile sunt frecvente.
WebView OEM: Dispozitivele Android cu WebView învechit sunt un strat de risc separat (introduceți dispozitivele „greylist”).
Steaguri funcționale: includ caracteristici problemă de brand/market-pilots.
Rollout: 1% → 10% → 50% → 100% cu porți ROM (FPS, accident, TTFF).
12) Observabilitate și rapoarte de erori
Includeți în fiecare raport de eroare: 'ua', 'browser version', 'os', 'device', 'gpu/renderer', 'memory', 'fps', 'logs (erori WebGL/WebAudio)', 'steps',' repro video '.
Trimiterea automată a gropilor de avarie (erori/resurse JS), evenimentele „context lost”, „deblocare audio eșuată”.
Tablouri de bord: FPS de browser/dispozitiv, medie TTFF, context pierdut cota, erori IndexedDB, SW hit-uri offline.
13) Matrice șablon final (pește CSV)
Platformă, browser, versiune, caracteristică, scenariu, așteptat, stare, note
Android, Chrome, 116 +, WebGL2, Context pierdut/restaurare, Stat restaurat, OK, iOS,Safari,16. sunet 6,Audio,First la robinet, Redări, PARŢIAL, Silent comutator afectează
Desktop, Firefox, 115 +, Fullscreen, Enter/Exit, Fără salt de aspect, OK, Android, WebView, 116 +, Stocare, cotă IndexedDB, Salvați 5MB,PARTIAL,Quota mai mici pe dispozitivul X iOS,Safari,16. 4 +, PWA, Install & relansare, Statul a persistat, OK „,”
---
14) Lista de verificare a pregătirii pentru producție
[] Browser fix/versiune/matrice dispozitiv și actualizare SLA.
[] Fum-set de autoteste (Playwright) este lansat pe PR și noapte; rapoarte cu video/piese.
[] RUM telemetrie FPS/TTFF/heap/WebGL erori cu secțiunea browser/dispozitiv.
[] Folbeki: WebGPU; Deblocare audio; Pointer/Touch abstractizare.
[] Ciclu de viață procesat/vizibilitate, pauză/CV, offline, context pierdut.
[] Persistența este stabilă (IndexedDB + degradare), versiunea activelor imuabilă prin SW/CDN.
[] Profiluri pe dispozitive reale (iOS/Android) și 60/120 Hz desktop-uri.
[] Documentarea restricțiilor cunoscute (autoplay-uri iOS, cote IDB, orientare).
[] Rollback planuri/feature-steaguri pentru caracteristici problematice (WebGPU/Threads).
[] Feedback canal în joc (feedback + log dump).
---
Rezumat reluare
Compatibilitatea între browsere a jocurilor HTML5 nu este o singură casetă de selectare „funcționează în Safari”, ci o disciplină: o matrice rigidă a platformei, valori măsurabile (FPS/TTFF/heap), autotesturi pe dispozitive reale, folkback-uri de grafică/audio/intrare și lucru atent cu offline și salvează. Introduceți o conductă de testare stabilă, colectați RUM și păstrați caracteristicile din spatele steagurilor - în acest fel jocul va fi la fel de neted și previzibil pe Chrome, Safari și Firefox, pe telefon și desktop.