html页面会出现浏览器崩溃,大规模WebGL应用引发浏览器崩溃的几种情况及解决办法...

我们使用Javascript写WebApp的时候,一般都不会考虑对象的生命周期,不太关注内存“泄露”的问题,依赖JS引擎的垃圾回收机制就可以运行的很好,基本上很少会出现浏览器崩溃的情况。但在Web端显示大规模三维模型的时候,内存/显存就是一个非常紧张的资源,需要综合考虑模型数据组织、任务调度、资源管理、浏览器兼容等方方面面的问题。本文针对我们在开发基于WebGL的三维应用中遇到到几种导致浏览器崩溃的情况进行分析并提供解决方案。

异步请求过多

浏览器对并发异步请求是有限制的。如果程序不做处理,“同时”发送几百个请求就可能导致浏览器崩溃。

解决办法:

使用请求队列:把需要多次请求得到的数据重新组织,在一次或几次请求完成。如果非得需要很多次(几百上千的情况)请求,可以把请求排队,用多个异步请求队列加载数据。

并发异步请求资源死锁

若一个资源被多个异步请求同时请求的时候就可能导致浏览器死锁,死锁的结果就是浏览器崩溃。默认浏览器都是启用cache的,而浏览器在从cache中读取数据的时候会加锁。

解决办法:

在组织异步请求队列的时候,把相同的资源放在相同的队列中,而不是放在不同的队列中。

GPU进程崩溃

Chrome是多进程架构,每个Tab都会启用单独的进程来处理页面。但所有的进程都会公用一个GPU进程。那么问题来了,如果开启多个WebGL应用页面,每个页面占用一定的GPU资源,GPU进程的内存加起来总的就会轻轻松松超过1.5G,结果就是GPU进程崩溃。使用64位Chrome情况会稍有改善,但依赖本机的GPU显存大小。在实际中用WebGL显示大模型会轻轻松松的撑爆GPU进程。

解决办法:

优化Mesh数据

Mesh简化

Mesh共享

使用对象池

限制同时绘制对象的数量

JS对象过多导致崩溃

在上图中的浏览器管理器中可以看到多个内存:内存、GPU内存、Javascript内存。其中Javascript内存是JS对象占用的内存,JS垃圾回收的是这部分内存。

Javascript代码和垃圾回收运行在同一个线程的环境,当垃圾回收的时候,js代码不会执行。如果js对象过多,(占用内存过多),垃圾回收的过程也会变得漫长。所以Chrome简单粗暴的限制了Javascript内存的占用,在x64下最大~1.4G。

解决办法:

优化数据结构

增加数据动态管理的机制。

JS代码运行超时

如果JS运行时间过长,超出一定的时间,浏览器就弹个对话框,让用户选择是否结束。相同的代码在chrome中没有问题,而在firefox中就可能无响应。

解决方法:

把耗时的算法设计成分步执行,使用requestAnimationFrame模拟多线程。

总结

相对桌面应用程序开发,浏览器是一个资源受限的环境:JS执行效率,内存,线程等。对于大规模的Web应用,我们经常需要在性能和资源上做平衡。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328941.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

细说SSO单点登录

什么是SSO? 如果你已知道,请略过本节! SSO核心意义就一句话:一处登录,处处登录;一处注销,处处注销。即:在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应…

java实现字符逆序输出

