由于上下文丢失,WebGL 场景无法渲染

2024-01-11

我有一个带纹理和不带纹理的道路 3D 模型。

当我加载没有纹理的道路时,一切正常~ 60fps。但是当我加载带有纹理的道路时,有两种变体:

1) 如果 3D 模型不大,那么它可以加载并工作,但 fps 非常低 ~ 10-20

2)如果 3D 模型很大,它加载时不会出现任何错误和警告,但之后我会收到此错误:

WebGL: CONTEXT_LOST_WEBGL: loseContext: context lost
THREE.WebGLShader: gl.getShaderInfoLog() null 

这个错误在这里:

animate = function() {
    renderer.render(scene, camera); <--- error occurs here
    stats.update();
    controls.update(clock.getDelta());
    return requestAnimationFrame(animate);
};

我读过这个错误的意思是:“浏览器或操作系统决定重置 GPU 以重新获得控制权”,但我该如何解决这个问题呢?


1、原因

这正是你所说的。

您的浏览器在渲染 WebGL 场景时挂起并失去其上下文,因为浏览器实际上已经失去了对 GPU 的控制。

要么您的应用程序存在巨大的内存泄漏,要么您的计算机没有足够的能力在 WebGL 场景上运行纹理化模型。通过尝试以非常大的纹理分辨率渲染重物体而过度挤压可能会导致上下文丢失。

2. 诊断

如果 3D 模型不大,那么它可以加载并工作,但 fps 非常低 ~ 10-20

让我觉得你的机器实际上无法在浏览器上很好地处理 3D。

3. 故障排除

第一个建议是降低场景的分辨率,您可以将渲染器对象的 setSize 减半 2 或 3。

对于性能密集型游戏,您还可以为 setSize 指定较小的值,例如 window.innerWidth/2 和 window.innerHeight/2,以获得一半的分辨率。这并不意味着游戏只会填满一半的窗口,而是看起来有点模糊并且放大了。

这意味着您需要将其添加到渲染器中:

renderer.setSize( window.innerWidth/2, window.innerHeight/2 );

此外,调整相机的远距离渲染也有助于获得一些性能。一般来说,这些是最常用的值:new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );,如果将远距离降低到 800 或 700,您可以从场景中压缩额外的 FPS(当然,以渲染距离为代价。)

如果您的应用程序在这些调整之后开始运行良好,那么您实际上面临资源匮乏的问题,这意味着您的计算机不适合运行 WebGL 或者您有巨大的内存泄漏

您还可以在另一台更好的计算机上测试您的应用程序,看看它的性能如何以及运行的流畅程度。

如果您的计算机是最先进的高端怪物游戏机,那么我唯一可以建议您的就是开始查看纹理的分辨率并将其缩小一点。

我也会留下这个链接:WebGL - 处理上下文丢失 http://www.khronos.org/webgl/wiki/HandlingContextLost(可能您已经看过这个),它提供了一些故障排除和恢复崩溃的 WebGL 实例的方法。

4.解决方案(针对这个具体答案)

After a quick chat with Eugene, the problem at the root of his project was Ram usage, his 3D model wasted a lot of Ram that Chrome was taking up to 1.6GB.
Ram usage screenshot The blue bumps are when his WebGL app is running.

在向他提出这个问题后,他带着他的解决方案回来了:

我已经解决了我的问题。我已将道路连接到一个文件并更改渲染器大小

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

