#javascript #html #canvas
#javascript #HTML #холст
Вопрос:
Я думаю, что putImageData быстрее, чем drawImage, но мне нужно это доказать.
Я думаю, это тот же случай, что и с Flash и его классами Bitmap и BitmapData. По сути, BitmapData облегчает невизуальное извлечение данных из объекта Bitmap, что позволяет очень легко и быстро манипулировать ими.
Я предполагаю, что в высокопроизводительных случаях, таких как игры, извлечение ImageData из каждого изображения (например, каждого спрайта) и кэширование его в словаре «assets» является лучшим решением, чем многократное рисование самих спрайтов на холсте.
Может ли кто-нибудь это доказать?
Комментарии:
1. Кроме того, putImageData не работает, когда нарушена функция same-origin-police
Ответ №1:
Я не ставлю себе в заслугу объединение этого теста, но вы можете четко видеть производительность использования drawImage()
как с холстом, так и с изображением, а также производительность putImageData()
here:
http://jsperf.com/canvas-drawimage-vs-putimagedata/3
На данный момент drawImage()
намного быстрее, чем putImageData()
. Последнее, что я слышал, это не было предназначено, и разработчики браузера искали пути улучшения разрыва в производительности.
Комментарии:
1. Я понимаю. Мой браузер показывает то же самое. Однако в этом нет особого смысла. Я ожидал, что выполнение манипуляций с использованием ImageData намного быстрее, чем открытие изображения, извлечение его данных и размещение их на холсте. По крайней мере, во Flash манипулирование BitmapData является предпочтительным методом для выполнения операций с производительностью
2. То, как классическая Flash (а не новая Stage3D / Molehill) оптимизирует все, находится в основной памяти, а затем копирует ее в графическую память. Холсты находятся в основном в графической памяти (в зависимости от браузера / версии / фазы Луны), и для изменения пикселей с помощью javascript эти imagedata необходимо будет скопировать в основную память. Затем, чтобы нарисовать эти данные изображения, вам нужно скопировать их обратно в графическую память.
3. Чтение графической памяти с основного процессора происходит ОЧЕНЬ МЕДЛЕННО почти на всех видеокартах… Посмотрите на спецификации для чтения памяти RSX из ячейки на PS3 (запись 4 ГБ / с против чтения 16 МБ / с {{в 256 раз медленнее!}}) ps3devwiki.com /… (Ячейка — это основной процессор, а RSX — графический процессор, разработанный Nvidia)
4. Ссылка, отображающая ошибку приложения. Есть ли вероятность новой ссылки?
5. Ссылка дает «Сбой этой бессерверной функции».
Ответ №2:
Для больших холстов я обнаружил, что это не имеет большого значения, но putImageData определенно не так эффективен, как drawImage для копирования холстов.
Вот несколько тестовых примеров, которые я использовал: http://jsperf.com/canvas-size-test-case/3
В итоге у меня возникли некоторые проблемы с производительностью из-за общего размера исходного холста, независимо от размера данных, которые я фактически копирую.
Комментарии:
1. Ссылка дает «Сбой этой бессерверной функции».
2. Я написал этот пост 9 лет назад! Я думаю, что сервис исчез!