停止渲染并显示可恢复状态
侦听画布上的 webglcontextlost,当您打算支持恢复时阻止默认行为,并在上下文不可用时停止发出绘制调用。如果恢复可能需要时间,请给玩家一条克制的消息,但保留当前的游戏状态并避免将其视为新关卡或丢失的保存。
保持资源描述(例如源图像、着色器文本和缓冲区数据)独立于 WebGL 句柄可用。恢复时,根据这些描述创建一组新的 GPU 对象,重新连接属性和 uniform 变量,恢复视口和渲染状态,然后仅在正确绘制一个小的已知场景后恢复。
模拟真实交互过程中的损失
在开发过程中使用 WEBGL_lose_context 扩展来在场景加载后触发丢失。测试在添加纹理时、玩家移动时以及返回可见选项卡后丢失上下文。确认恢复路径重新创建了每个所需的资源,并且任何挂起的异步负载都被安全地重新应用或丢弃。
MDN 记录丢失事件和测试用扩展程序。在将失败的图形操作解释为普通着色器或资源错误之前,还要检查 isContextLost()。记录开发诊断中发生的情况,以便将恢复错误与正常渲染失败区分开来。
关于WebGL 上下文丢失游戏的常见问题
上下文恢复可以恢复我的纹理吗?
不。将新上下文视为需要新的 GPU 资源。保留源数据或重新加载它的方法,然后在恢复上下文时重新创建纹理和其他对象。
如何在不等待真正失败的情况下测试上下文丢失?
MDN 的 webglcontextlost 文档演示了 WEBGL_lose_context 扩展,它可以故意触发丢失,以便您可以执行恢复路径。
延伸阅读
发现信息过时了? 报告需要更正的内容