由于上下文丢失,WebGL 场景无法渲染 的相关文章

  • 在 React 中渲染 Three.js 元素?

    我正在尝试制作一个渲染 Three js 场景的 React 组件 但是 每当我尝试安装组件而不是看到正在渲染的任何类型的场景时 我只看到文本 object HTMLCanvasElement 正在显示 这是我的组件 import Reac
  • 动画 GIF 作为 THREE.js 中的纹理

    我正在寻找一种在 THREE js 中使用 GIF 动画作为纹理的方法 我目前可以加载纹理 甚至是 GIF 格式 但它无法播放动画 有什么办法可以做到吗 我发现了一些像这样的链接 https github com JordiRos GLGi
  • 三.js Raycaster intersectObjects

    我正在尝试修改这个例子 https github com timoxley threejs blob master examples webgl morphtargets md2 control html来自 Three js 通过鼠标点击
  • Three.js:基于图像的光照(IBL)

    I m searching to add an IBL to my scene and objects But I can t find anything on the web There are some examples with an
  • 在 Three.js 中将贝塞尔曲线转换为平面道路

    我试图根据之前计算得到的一些贝塞尔曲线在 Three js 中绘制一条弯曲的道路 问题是我找不到转换曲线序列的方法 一条从上一条曲线的末尾开始 到一个曲面 我有一个 3D 场景 其中有一些汽车 一条用飞机创建的道路 并且绘制了即将到来的道路
  • Three.js 光线投射器可以与组相交吗?

    我想知道我的光线投射器是否正在查看我已加载的 OBJ 由于从 Cinema4D 导出的方式 我相信 OBJ 是一个具有 3 个子级的 THREE Group 而不是 THREE Object 我可以更改我的 raycaster 代码行来查找
  • 如何在 webgl 中缩放纹理?

    我有一个尺寸为 800x600 的纹理 如何在 webgl 上缩放它
  • WebGL:enablevertexattribarray索引超出范围

    这是我的顶点和片段着色器
  • Three.js 对象的“中心”是什么?

    当我使用 Blender 对对象进行建模时 我能够明确定义其发生平移和旋转的中心位置 当使用 Three js 对象时 我似乎没有找到等效的对象 Three js 对象是否具有定义其 中心 位置的属性 如果不是 物体的中心是如何确定的 在
  • 如何在 Three.js 场景中包含 OVRManager?

    我创建了几个 Three js Javascript 演示应用程序 正在我的新 Oculus Go 中进行试验 我正在尝试让 Go 控制器在我的应用程序中执行某些操作 根据 Oculus 开发人员中心的说法 最好的办法是将 OVRManag
  • WebGL - 如何传递无符号字节顶点属性颜色值?

    我的顶点由具有以下结构的数组组成 Position colour float float float byte byte byte byte 传递顶点位置没有问题 gl bindBuffer gl ARRAY BUFFER this vbo
  • 渲染 ThreeJS 应用程序第一帧时的性能问题

    目前 当我渲染以下内容时 我的 ThreeJS 应用程序的性能受到很大影响第一帧 它会导致 Edge 和 IE 11 浏览器冻结 5 秒 并弹出窗口指示 此窗口没有响应 这可能会吓到我的用户 使用 Chrome 的性能分析器 问题似乎来自几
  • 三.js环境光意想不到的效果

    在下面的代码中 我渲染了一些立方体并使用点光源和环境光照亮它们 然而 当设置为 0xffffff 时 AmbientLight 会将侧面的颜色更改为白色 无论其指定的颜色如何 奇怪的是 点光源按预期工作 我怎样才能使环境光表现得像点光 因为
  • 在 Three.js 中从 Web Worker 加载纹理

    当将大纹理图像应用到网格上一段明显的时间时 Three js 会锁定浏览器的主线程 让我们考虑以下示例 var texLoader new THREE TextureLoader texLoader load someLargeTextur
  • CSS3DObject 始终位于 WebGL Mesh 前面

    我正在混合CSS3D Renderer with WebGL Renderer to add HTML3D 空间中的元素WebGL场景 这CSS3DObject在前面WebGL网格即使WebGL Renderer具有较高的 z index
  • 如何在 React Native 中渲染自定义 3D 对象

    我已经成功使用 Three js expo Three 和 expo gl 在 React Native 中配置了红色立方体的 3D 渲染 但我想让用户渲染他们自己可能拥有的自定义 3D 对象 obj 或 mtl 扩展名 但我不确定如何让他
  • JavaScript TypedArray 混合类型

    我正在尝试使用 WebGL 并希望将一些不同类型混合到一个字节缓冲区中 我知道 TypedArrays 可以达到这个目的 但不清楚我是否可以与它们混合类型 OpenGL 顶点数据通常是与无符号字节或整数混合的浮点数 在我的测试中 我想将 2
  • 如何使用三个JS导出然后导入场景?

    我有一个用三个 JS 和大量 Javascript 代码构建的复杂 3D 场景 我需要将此场景导出为一个文件 然后通过简单的 ThreeJS 场景播放器在我的网站上使用它 我尝试过 ObjectExporter 和 SceneExporte
  • 三.js如何通过id(name)获取场景

    我创造了一个场景 如何通过 id name 获取它 喜欢jquery test In three js医生 我刚刚找到scene getObjectById 获取子对象 有一个getObjectByName方法用于此这里在Object3D
  • webglcontextcreationerror事件:是否同步触发?

    Is the webglcontextcreationerror 事件 https developer mozilla org en US docs Web Events webglcontextcreationerror同步触发还是异步触