package cn.jbit.array;import java.util.Arrays;public class CharsSort {/*** 字符逆序输出*/public static void main(String[] args) {char[] chars new char[]{a,c,u,b,e,p,f,z};System.out.print("原字符序列&#xff1a;");for(int i 0; i < chars.lengt…

html5页面转场,基于HTML5 SVG的页面过渡切换效果

示例中使用了CSS Flexbox和CSS变量&#xff0c;不是所有的浏览器都支持这些新的CSS属性。该HTML5 SVG的页面过渡变形切换效果的基本HTML结构如下&#xff1a;d"M -44,-50 C -52.71,28.52 15.86,8.186 184,14.69 383.3,22.39 462.5,12.58 638,14 835.5,15.6 987,6.4 1194,1…

JVM调优总结(4):分代垃圾回收

转载自 JVM调优总结&#xff08;4&#xff09;&#xff1a;分代垃圾回收为什么要分代 分代的垃圾回收策略&#xff0c;是基于这样一个事实&#xff1a;不同的对象的生命周期是不一样的。因此&#xff0c;不同生命周期的对象可以采取不同的收集方式&#xff0c;以便提高回收效…

.NET Core系列 : 2 、project.json 这葫芦里卖的什么药

.NET Core系列 &#xff1a; 1、.NET Core 环境搭建和命令行CLI入门 介绍了.NET Core环境&#xff0c;本文介绍.NET Core中最重要的一个配置文件project.json的相关内容。我们可以使用.NET Core 的dotnet 命令行接口&#xff08;CLI&#xff09;dotnet new命令创建一个应用&…

html5 地图效果,html5 echarts图表插件炫光的分布地图动画特效

特效描述&#xff1a;图表插件 炫光的动画 分布地图动画 动画特效。html5地图动画&#xff0c;html5 echarts图表插件代码结构1. 引入JS2. HTML代码&#xfeff;ECharts$(#document).ready(function(){getEcharts();});function getEcharts(){// Step:3 conifg EChartss path, …

ASP.NET MVC @helper使用说明

简单的 helper 方法应用场景 Razor中的helper语法让您能够轻松创建可重用的方法&#xff0c;此方法可以在您的视图模板中封装输出功能。他们使代码能更好地重用&#xff0c;也使代码更具有可读性。 在我们定义helper方法之前的代码 让我们看一个简单的产品列表应用场景。在此场…

java实现向有序数组中插入一个元素

package cn.jbit.array; import java.util.*;public class Insert {public static void main(String[] args) {//字符排序char[] chars new char[9];chars[0] a;chars[1] c;chars[2] u;chars[3] b;chars[4] e;chars[5] p;chars[6] f;chars[7] z;System.out.print(&quo…

JVM调优总结(5):典型配置

转载自 JVM调优总结&#xff08;5&#xff09;&#xff1a;典型配置以下配置主要针对分代垃圾回收算法而言。 堆大小设置 年轻代的设置很关键 JVM中最大堆大小有三方面限制&#xff1a;相关操作系统的数据模型&#xff08;32-bt还是64-bit&#xff09;限制&#xff1b;系统的…

html点击弹出iframe,JavaScript:关于跨iframe弹窗

index.htmliframe.html$(function(){$("#window").window({width: 200,height: 100});});效果由于是在iframe中弹窗致使窗口被腰斩&#xff0c;所以需要向window中追加节点再弹窗&#xff0c;解决方式如下var win window.top.document.createElement("div"…

Visual Studio “15”第三个预览版发布

微软发布了Visual Studio 2015后继版本Visual Studio “15” (VS15)的第三个预览版本。目前为止&#xff0c;VS15延续了开发过程的迭代特性&#xff0c;升级了IDE的功能&#xff0c;提供了用户可以修改的C#格式规则以及一个新的异常辅助程序。 经过修改的智能提示弹出框包含了一…

计算一个班的平均分

package cn.jbit.nestedloops; import java.util.Scanner; /*** 计算一个班的平均分*/ public class AvgScore {public static void main(String args[]){int[] score new int[4]; //成绩数组float sum 0.0f; //成绩总和float average 0.0f; //成绩平均值//循环输入学…

IronPython死而复生

IronPython是一个运行在.Net框架通用语言运行库上的实现&#xff08;Common Language Runtime&#xff0c;CLR&#xff09;。这个项目曾一度停滞不前&#xff0c;最近&#xff0c;团队换了领导者&#xff0c;带来了新的进展。 Jeff Hardy&#xff0c;IronPython项目的前领导人&…

阳泉2021高考成绩查询时间段,2021年阳泉高考成绩排名及成绩公布时间什么时候出来...

阳泉高考结束后&#xff0c;每年都有很多家长和考试不知道阳泉高考成绩排名如何查询、阳泉高考成绩什么时候公布以及查询方式&#xff0c;本文小编整理了阳泉高考成绩查询排名的相关知识。一、阳泉高考成绩公布时间及查询方式根据往年阳泉高考成绩公布时间预测&#xff0c;2021…

深入JVM——OOM异常解析

转载自 深入JVM——OOM异常解析JVM对象访问解析 对象访问过程的内存情况 public void function(){Object obj &#xff1d; new Object(); }?function方法被执行的时候&#xff0c;JVM在JVM栈中为function创建一个栈帧&#xff0c;用于存放function在运行过程中的一些信息。O…

mvc html.antiforgerytoken,MVC Html.AntiForgeryToken() 防止CSRF***

MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site request forgery)***的一个措施,它跟XSS(XSS又叫CSS:Cross-Site-Script),***不同,XSS一般是利用站内信任的用户在网站内插入恶意的脚本代码进行***&#xff0c;而CSRF则是伪造成受信任用户对网站进行***…

使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(一)-- 起步

一、安装Visual Studio Code 安装文件下载地址&#xff1a;VS Code&#xff0c;当前最新版本是1.3。 推荐安装最新版&#xff0c;因为附带Debug插件&#xff0c;支持在vs code上进行断点调试。 二、安装.Net Core 1.0 SDK 安装文件下载地址&#xff1a;.Net Core SDK 三、创建一…

计算机应用基础期中上机考试,期中考试计算机应用基础试卷

中职17计算机1期中考试计算机应用基础试卷一、选择题1.在Excel2010工作簿中,至少应含有的工作表个数是()。A.0B.1C.2D.32.在Excel2010公式中,地址引用E$6是()A.引用绝对地址B.相对地址C.混合地址D.都不是3.在Excel2010默认建立的工作簿中,用户对工作表()。A.可以增加或删除B.不…

java实现打印直角三角形

package cn.jbit.nestedloops; import java.util.Scanner; /*** 输入行数打印直角三角形*/ public class RTriAngle {public static void main(String[] args) {int rows 0; //三角形行数System.out.print("请输入直角三角形的行数&#xff1a;");Scanner input ne…

ASP.NET Core Linux下为 dotnet 创建守护进程(必备知识)

前言 在上篇文章中《ASP.NET Core Docker部署》中介绍了如何在 Docker 容器中部署我们的 asp.net core 应用程序&#xff0c;本篇主要是怎么样为我们在 Linux 或者 macOs 中部署的 dotnet 程序创建一个守护进程&#xff0c;来保证我们的程序在异常或者是电脑重启的时候仍然能够…