Сохранить содержимое <canvas> для перерисовки в последующих кадрах анимации?

StackOverflow https://stackoverflow.com/questions/1067320

  •  21-08-2019
  •  | 
  •  

Вопрос

Я рисую график на <canvas> это требует дорогостоящих расчетов.Я хотел бы создать анимацию (при перемещении мыши по холсту), где график не меняется, но поверх него рисуются какие-то другие объекты.

Поскольку холст придется часто перерисовывать, я не хочу выполнять вычисления для рендеринга графика для каждого кадра.Как я могу нарисовать график один раз, сохранить его, а затем использовать сохраненный рендеринг для перерисовки последующих кадров анимации, чтобы дорогостоящие вычисления выполнялись только один раз, и все, что мне нужно перерисовать, — это гораздо более простой слой анимации?

Я попытался нарисовать график на втором холсте, а затем использовать ctx.drawImage() чтобы отобразить его на основном холсте, но рисование на холсте, похоже, не работает, если оно не находится в dom и не display:none;.Нужно ли мне делать что-то хакерское, например, убрать временное полотно из поля зрения, или есть более чистый способ сделать это?

Это было полезно?

Решение

Вам необходимо использовать как минимум 2 холста:один со сложным рисунком, а второй, поверх первого (того же размера, в абсолютном положении), с анимированными фигурами.Этот метод будет работать в IE, а getImageData не работает с ExCanvas.

Каждая библиотека, которая делает сложные рисунки на холстах, использует этот метод (Флот и другие).

<div style="width: 600px; height: 300px; position: relative;" id="container">
  <canvas class="canvas" style="position: absolute; left: 0px; top: 0px;" width="600" height="300"/>
  <canvas class="overlay" style="position: absolute; left: 0px; top: 0px;" width="600" height="300"/>
</div>

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

Как насчет того, чтобы сначала нарисовать график на холсте, а затем

var imdata = ctx.getImageData(0,0,width,height);

а потом

ctx.putImageData( imdata, 0,0);

для остальной части рендеринга.

Мне пришлось внести некоторые изменения в флот.js библиотека диаграмм.Я на 99% уверен, что здесь используются перекрывающиеся холсты.Есть слой диаграммы и слой наложения.Вы можете посмотреть исходный код.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top