Потеря кадров в секунду при использовании маски

#javascript #pixi.js

Вопрос:

Я работаю над приложением, которое позволяет обрабатывать изображения, поэтому я использовал Javascript и библиотеку PixiJS, чтобы сделать это возможным. Я хотел обновить изображение курсора при наведении курсора на холст

первое решение я попытался использовать курсор: url(курсор1.png) 4 12, авто; но я не могу изменить размер курсора. Размер по умолчанию 64 пикселей, и я не могу установить другое значение.

второе решение я решил добавить в DOM и обновить позицию x,y с помощью Javascript, но у меня возникла задержка.

третьим решением было интегрировать курсор в мой холст.

последнее решение я попытался разделить действия на 2 холста. Первый касается обработки изображений, а второй-мой курсор.

Со всеми предложениями, сделанными до того, как я потерял FPS, когда холст завис, за исключением первого.

Инициализируйте основной холст для обработки изображений

 function _initMainCanvas(imgData) {
  let newCanvas = new PIXI.Application({
    width: imgData.width,
    height: imgData.height,
    transparent: true
  });

  let blurContainer = new PIXI.Container();

  filters.initFilters();

  // ----------------------------------------------------------------------------------------
  //      Normal Sprite
  // ----------------------------------------------------------------------------------------

  let bg = main.createSprite({
    from: imgData.img,
    interactive: true,
    filters: [filters.getFilterSharpen(), filters.getFilterAdjustment()],
    width: imgData.width,
    height: imgData.height
  });
  newCanvas.stage.addChild(bg);

  //$(".blur_cursor").remove();

  // ----------------------------------------------------------------------------------------
  //      Blur Sprite
  // ----------------------------------------------------------------------------------------

  let bgBlured = main.createSprite({
    from: imgData.img,
    interactive: false,
    filters: filters.getFilters(),
    width: imgData.width,
    height: imgData.height
  });
  blurContainer.addChild(bgBlured);
  blurContainer.mask = containers.getBlurs();

  newCanvas.stage.addChild(blurContainer);
  newCanvas.stage.addChild(blurContainer);

  select.initSelectionRect();
  newCanvas.stage.addChild(select.getSelectionRect());

  canvas.addMainCanvas(newCanvas);
  document.getElementById("container").appendChild(newCanvas.view);
}
 

Инициализируйте холст для обновления курсора при наведении на него мыши

 function _initCursorCanvas(imgData) {
  let cursorCanvas = new PIXI.Application({
    width: imgData.width,
    height: imgData.height,
    transparent: true
  });

  _fillCursorCanvas(cursorCanvas);

  canvas.addCursorCanvas(cursorCanvas);

  document.getElementById("container").appendChild(cursorCanvas.view);
}

function _fillCursorCanvas(cursorCanvas) {
  // emptySprite allows to bind events
  let emptySprite = new PIXI.Sprite();
  emptySprite.interactive = true;
  emptySprite.width = cursorCanvas.screen.width;
  emptySprite.height = cursorCanvas.screen.height;
  cursorCanvas.stage.addChild(emptySprite);

  emptySprite
    .on("pointerdown", canvasEvents.handlerMousedown)
    .on("pointerup", canvasEvents.handlerMouseup)
    .on("pointermove", canvasEvents.handlerMousemove)
    .on("pointerout", canvasEvents.handlerMouseout);

  const scale = W / canvas.getWidth();
  const cursorTexture = new PIXI.Texture.from(
    urlManager.replace("index.php/", "")   "assets/images/cursor_img/50.png"
  );

  let circle = new PIXI.Sprite(cursorTexture);
  circle.width = 50 / scale;
  circle.height = 50 / scale;

  cursorCanvas.stage.addChild(circle);
}
 

Событие перемещения мыши

 const x = e.data.global.x;
const y = e.data.global.y;

cursor.updatePosition(x, y, W);
 

Кто-нибудь знает, как оптимизировать FPS при полете мыши, заранее спасибо !

Ответ №1:

Зачем вам нужен второй холст только для этого? Если вы хотите обновить курсор, сделайте это в конце цикла обновления, и все, не создавайте новый холст только для этого.

Комментарии:

1. Я протестировал, чтобы добавить к основному холсту, но я тоже потерял FPS, поэтому я подумал, что создание нового слоя холста будет лучше, но это не так. У вас есть какие-нибудь предложения ? Я заметил, что получил потерю кадров в секунду, используя маску с pixijs

2. я согласен с @Denis Ambrus в том, что для работы с курсором не должен требоваться второй холст.

3. @heticWyllis дополнительные вопросы: Можете ли вы также показать, что cursor.updatePosition делаете? Как выглядит ваш цикл рендеринга? Было бы лучше, если бы вы создали рабочий пример на jsfiddle, codesandbox или pixiplayground.com — тогда мы могли бы увидеть всю картину в целом и предложить конкретные решения.

4. Извините @domis86 Я пытался использовать codesandbox, но мой браузер не отвечал, поэтому я не могу показать вам пример. В cursor.updatePosition меня попало : const canvasChild = canvas.getCursorCanvas().stage.children; const last = canvasChild.length - 1; canvasChild[last].position.x = x; canvasChild[last].position.y = y; . Я могу отправить вам репо на github ? Большое спасибо

5. @heticWyllis если вы попытаетесь отключить (закомментировать) все, кроме курсора (и пустого спрайта) — это все еще медленно?