随机推荐

  • pandas 查询包含由数组条目组成的列

    ykp data Out 182 state action reward 0 41 5 59 1 5 52 48 2 46 35 59 3 42 16 12 4 43 37 48 5 36 5 59 6 49 52 48 7 39 11 2
  • 滚动画布内容

    我在画布上绘制了一些文本和矩形 package com cavium test views import org eclipse swt SWT import org eclipse swt events PaintEvent import
  • 如何使用 thunk 在react-redux hooks中进行异步调用?

    我开始学习钩子 但我不明白异步调用如何正确工作 早些时候我用过 import as actionQR from actions qr function mapDispatchToProps dispatch return actionQR
  • 在asp.net core 2.1中捕获服务器端的会话超时

    我需要做点什么会议结束事件 我怎样才能参加这个活动 与此事件类似的任何事情可能会超时 ASP NET 有一个Session OnEnd您可以在 Global asax 中注册事件 但即使如此 它也非常不可靠 您只能将它用于进程内会话 并且它
  • 如何访问Azure Service Fabric有状态/无状态服务中的settings.xml?

    如何访问和读取中定义的参数PackageRoot Settings Settings xml来自我的有状态 无状态服务代码的文件 例如 我有一个带有参数 EndpointUrl 的 DocumentDbConfig 部分 section s
  • 显示成功消息,然后在超时后使用 PageFlow 重定向到另一个页面

    如何显示成功消息 然后在超时后将用户重定向到另一个页面 例如5秒 成功登录后我需要这个作为登录页面 我尝试了以下操作 我可以看到登录失败时的警告消息 但看不到登录成功时的成功消息 它立即显示目标页面 public String check
  • Amazon EC2丢失私钥,如何访问服务器? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 前天我的电脑被偷了 我把我的一台服务器私钥放进去 该密钥受密码保护 所以应该没问题 但问题是现在我无法访问服务器 服务器是Ubuntu 亚马逊EC2
  • 管理到非管理开销

    在 NET 中 有几个地方必须离开托管代码并进入非托管 也称为本机代码 领域 仅举几例 外部 DLL 函数 COM调用 总是有一些关于开销的评论从一个原因跳到另一个原因 我的问题是是否有人测量了正在发生的确切开销 并可以解释如何计算它 例如
  • 是否可以将 Azure 虚拟机移动到另一个区域?

    我有一个带有非托管磁盘的 Azure VM 我想把它移到另一个地区 除了概括我当前的虚拟机之外还有其他方法吗 除了概括我当前的虚拟机之外还有其他方法吗 Azure 不支持更改 VM 的位置 您需要将 VM 的 VHD 复制到另一个位置并使用
  • 如何加载本地json文件?

    有没有办法使用 about config 配置 Firefox 以允许本地文件访问 用于演示目的 特别是使用 FF12 我需要能够对 json 数据进行本地文件访问 它在服务器上运行良好 但我想让这个演示更加便携 ajax url asse
  • 如何查看 Android 设备的屏幕状态?

    有没有办法在没有广播接收器的情况下知道Android设备屏幕是否打开 我想通过警报管理器调用的服务在设备上进行分钟间隔更新 我还想延长电池寿命 因此 如果设备屏幕打开 更新服务就会运行 我用这段代码找到了解决我的问题的方法 PowerMan
  • os.fork 和 multiprocessing.Process 之间的行为差​​异

    我有这个代码 import os pid os fork if pid 0 os environ HOME rep1 external function else os environ HOME rep2 external function
  • 驱动器文件更新错误 500

    我的应用程序在 appdata 文件夹中保留了一些应用程序特定文件 但是 当文件尝试更新云端硬盘应用程序数据中的文件时 反复从云端硬盘服务器收到内部错误 我正在使用 Objective c 客户端调用 Drive API 你能帮忙看看这些有
  • 如何区分“使用鼠标右键单击”和“在物理键盘上按上下文菜单键”

    如何区分使用鼠标右键单击和物理键盘上的上下文菜单按键 使用此代码我尝试在控制台中打印事件 inputId bind contextmenu function e console log e 我抓取了上面代码的一些输出 对于使用鼠标右键单击
  • 为所有浏览器嵌入 Windows Media Player

    Edit 这个问题是2008年写的 相当于3个互联网时代之前的事了 如果这个问题仍然与您的环境相关 请接受我的哀悼 其他人都应该转换成一种格式您的浏览器支持 https videojs com html5 video support 如果需
  • Mysql2::Error: key 'index_admin_users_on_email' 的重复条目 '' Ruby on Rails 错误

    我正在尝试在从github获得的rails代码上运行ruby 最后我使用homebrew安装了mysql 然后也直接从http dev mysql com http dev mysql com 直到那时 当我在应用程序文件中使用 rake
  • 垃圾收集在内部 Map 中跟踪其自身实例的对象

    在我的类的构造函数中 我映射当前对象 this 连同它的键 在构造函数中作为参数输入的字符串 一起放入静态 LinkedHashMap 中 这样我就可以在以后可能需要的任何地方通过该字符串引用该对象 这是代码 如果有帮助的话 public
  • 我的API函数应该采用shared_ptr还是weak_ptr

    我目前正在设计一个 API 我不确定我的函数是否应该采用shared ptr or weak ptr 有些小部件包含查看器 观众有一个功能add painter这为观看者添加了一位画家 当查看器需要重绘时 它使用其绘制器绘制到缓冲区并显示结
  • IE 11 Bug - 表单内标签内的图像

    在 IE11 中 以下代码将按预期检查单选按钮
  • 由于上下文丢失,WebGL 场景无法渲染

    我有一个带纹理和不带纹理的道路 3D 模型 当我加载没有纹理的道路时 一切正常 60fps 但是当我加载带有纹理的道路时 有两种变体 1 如果 3D 模型不大 那么它可以加载并工作 但 fps 非常低 10 20 2 如果 3D 模型很大