Каков наиболее эффективный способ разбить изображение с помощью холста?

Недавно я работал над платформером и хотел бы добавить в него несколько изображений. Моя цель — замостить изображение, используя как можно меньше CPU/GPU, и я пробовал два решения: рисовать каждое изображение с помощью drawImage() и использовать стиль заливки createPattern.

for метод петли:

ctx = canvas.getContext("2d");

for (let i=0; i<heightInTiles; i++) { 
  for (let j=0; j<widthInTiles; j++) {
    ctx.drawImage(image, screenX + j * blockSize, screenY + i * blockSize);
  }
}

Проблема с этим решением заключается в том, что рисование каждого изображения по отдельности потребляет много ресурсов процессора и графического процессора. Есть ли способ сделать это более эффективным? (Например, 50-процентная загрузка ЦП?)

fillStyle метод

var pat = ctx.createPattern(image, "repeat");
ctx.fillStyle = pat;
ctx.fillRect(screenX, screenY,   
             widthInBlocks * blockSize,
             heightInBlocks * blockSize);

Это решение занимает меньше места, но имеет странный эффект: шаблон выравнивается только по верхнему левому углу холста.

Я просто ищу более быстрый способ рисовать нужные мне плитки на экране. Не могли бы вы, ребята, помочь мне с этим?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
566
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Преобразование узора

Шаблон — это, безусловно, самый быстрый способ повторить шаблон с помощью 2D API. Для лучших результатов вам нужно будет использовать WebGL.

Чтобы переместить шаблон, вам нужно манипулировать преобразованием с помощью pattern.setTransform( через DOMMatrix

Пример

Установка начальной позиции паттерна

var pat = ctx.createPattern(image, "repeat");
pat.setTransform(new DOMMatrix([1,0,0,1,screenX, screenY])); // set top left starting 
                                                             // pos of pattern
ctx.fillStyle = pat;
ctx.fillRect(screenX, screenY, widthInBlocks * blockSize, heightInBlocks * blockSize);

придирка: DOMMatrix требует new. И хотя я знаю, что вы знаете, просто обратите внимание, что для старых браузеров, которые не поддерживают CanvasPattern.setTransform, вы также можете установить один из контекста и противодействовать переводу в вызове fillRect или даже разделить объявление пути и заполнение на два различные матричные преобразования.

Kaiido 17.12.2020 04:11

@Kaiido На SO есть множество устаревших примеров, например stackoverflow.com/a/47838137/3877726

Blindman67 17.12.2020 04:26

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