在WebGL上释放加载的纹理

时间:2011-01-23 22:13:27

标签: webgl

http://www.khronos.org/webgl/wiki/Demo_Repository上的Textured Box演示版包含以下代码段:

function loadImageTexture(ctx, url)
{
    var texture = ctx.createTexture(); // allocate texture
    texture.image = new Image();
    texture.image.onload = function() 
                              { doLoadImageTexture(ctx, texture.image, texture) }
    texture.image.src = url;
    return texture;
}

function doLoadImageTexture(ctx, image, texture)
{
    ctx.bindTexture(ctx.TEXTURE_2D, texture);
    ctx.texImage2D(ctx.TEXTURE_2D, 0, ctx.RGBA, ctx.RGBA, ctx.UNSIGNED_BYTE, image);  // loaded the image
...
}
...

var spiritTexture = loadImageTexture(gl, "resources/spirit.jpg");
...

如何释放已分配/加载的纹理以避免(图形)内存泄漏?

以下代码是否会释放加载/分配的纹理和图像?

spiritTexture  = null;

提前感谢您的帮助。

注意:2010年12月23日在http://www.khronos.org/message_boards/viewtopic.php?f=43&t=3367上发帖,但到目前为止还没有答案。

1 个答案:

答案 0 :(得分:3)

ctx.deleteTexture(spiritTexture);

那应该释放gpu上的纹理。

关于图片,您只需修改loadImageTexture,以便它不会在image内存储texture。在image之外不需要loadImageTexture的引用,当doLoadImageTexture完成时,您可以自然地超出范围。

即。使它像:

function loadImageTexture(ctx, url)
{
    var texture = ctx.createTexture(); // allocate texture
    var image = new Image();
    image.onload = function() { doLoadImageTexture(ctx, image, texture) }
    image.src = url;
    return texture;
}