- 记录本身解决的第一个H5页的性能问题, 关于内存溢出
- 拼字游戏
肯定内存问题, 便是卡顿第一问题html
- 首先但愿从代码层面排查内存问题
- 思考代码后, 发现如下两点
new Image()
的src加载过来的null
- 直接贴连接了: Chromium Graphics // Chrome GPU
- 此次经过任务管理器能够直接看出是GPU缓存的溢出
- 哭了, 为何上次我测得时候不显示... 仅仅是一个内存的表示, 给我好找啊..
- 最后仍是在安卓中进行排查, 才知道是GPU / chromium grapics的问题
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <style> #stage { width: 100%; height: 100%; } </style> <title>测试内存</title> </head> <body> <button id="add">增长图片</button> <button id="clear">清除内存</button> <button id="addTen">增长十倍图片</button> <div id="stage"></div> <script> var count = 0 var stage = document.getElementById('stage') document.getElementById('add').onclick = function () { for (var i = 0; i < 23; i++) { stage.innerHTML += `<img src='./img${count}/${i}.jpg' />` } ++count } document.getElementById('clear').onclick = function () { stage.innerHTML = '' count = 0 } document.getElementById('addTen').onclick = function () { for (var j = 0; j < 10; j++) { for (var i = 0; i < 23; i++) { stage.innerHTML += `<img src='./img${count}/${i}.jpg' />` } } } </script> </body> </html>
浏览器中的GPU会自动缓存一段时间展现过的 "图像". 咱们称为: "GPU Program Cache"web
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <canvas id="glcanvas" width="700" height="500"></canvas> <script> // 获取WebGL var canvas = document.getElementById('glcanvas') gl = canvas.getContext("webgl") // 建立顶点着色器 var VSHADER_SOURCE = 'void main() {\n' + ' gl_Position = vec4(0.0, 0.0, 0.0, 1.0);\n' + ' gl_PointSize = 10.0;\n' + '}\n'; // 建立片元着色器 // var FSHADER_SOURCE = // 'void main() {\n' + // ' gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n' + // '}\n'; // 绘制圆 var FSHADER_SOURCE = ` #ifdef GL_ES precision mediump float; #endif void main() { float d = distance(gl_PointCoord, vec2(0.5,0.5)); if(d < 0.5){ gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); }else{ discard;} }`; // 着色器代码须要放到一个程序中 var program = gl.createProgram() // 建立顶点着色器 var vShader = gl.createShader(gl.VERTEX_SHADER) // 建立片元着色器 var fShader = gl.createShader(gl.FRAGMENT_SHADER) // shader容器与着色器绑定 gl.shaderSource(vShader, VSHADER_SOURCE) gl.shaderSource(fShader, FSHADER_SOURCE) // 将GLSE语言编写成浏览器可用的代码 gl.compileShader(vShader) gl.compileShader(fShader) // 将着色器添加到程序上 gl.attachShader(program, vShader) gl.attachShader(program, fShader) // 连接程序 // 在连接操做之后, 能够任意修改shader代码. // 对shader从新编译不会影响整个程序, 除非从新连接程序 gl.linkProgram(program) // 加载并使用连接好的程序 gl.useProgram(program) // 绘制一个点 gl.clearColor(0.0, 0.0, 0.0, 1.0) gl.clear(gl.COLOR_BUFFER_BIT) gl.drawArrays(gl.POINTS, 0, 1) </script> </body> </html>