Отслеживание причины сбоя webGL - возможная утечка видеопамяти

Я создаю новые AnimatedSprites для события указателя (и удаляю их при следующем событии указателя) в течение срока действия приложения. Приблизительно в 20 кликов приложение вылетает с ошибкой: Крысы! упал webGl. В этот момент ошибка не отображается в консоли. Сбой происходит на мобильном устройстве и, вероятно, также произойдет на настольном компьютере, если кто-то выполнит много нажатий.

Код, который многократно используется ниже. Я также включил живой пример на http://forwardingsolutions.club/. Может кто-нибудь указать, что я делаю не так?

Из других ответов я сделал вывод, что вам нужно перезагрузить загрузчик и вызвать destroy() для анимированного спрайта. Я называю оба этих метода, но все еще есть проблема.

function setupNextSpritesAnimation(){
    setupNextAnimation();
    console.log("next color: "+nextColor);
    switch (nextColor) {
        case "red":
            var newLoader = new PIXI.loaders.Loader()
            .add('nextSprite', '/assets/sprite/red.png.png')
            .load(function (loader, resources){
                var interval = setInterval(function(){
                    if (!isAnimating){
                        clearInterval(interval);
                        createNewAnimatedSprite(resources,newLoader);
                    }
                },50);

            });

            break;
        case "aqua":
            var newLoader = new PIXI.loaders.Loader()
            .add('nextSprite', '/assets/sprite/aqua.png.png')
            .load(function (loader, resources){
                var interval = setInterval(function(){
                    if (!isAnimating){
                        clearInterval(interval);
                        createNewAnimatedSprite(resources,newLoader);
                    }
                },50);
            });
            break;            
        case "green":
            var newLoader = new PIXI.loaders.Loader()
            .add('nextSprite', '/assets/sprite/blue.png.png')
            .load(function (loader, resources){
                var interval = setInterval(function(){
                    if (!isAnimating){
                        clearInterval(interval);
                        createNewAnimatedSprite(resources,newLoader);
                    }
                },50);
            });
            break;            
        case "purple":
            var newLoader = new PIXI.loaders.Loader()
            .add('nextSprite', '/assets/sprite/purple.png.png')
            .load(function (loader, resources){
                var interval = setInterval(function(){
                    if (!isAnimating){
                        clearInterval(interval);
                        createNewAnimatedSprite(resources,newLoader);
                    }
                },50);
            });
            break;   
                     }
}


function createNewAnimatedSprite(resources,newLoader){
    var tmpSprite = new PIXI.extras.AnimatedSprite(setupFrames(resources["nextSprite"].texture.baseTexture));
    app.stage.addChild(tmpSprite);
    spritesArray.push(tmpSprite);
    setupNextSprites(tmpSprite);

    app.renderer.plugins.prepare.upload(tmpSprite, function(){
        console.log("updoaded now");
        canRunNext = true;
        newLoader.reset();
        //console.log("kill");
        delete tmpSprite;

    });
}


function setupNextSprites(nextSprite){
    nextSprite.x = app.renderer.width / 2;
    nextSprite.y = app.renderer.height / 2;
    nextSprite.anchor.set(0.5);
    nextSprite.loop = false;
    nextSprite.animationSpeed = 0.5; 
    nextSprite.visible = false;
    nextSprite.onComplete = function (){
        console.log("animation finished");
        isAnimating = false;
    };
}


function setupNextAnimation(){
    var randomNumber = getRandomInt(0,3);
    switch (randomNumber) {
        case 0:
            nextColor = "red";
            break;
        case 1:
            nextColor = "aqua";
            break;            
        case 2:
            nextColor = "green";
            break;            
        case 3:
            nextColor = "purple";
            break;   
                        }  
}




app.stage.on("pointerdown", function () {
    if (firstRun && !isAnimating) {
        firstRun = false;
        isAnimating = true;
        currentSprite.gotoAndPlay(0);
        currentSprite.gotoAndPlay(0);
    }else{ 
        if (canRunNext && !isAnimating){
            isAnimating=true;

            if (currentSprite.visible){
                currentSprite.visible = false;
                currentSprite.destroy(true);
            }
            spritesArray[spritesArray.length-1].visible = true;
            spritesArray[spritesArray.length-1].gotoAndPlay(0);

            app.stage.removeChild(spritesArray[spritesArray.length-2]);
            spritesArray[spritesArray.length-2].destroy({ children:true, texture:true, baseTexture:true});

            canRunNext = false;
            setupNextSpritesAnimation();

        }
    }
});


function setupSpritesAnimation(){
//created currentSprite just once at the start of app
spritesArray.push(currentSprite);
}

0 ответов

Другие вопросы по тегам