10 浏览器中webgl内存占用高,如何快速垃圾回收 悬赏已过期

发布于 2024-09-09 14:47:16

我这边每个页面有不同的canvas来创建webgl,webgl来渲染4k的图片 进行实时形变处理,在离开页面前我会webgl相关的纹理 缓冲区 着色器等都清了,但是在浏览器中占用的内存不会清除 手机上打开别的页面再创建webgl就会导致页面崩溃,请问有什么解决办法吗

(图片不能压缩尺寸了,共用一个webgl改动量巨大,想问问有什么垃圾回收相关的办法)

补充:原生webgl glsl。
实时形变处理是对人脸关键点做一些形变处理,达到美颜的效果,不需要监听canvas的变化,我这边是页面中有一个美颜强度的slider,页面监听美颜强度,执行webgl的gl.drawArrays这样。(类似美图秀秀、醒图的瘦脸功能的效果)
清空逻辑大致如下

function cleanup() {
    const positionAttribLocation = gl.getAttribLocation(program, 'a_position');
    const texCoordAttribLocation = gl.getAttribLocation(program, 'a_texCoord');
    if (positionAttribLocation !== -1) gl.disableVertexAttribArray(positionAttribLocation);
    if (texCoordAttribLocation !== -1) gl.disableVertexAttribArray(texCoordAttribLocation);

    gl.bindBuffer(gl.ARRAY_BUFFER, null);
    gl.bindTexture(gl.TEXTURE_2D, null);
    gl.useProgram(null);

    if (positionBuffer) gl.deleteBuffer(positionBuffer);
    if (texcoordBuffer) gl.deleteBuffer(texcoordBuffer);

    if (image_texture) gl.deleteTexture(image_texture);
    if (filterImage_texture) gl.deleteTexture(filterImage_texture);

    if (gl.isProgram(program)) gl.deleteProgram(program);
    if (gl.isShader(VERTEX_SHADER)) gl.deleteShader(VERTEX_SHADER);
    if (gl.isShader(FRAGMENT_SHADER)) gl.deleteShader(FRAGMENT_SHADER);

    updateCanvasSize(0, 0)

    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
  }

查看更多

关注者
0
被浏览
209
2 个回答
Jsonco
Jsonco 图形社区官方人员 2024-09-09
奔驰的蜗牛
此回答仅提问者可以查看
地虎降天龙
地虎降天龙 图形社区官方人员 2024-09-09
也许宇宙中最反直觉的真理是,你给别人的越多,你得到的也越多。
此回答仅提问者可以查看

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览