2017-02-21 1 views
2

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

ответ

2

К сожалению нет, все нарисованное на холсте рисуется с использованием композитинга (Porter-Duff) и правил смешивания независимо от того, что уже есть перед ним (применяется одна и та же математика).

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

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

Браузер поставщика может выбрал для оптимизации для конкретных случаев, но в целом, и независимо от существующего контента: все проходит через режим смешивания, состав и, наконец, альфа-смешивание с фоном, на уровне контекста - это производит точечный рисунок, используемый для следующего шага (или того, что мы можем извлечь как изображение). Затем что-то похожее на уровне элемента/DOM, чтобы холст и его содержимое сливались с остальной частью содержимого страницы/DOM, но где альфа-канал можно рассматривать особым образом:

Одно исключение в отношении производительности , также в общем случае, когда браузеру требуется составная и альфа-смесь элемента canvas с фоном (т. е. все за элементом). Если альфа-канал отключен для элемента canvas, браузер может оптимизировать этот шаг, который дает нам немного большую производительность.

Чтобы отключить альфа-канал для 2D-контекста вы просто передать в опции:

var ctx = canvas.getContext("2d", {alpha: false}); 
+0

Я действительно без знания по этому вопросу; не существует ли какой-то премнодательной вещи с drawImage? Кроме того, означает ли это, что рисование полного непрозрачного - это то же самое, что смешивание разных значений альфа? (Я могу понять, что эти различия настолько малы, что никто не заботится, но никакой разницы вообще не странно для меня). – Kaiido

+1

@ Кайдо, вероятно, у вас есть последнее альфа-смешение. Если есть альфа-канал, браузер должен объединить его (на уровне элемента) с базовой графикой, но если он отсутствует, этот шаг может быть пропущен (например, {alpha: false} в параметрах контекста), но он все равно должен составьте входящую исходную графику, включая альфа-канал на самом холсте (уровень контекста). Шаг предварительного расчета перемещает непрозрачность к компонентам цвета с использованием умножения (что приводит к ошибкам округления в некоторых случаях), но это не обязательно делается внутренне, так как каналы могут храниться отдельно. – K3N

+1

Премультипликация происходит с getImagedata/putImageData. Я не совсем уверен, почему это необходимо, поскольку необработанное растровое изображение могло быть сброшено как «прямое» (т. Е. Без умножения) и premul. обычно используется для * удаления * альфа-канала полностью, чтобы создать вместо него матовый (где уровень непрозрачности для каждого компонента делается для представления того, что было бы его альфа-уровнем).Я не слишком углублялся в то, почему они выбрали этот путь, хотя, но для самого контекста всегда применяется привратник-дафф (кроме как clearRect, а смешивание всегда использует источник), а затем альфа-смешивание. – K3N

1

Для двух действий потребуется ровно столько же времени, потому что они оба выполняют одно и то же действие. Результат пикселов не изменяет скорость того, сколько времени потребуется для выполнения кода :)

Не имеет значения, изменились ли пиксели или нет, пиксели обновить в любом случае.

Смежные вопросы