HTML5ゲームのクロスブラウザ互換性:テストマトリックス
1) HTML5ゲームがクロスブラウジングを「傷つける」理由
ゲームは、プラットフォームのほぼすべての層に影響を与えます:グラフィックス(キャンバス/WebGL/WebGPU)、タイマーとストリーム(RAF/Workers)、サウンド(WebAudio/メディアポリシー)、入力(キーボード/ポインタ/タッチ/ゲームパッド)、ネットワークとキャッシュ(SW/キャッシュ )/Indepad exedDB)、統合(フルスクリーン/オリエンテーション/PWA)。異なったエンジン-Chromium (Chrome/Edge/Opera/Android)、 WebKit (Safari/macOS、すべてのブラウザのiOS/iPadOS)、 Gecko (Firefox)。さらに、省電力、バックグラウンドタブ、メモリ制限、自動再生ポリシーの違いもあります。
2)サポートされている環境: ターゲットマトリックス
ブラウザ/OS(最小バージョンはSLAを置き換える例です):- デスクトップ:Chrome/Edge 116+、Firefox 115+、Safari 16+(macOS 12+)。
- モバイル:Chrome Android 116+(Android 9+)、Samsungインターネット21+、Safari iOS/iPadOS 16+。
- WebView: Android WebView 116+、iOS-WebKitのみ(iOSのすべてのブラウザはWebKitを使用しています)。
- PWA(インストール):Chromiumデスクトップ/モバイル、Safari iOS 16。4+(制限付きでホーム画面に追加)。
- 低(モバイルバジェット、2 GB RAM)
- 媒体(可動装置/ultrabooks、 4-8 GBのRAM)
- 高い(デスクトップ/コンシューマーGPU、 8-16+GB)
3)大きいテストマトリックス(型板)
あなたのトラッカーで本当のテーブルを形成します。以下は、測定する必要があるキーブロックとステータス(OK/Partial/N/A)です。
3.1グラフィックス
3.2オーディオおよびメディアポリシー
3.3入力およびインターフェイス
3.4性能および省エネ
3.5保存/オフライン/ネットワーク
4)マニュアルスクリプトの最小セット(煙)
1.最初のスタート:アセットのロード、スプラッシュ、ミドルクラスのレベルスタート<3 s。
2.入力:タッチ/マウス/キーボード/ゲームパッド、複数の指、ホールド、スワイプ。
3.スクリーン:フルスクリーン、オリエンテーションロック、セーフエリア(前髪を持つiPhone)。
4.オーディオ:カスタムジェスチャーの後に最初のノート、ミュート/ミュート解除、音楽ミックス/FX。
5.WebGL:コンテキストの損失/回復(シミュレート)、影/シェーダー/スケール。
6.ライフサイクル:折りたたみ/展開、通話/通知、バックグラウンドのタブ。
7.保存:IndexedDB/LocalStorageの進行状況/設定、再起動/オフライン後のリカバリ。
8.ネットワーク:3Gスロットル/高RTT、ネットワーク損失、リトレイ、SW経由のキャッシュ。
9.PWA:インストール(Chromium/iOS)、アイコン、オフラインページ、バージョンの更新。
10.長いセッション:漏れのない20-30分(FPS/ヒープ安定)。
5)オートメーション: 方法と方法
Playwright(推奨):クロスエンジン、モバイルエミュレーション、WebKitドライバ、ビデオ/トラック。
Cypress:高速な開発ループですが、WebKit/mobileには制限があります。
WebDriver/Selenium:クラウド統合。
クラウド:BrowserStack、 Sauce Labs-本物のデバイスとiOS Safari。
プロファイリング:Chrome DevToolsプロトコル、Safari Web Inspector (Remote)、 Firefox Profiler。
Perfスクリプト:k6/browser for RUM-like asset loading scripts。
ヒント:各PRの3-5分(煙)のオートテストの「パッケージ」を保ちます:ロード、1つのゲームサイクル、一時停止、方向の切り替え、保存のチェック。
6)パフォーマンス: ターゲットメトリックとテレメトリー
FPS:安定した60 fps(またはProMotionで120)-平均だけでなく、フレームペーシングをキャプチャします。
フレームバジェット:16。7 ms(または8。update+renderの3 ms)、フレームごとのGC <2-3 ms。
入力レイテンシー: <80 msモバイル、50 msデスクトップ
Time-to-First-Frame (TTFF): <1。5 s(アセットをロードした後)。
ヒープの成長:セッションの20分あたりの+10%以下;暴走の配分の欠如。
オーディオ遅延:<100msラウンドトリップ。
Embed RUM: FPS、 TTFF、ヒープ、WebGLコンテキストがテレメトリーを失い、'browser/os/device'によってエラーをレンダリングします。
7)頻繁な非互換性と治療方法
7.1グラフィックス/レンダリング
HiDPI Canvas-Set logical size=CSS px、 physical='css devicePixelRatio'。
WebGLコンテキストが失われました:'webglcontextlost/webglcontextrestored'を聞いて、再起動のためのリソースを保存します。
テクスチャ/シェーダー:非普遍的な拡張を避けます。OES_texture_float、 EXT_color_buffer_float、およびfallbackをチェックします。
WebGPU:ロールフィーチャーフラグ;フォールバックとしてWebGL2パスを維持します。
7.2オーディオ/オートプレイ
カスタムジェスチャー('tap/click')でAudioContextを起動し「、allowed」フラグを保持します。
iOSでは、最小化/スイッチング時にサスペンドを準備します。
7.3入力/ジェスチャー
イベントのリスナーはデフォルトでパッシブになります。ここで'preventDefault()'はパッシブを明示的に無効にします。
ポインターイベント+タッチイベント-二重処理を避けます。入力レイヤーを抽象化します。
ゲームパッド:チェック'ナビゲーター。RAF経由でgetGamepads()'ボタンのレイアウトを考慮します。
7.4フルスクリーン/オリエンテーション/セーフエリア
iOSでは、env (safe-area-inset-)を考え、キャンバス/オーバーレイUIにパディングを追加します。
ユーザーのジェスチャーの後でだけオリエンテーションロック;「回転画面」ボタンを持っています。
7.5 Storigi/オフライン
IndexedDB:タイムアウト/リトレイでのラップ操作。iOSでは、クォータは小さく、軽量な保存を維持します。
サービスワーカー:資産の'Stale-While-Revalidate'戦略;正直に無効なバージョン(content-hash)。
LocalStorageはプライベートモードでは使用できません。警告メモリに劣化します。
7.6タイマー/バックグラウンド
バックグラウンドでは、タイマーは最大1秒以上をクランプします。重いロジックを停止し、ゲームを一時停止します。
間隔の代わりにページの表示/'visibilitychange'とイベント駆動の更新を有効にします。
8) crossbrowserのためのパイプラインアセンブリ
移調:TypeScript/Babelターゲット'es2020'(古いWebViewsの場合はそれ以下)。
Polyphylls: UAではなく機能検出のみ。
アセット:スプライトシート、フォールバック形式(WebP/PNG)のテクスチャ、オーディオ(AAC/OGG/Opus)。
コード区切り:エディタ/非ゲームパネル用のlazy-chunks。
圧縮:Brotli/Zstd;HTTP/2/3;CDNと不変バージョニング。
フィーチャーフラグ:WebGPU/オフスクリーンキャンバス/スレッド-ホワイトリストで有効にします。
9)チェックリストテンプレート
9.1スマートフォン(Android/Chrome、 iPhone/Safari)
- 接触+複数の接触;ジェスチャーはページを「引っ張らない」
- フルスクリーンおよびオリエンテーション;セーフエリアの正しい
- タップ後の最初の音;ミュート作品
- FPS ≥ 50(ロークラス)、ラグなし
- 再起動後の保存/復元の進捗状況
- オフラインシーン/SWの再起動
- システムオーバーレイコール(着信)→正しい一時停止
9.2デスクトップ(Windows/macOS)
- マウス+ホイール+キーボード、IME
- ゲームパッド(XInput/Generic)
- 60/120Hzモニタ:安定したフレームペーシング
- Alt-Tab/複数モニター/フルスクリーン/ウィンドウ
- メモリ<リミット、リークなし(20+分)
10)コード例(フラグメント)
キャンバス-HiDPI:js関数resizeCanvas (canvas){
const dpr=Math。 min(ウィンドウ。devicePixelRatio(デバイスピクセル比)         1, 2);
const {clientWidth: w、 clientHeight: h}=canvas;
キャンバスだよ。width=Math。 floor (w dpr);
キャンバスだよ。高さ=Math。 floor (h dpr);
const ctx=canvas。getContext ('2d');
CTXだ。setTransform (dpr、 0、0、 dpr、 0、0);
}js const gl=canvas。getContext ('webgl'、 {preserveDrawingBuffer: false});
キャンバスだよ。addEventListener ('webglcontextlost'、 e=>{e。 preventDefault();paused=true;});
キャンバスだよ。addEventListener ('webglcontextrestored'、()=>{reloadResources();paused=false;});js let audioUnlocked=false;
ウィンドウを開きます。addEventListener ('pointerdown'、()=>{
if(!audioUnlocked){
const ctx=new AudioContext();
const b=ctx。createBuffer (1、1、22050);
const s=ctx。createBufferSource();
s。 buffer=b;s。 connect (ctx。宛先);s。 start (0);
audioUnlocked=true;
}
}、{once: true、 passive: true});jsドキュメントです。addEventListener ('visibilitychange'、()=>{
if(ドキュメント。hidden) pauseGame();
else resumeGame();
});11)リスク管理と優先順位付け
マーフィーのiOSの法則:あなたのマトリックスからiOSのすべてのマイナーバージョンをテストします-回帰は頻繁です。
WebView OEM:古いWebViewを搭載したAndroidデバイスは、別のリスクレイヤーです(「greylist」デバイスと入力します)。
機能フラグ:ブランド/マーケットパイロットによる問題機能を含みます。
ロールアウト:1%→10%→50%→100% RUMゲート(FPS、クラッシュ、TTFF)。
12)観測可能性とバグレポート
各バグレポートには、'ua'、 'browser version'、 'os'、 'device'、 'gpu/renderer'、 'memory'、 'fps'、 'logs (WebGL/WebAudioエラー)'、'steps'、 'repro video'が含まれます。
クラッシュダンプ(JSエラー/リソース)、'コンテキストが失われた'、'オーディオのロック解除が失敗した'イベントの自動送信。
ダッシュボード:ブラウザ/デバイスによるFPS、平均TTFF、コンテキストロス共有、IndexedDBエラー、SWオフラインヒット。
13)最終テンプレートマトリックス(CSV魚)
プラットフォーム、ブラウザ、バージョン、機能、シナリオ、予想される、ステータス、メモ
Android、 Chrome、 116+、WebGL2、コンテキストの紛失/復元、状態の復元、OK、 iOS,Safari,16。タップ、再生、PARTIAL、サイレントスイッチの6,Audio,First音が影響します
デスクトップ、Firefox、 115+、フルスクリーン、Enter/Exit、 No layout jump、 OK、 Android、 WebView、 116+、Storage、 IndexedDB quota、 Save 5MB,PARTIAL,Quota lower on device X iOS,Safari,16。4+、PWA、インストール&再起動、ステート持続、OK"、'
---
14)生産準備チェックリスト
[]ブラウザ/バージョン/デバイスマトリックスとSLAの更新を修正しました。
[]autotests (Playwright)の煙セットはPRおよび夜に進水します;ビデオ/トラックのレポート。
[]RUMテレメトリーFPS/TTFF/heap/WebGLエラーとブラウザ/デバイスセクション。
[]Folbeki(フォルベキ):WebGL1 (WebGL2): WebGPU;オーディオのロックを解除します。ポインタ/タッチ抽象化。
[]処理されたライフサイクル/可視性、一時停止/再開、オフライン、コンテキストが失われました。
[]持続性は安定(IndexedDB+degradation)、資産バージョンはSW/CDN経由で不変です。
[]実際のデバイス(iOS/Android)および60/120 Hzデスクトップのプロファイル。
[]既知の制限(iOSオートプレイ、IDBクォータ、向き)のドキュメント。
[]問題のある機能(WebGPU/スレッド)のプラン/フィーチャーフラグをロールバックします。
[]ゲーム内のフィードバックチャンネル(フィードバック+ログダンプ)。
---
履歴書のサマリー
HTML5ゲームのクロスブラウザ互換性は「、Safariで動作する」チェックボックスではなく、規律です。堅牢なプラットフォームマトリックス、測定可能なメトリクス(FPS/TTFF/ヒープ)、実際のデバイスのオートテスト、グラフィックス/オーディオ/入力のフォークバック、オフラインおよび慎重な作業保存します。安定したテストパイプラインを入力し、RUMを収集し、フラグの背後にある機能を維持します。これにより、Chrome、 Safari、 Firefoxでも同様にスムーズで予測可能になります。