Upgrade to Pro — share decks privately, control downloads, hide ads and more …

HTML 5 Canvas

HTML 5 Canvas

Danila Marchenkov

August 25, 2017
Tweet

More Decks by Danila Marchenkov

Other Decks in Programming

Transcript

  1. CONFIDENTIAL 2 Agenda Overview 1 5 4 3 Image Visualisation

    Data Visualisation Scatter Plot 6 WebGL Canvas 2
  2. CONFIDENTIAL 6 IMAGE VISUALISATION • Каждый канал - битная карта

    интенсивности цвета • Изменяемые цвета каналов • Пирамида изображений • Слой пирамиды разрезан на прямоугольные тайлы • Дополнительный вычисляемый слой контуров клеток • Плавность увеличения • Скорость загрузки
  3. CONFIDENTIAL 12 Canvas! CANVAS • Загрузить изображение • ctx.drawImage DOM

    • Создать img тэг • Загрузить файл • Добавить тэг на страницу • Просчитать стили • Просчитать положение • Показать изображение
  4. CONFIDENTIAL 13 Canvas! PROS CONS • Отличная скорость • Предсказуемость

    поведения • Гибкость • Сложность разработки • Сложность поддержки • Сложность тестирования • Поддержка событий только на уровне элемента
  5. CONFIDENTIAL 16 • Двойная буферизация • Нормирование данных перед отрисовкой

    • Кластеризация по цвету • Кластеризация по расстоянию • Кэширование отрисованных ранее примитивов • Отрисовка только разниц между кадрами • Игнорирование объектов, не попадающих во viewport Scatter Plot • Поддержка экранов с высокой плотностью пикселей (Retina) • Допустимое количество клеток не ограничено
  6. CONFIDENTIAL 18 Scatter Plot • Canvas 4500x1800px (sic!) • 500x200

    кружочков • Заливка • Обводка • Минимальное количество строк кода
  7. CONFIDENTIAL 19 TIME TO FIRST FRAME <canvas id=‘canvas'></cavnas> <script> (()

    => { let canvas = document.getElementById("canvas"), ctx = canvas.getContext('2d'), xIterations = 500, yIterations = 200, circleRadius = 9; canvas.width = 4500; canvas.height = 1800; for (let i = 0; i < yIterations; i++) { for (let j = 0; j < xIterations; j++) { ctx.beginPath(); ctx.fillStyle = 'lightgreen'; ctx.strokeStyle = 'black'; ctx.moveTo(circleRadius + j * 2 * circleRadius + 1, circleRadius + i * 2 * circleRadius + 1); ctx.arc(circleRadius + j * 2 * circleRadius + 1, circleRadius + i * 2 * circleRadius + 1, circleRadius, 0, 2 * Math.PI); ctx.stroke(); ctx.fill(); } } })(); </script>
  8. CONFIDENTIAL <canvas id='canvas'></canvas> <script> (() => { let canvas =

    document.getElementById("canvas"), offscreenCanvas = document.createElement("canvas"); offscreenCtx = offscreenCanvas.getContext('2d'); ctx = canvas.getContext('2d'), xIterations = 500, yIterations = 200, circleRadius = 9; canvas.width = 4500; canvas.height = 1800; offscreenCanvas.width = offscreenCanvas.height = circleRadius * 2 + 2; offscreenCtx.arc(circleRadius, circleRadius, circleRadius, 0, 2 * Math.PI); offscreenCtx.fillStyle = 'lightgreen'; offscreenCtx.strokeStyle = 'black'; offscreenCtx.stroke(); offscreenCtx.fill(); for (let i = 0; i < yIterations; i++) { for (let j = 0; j < xIterations; j++) { ctx.drawImage(offscreenCanvas, j * 2 * circleRadius + 1, i * 2 * circleRadius + 1); } } })(); </script> 20 TIME TO FIRST FRAME
  9. CONFIDENTIAL TIME TO FIRST FRAME 0ms 1750ms 3500ms 5250ms 7000ms

    HTML SVG CANVAS Loading Scripting Rendering Painting Other 21 0ms 1000ms 2000ms 3000ms 4000ms HTML SVG CANVAS Loading Scripting Rendering Painting Other
  10. CONFIDENTIAL 24 WebGL! • САМАЯ лучшая производительность • ОТЛИЧНАЯ кроссбраузерная

    поддержка • САМЫЕ безумные хаки • САМАЯ чистая магия • ОЧЕНЬ высокий порог вхождения • ОГРОМНОЕ количество кода • GLSL