首页 > 其他分享 >webgl丢失上下文

webgl丢失上下文

时间:2022-08-21 01:11:33浏览次数:64  
标签:浏览器 函数 WebGL 丢失 上下文 webgl 事件

webgl丢失上下文

一、原理


  WebGL使用了计算机的图形硬件,而这部分资源是被操作系统管理,由包括浏览器在内的多个应用程序共享。如果一个程序接管了图形硬件,或者操作系统进入休眠,浏览器就会失去使用这些资源的权力,并导致存储在硬件中的数据丢失。在这种情况下,WebGL绘图上下文就会丢失。比如,如果你正在一台笔记本电脑或者智能手机上运行WebGL程序,然后使其进入休眠状态,通常此时浏览器的控制台会显示一条错误消息。当你将电脑或手机重新唤醒后,操作系统确实回到了休眠前的状态,但是浏览器中运行的WebGl程序却不见了。(王爷的背景色是白色,所以浏览器上一篇空白。)(计算机被从休眠模式唤醒后WebGL程序停止)

   在Windows XP上,当系统具有电源管理事件,(如进入睡眠状态或屏保保护程序被激活)时,可能会发生这种状况。在Window高版本中,这种情况不多,但如果硬件挂起或驱动程序停止时仍然会发生。当设备丢失时,位于图形内存中的资源将丢失,并将忽略渲染相关操作。要想恢复,应用程序必须释放视频内存资源并重置设备。默认情况下,当发生设备丢失时,ANGLE会在GL调用上生成内存不足错误,并在EGL调用上生成上下文丢失错误,以指示上下文处于未定义状态。正确的响应是销毁所有GL上下文,重新创建上下文,然后根据需要恢复任何状态和对象。

二、错误提示:

  WebGL error CONTEXT_LOST_WEBGL in uniformMatrix4fv([object WebGLUniformLocation, false, [object Float32Array])

  或者:WAENING:WebGL content on the page mighthave caused the graphics card to reset

  这条信息提示,系统进入休眠状态前或被唤醒后,浏览器正在调用gl.uniform-Matrix4fv(函数)并出错了。这条消息的具体内容依赖于进行上下文丢失时程序正在做什么。

三、如何响应上下文丢失

  WebGL提供供了两个事件来表示这种情况,上下文丢失时触发(webglcontextlost),上下文恢复事件(当浏览器完成WebGL系统的重置后触发webglcontextrestored)

  当上下文事件丢失的时候,由getWebGlContext()函数获得的渲染上下文对象gl就失效了,而之前在gl上的所有操作,如创建缓冲区对象和纹理对象,初始化着色器,设置背景色等等,也都失效了。浏览器重置WebGl系统后,就出发了上下文恢复事件,这时我们需要重新完成上述步骤。在javascript中保存的变量不会受到影响,可以照常使用。

      我们需要使用<canvas>的addEventLisenter()函数注册上下文丢失事件和上下文恢复事件的响应函数。<canvas>并不支持某个特殊的属性来注册关于上下文事件的响应函数,所以必须使用addEventListener()函数。(如果上下文丢失后,浏览器还没有发现出错,系统就已经休眠了,那么系统被唤醒后浏览器就会继续执行程序,发现并报告错误。)

canvas.addEventListener('webglcontextlost',contextLost, false);
canvas.addEventListener('webglcontextrestored',function(ev){start(canvas);false}, false);



funtion contextLost(ev){
  cancelAnimationFrame(g_requestID);//停止动画,mian()函数中定义的全局变量,函数的返回值。(停止调用产生动画的函数以保证在上下文恢复之前不再尝试重绘)
  ev。preventDefault();//组织浏览器的默认处理行为。(浏览器对上下文丢失事件的默认行为是,不再触发上下文恢复事件,而本例是需要触发事件,所以我们要阻止浏览器的默认行为。)
}

如有疑问或不懂得,请加qq群讨论: 854184700

标签:浏览器,函数,WebGL,丢失,上下文,webgl,事件
From: https://www.cnblogs.com/yaosusu/p/16609147.html

相关文章

  • webgl(threejs)生成房间楼层
    楔子在很多数字孪生项目中,都会涉及到楼层的建模。楼层的建模由于结构繁多,如果都是建模师进行手动建模,工作量会比较大。而楼层本身的结构,可以抽象成可以通过路径构造的对象......
  • URL传带有特殊字符的参数时,特殊字符丢失问题
    //替换+号phone=phone.replaceAll("\\+","%2B");其中特殊字符(部分)对应的编码如下:+  -->%2B                     ......
  • java double精度丢失
    问题很简单,是由于我们输入的十进制的double类型的数据在进行计算的时候,计算机会先将其转换为二进制数据,然后再进行相关的运算。然而在十进制转二进制的过程中,有些十进制......
  • kafka 如何保证消息不丢失
    今天我们来分析一下这个问题。先来回忆一下kafka 中消息传输的整个过程 1、kafka在producer端产生消息,调用kafkaproducerclientsend方法发送消息2、kafkaprod......
  • React 上下文
    在React中上下文是一种通信方案。上下文的特点在组件树中,是一种自上而下的单向数据流通信方案,数据只能从父组件注入,在子组件中访问。组件关系只要满足“父组件-后代组......
  • RabbitMQ如何保证消息不丢失?
    如果说你这个是用MQ来传递非常核心的消息,比如说计费、扣费的一些消息,那必须确保这个MQ传递过程中绝对不会把计费消息给弄丢。 先来捋一下在RabbitMQ传递消息的过程......
  • MQ如何保证消息不丢失
    一、MQ如何保证消息不丢失可以从以下三个阶段来保证1、生产者保证消息投递成功1)Kafka2)RabbitMQconfirm消息确认机制:......
  • MySQL-管理员root@'locahost' 丢失,怎么处理?
    版权声明:原创作品,谢绝转载!否则将追究法律责任。—————作者:kirin跳过授权表---->不开启验证功能(无密码登录) --skip-grant-tables阻止所有tcp/ip网络连接--sk......