【问题标题】:Pixi.js makes browser crashed when use PIXI tickerPixi.js 使浏览器在使用 PIXI ticker 时崩溃
【发布时间】:2019-05-29 15:38:51
【问题描述】:

我的问题是 chrome 浏览器在大约 2 分钟后自动收报机启动后停止。

const renderer = new PIXI.Renderer({
    width: window.innerWidth,
    height: window.innerHeight,
    backgroundColor: 0x2c3e50,
    antialias: true,
});

const stage = new PIXI.Container();
const ticker = new PIXI.Ticker();

const initialLine = new PIXI.Graphics();
const dx = 0.2;

const xData = [50, 100, 150, 200];
const yData = [20, 90, 40, 100];

let lastX = xData[xData.length - 1];
let lastY = yData[yData.length - 1];


document.body.appendChild(renderer.view);

const simpleLine = () => {
    initialLine.lineStyle(2, 0xFFFFFF, 1);
    initialLine.moveTo(0, 0);
    for (let i = 0; i < xData.length; i++) {
        initialLine.lineTo(xData[i], yData[i]);
    }

    initialLine.position.x = 150;
    initialLine.position.y = 50;

    stage.addChild(initialLine);
}

const addLine = () => {
    const lastIndex = xData.length - 1;
    const newX = xData[lastIndex];
    const newY = yData[lastIndex];

    initialLine.moveTo(lastX, lastY);
    initialLine.lineTo(newX, newY);
}

const moveLine = () => {
    initialLine.position.x -= dx;
}

const setTicker = () => {
    ticker.add(() => {
        moveLine();
        addLine();
        renderer.render(stage);
    }, PIXI.UPDATE_PRIORITY.LOW);
    ticker.start();
}

const changeData = () => {
    lastX = xData[xData.length - 1];
    lastY = yData[yData.length - 1];
    xData.push(lastX + 10);
    yData.push(Math.floor(Math.random() * 100));
}

setInterval(() => {
    changeData();
}, 1000);

simpleLine();
setTicker();
body { margin: 0; }
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/pixi.js/5.0.3/pixi.min.js"&gt;&lt;/script&gt;

这是一个简单的折线图代码。

  1. 添加一个基本的 PIXI 容器
  2. 用 4 个点绘制第一条线。
  3. 使用 PIXI 代码和更改行 x 位置每秒添加下一行。

目前运行良好,但大约 2 分钟后,浏览器崩溃了。

我不知道为什么以及如何解决它。 帮帮我!

【问题讨论】:

    标签: javascript pixi.js


    【解决方案1】:

    存在内存不足错误。潜在的内存泄漏。如果在开发工具打开的情况下运行,它会显示“Paused before potential out-of-memory-crash”。

    内存使用量迅速超过 1500 MB。但是如果这些行被注释掉,内存使用似乎保持稳定:

    // xData.push(lastX + 10);
    // yData.push(Math.floor(Math.random() * 100));
    

    但是,发生内存不足错误时,xData.length 大约为 90。这些数组不能占用 1500+ MB。

    我不确定 PIXI 是如何存储图形对象的,但我认为initialLine 正在消耗大部分内存。 initialLine 正在向左移动,并且有很大的增长部分无法看到。内存不足错误是不可避免的!理想情况下,initialLine 中不可见的部分应该被释放。

    PIXI.graphics API 似乎没有办法释放旧线段。我不会连续移动和添加更多线段,而是clear 之前的图形并重新绘制整条线(跳过不可见的部分线)。

    【讨论】:

    • 谢谢。这对我很有帮助。然后我知道我必须做什么。但是还有一个问题,pixi 社区的很多人告诉使用 PIXI.RednerTexture 进行优化。但它似乎与 PIXI.Sprite 一起使用。那么,我必须将 PIXI.RenderTexture 与 PIXI.Graphics 一起使用吗?还是只使用 PIXI.Container 可以吗?
    • @DylanJu:我不确定.. 试着自己弄清楚(它可能只是“工作”),然后在 StackOverflow 上提出一个新问题~
    • @DylanJu:太好了!恭喜
    猜你喜欢
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多