Освобождение загруженной текстуры в WebGL - PullRequest
3 голосов
/ 24 января 2011

Демонстрация Textured Box на http://www.khronos.org/webgl/wiki/Demo_Repository содержит следующие фрагменты кода:

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;

Заранее спасибо за помощь.

ПРИМЕЧАНИЕ. Перекрестная почта http://www.khronos.org/message_boards/viewtopic.php?f=43&t=3367 от 23 декабря 2010 г., но ответа пока нет.

1 Ответ

3 голосов
/ 24 января 2011
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;
}
...