Oneshot Gems
Jouer

Pour les développeurs de jeux

Prévoir la disparition du contexte graphique

Un contexte WebGL peut être perdu lorsque le navigateur ou le système récupère des ressources graphiques, qu'un pilote change ou que le travail du GPU se bloque. Les poignées GPU qui faisaient autrefois référence à des textures, des tampons et des programmes ne peuvent plus être utilisées en toute sécurité après une perte. Un jeu robuste conserve son niveau d'autorité et son état de joueur en dehors de ces ressources, afin de pouvoir reconstruire le moteur de rendu au lieu de nécessiter un redémarrage complet du jeu. La perte de contexte est un cas limite qui mérite d'être étudié délibérément, et non un événement à ne pas tester.

Sur cette page

Arrêter le rendu et afficher un état récupérable

Écoutez webglcontextlost sur le canevas, empêchez le comportement par défaut lorsque vous avez l'intention de prendre en charge la restauration et arrêtez d'émettre des appels draw lorsque le contexte n'est pas disponible. Donnez au joueur un message discret si la récupération peut prendre du temps, mais conservez l'état actuel du jeu et évitez de traiter cela comme un nouveau niveau ou une sauvegarde perdue.

Conservez les descriptions de ressources, telles que l'image source, le texte du shader et les données de tampon, disponibles indépendamment des handles WebGL. Lors de la restauration, créez un nouvel ensemble d'objets GPU à partir de ces descriptions, reconnectez les attributs et les uniformes, restaurez la fenêtre d'affichage et l'état de rendu, puis reprenez uniquement après qu'une petite scène connue soit correctement dessinée.

Simuler une perte lors d'une interaction réelle

Utilisez l'extension WEBGL_lose_context pendant le développement pour déclencher la perte après le chargement de la scène. Testez la perte de contexte pendant l'ajout d'une texture, pendant que le joueur se déplace et après être revenu à un onglet visible. Confirmez que le chemin de restauration recrée toutes les ressources requises et que toute charge asynchrone en attente est réappliquée en toute sécurité ou supprimée.

MDN documente l'événement de perte et l'extension de test. Vérifiez également isContextLost() avant d'interpréter une opération graphique ayant échoué comme une erreur de shader ou d'actif ordinaire. Enregistrez ce qui s'est passé dans les diagnostics de développement afin qu'un bug de récupération puisse être distingué d'un échec de rendu normal.

Questions sur ⁨Jeu de perte de contexte WebGL⁩

La restauration de contexte ramène-t-elle mes textures ?

Non. Considérez le nouveau contexte comme nécessitant de nouvelles ressources GPU. Préservez les données sources ou un moyen de les recharger, puis recréez des textures et d'autres objets lorsque le contexte est restauré.

Comment tester la perte de contexte sans attendre un véritable échec ?

La documentation webglcontextlost de MDN présente l'extension WEBGL_lose_context, qui peut délibérément déclencher une perte afin que vous puissiez exercer le chemin de récupération.

Pour aller plus loin

Vous avez repéré une information dépassée ? Signaler une correction

Continuez à jouer.

Des jeux gratuits sur navigateur, prêts quand vous l’êtes. Trouvez celui qui vous plaît et faites-en votre prochain favori.

Suivez votre curiosité