- 記錄本身解決的第一個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>