Top Banner
Владимир Агафонкин высокопроизводительные визуализации данных в браузере март 2013
104

CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

Nov 14, 2014

Download

Documents

CodeFest

 
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

Владимир Агафонкин

высокопроизводительные визуализации данных

в браузере

март 2013

Page 2: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

agafonkin.com

/mourner

Page 3: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

rain.in.ua

Page 4: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

визуализации данных

Page 5: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере
Page 6: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере
Page 7: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере
Page 8: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере
Page 9: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере
Page 10: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере
Page 11: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

интерактивность

Page 12: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

•реагирование на действия пользователя

интерактивность

Page 13: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

•реагирование на действия пользователя

•навигация по данным

интерактивность

Page 14: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

•реагирование на действия пользователя

•навигация по данным

•фильтрация данных

интерактивность

Page 15: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере
Page 16: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере
Page 17: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере
Page 18: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере
Page 19: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере
Page 20: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

потребность в интерактивности увеличивается

Page 21: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

ответственность за обработку данных всё больше смещается

от сервера к клиенту

Page 22: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

чистый JS — быстро

рендеринг, DOM — медленно

Page 23: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

правило №1чем меньше всего

отображаем, тем быстрее

Page 24: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

обработка данных рендеринг

Page 25: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

обработка данных рендеринг

Page 26: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

•фильтрация объектовуменьшение данных

Page 27: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

•фильтрация объектов•геометрическое отсечение

уменьшение данных

Page 28: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

•фильтрация объектов•геометрическое отсечение•геометрическое упрощение

уменьшение данных

Page 29: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

•фильтрация объектов•геометрическое отсечение•геометрическое упрощение•кластеризация (группировка)

уменьшение данных

Page 30: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

фильтрация

Page 31: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

поиск 2D-объектов

•поиск объектов в текущей прямоугольной видимой области

Page 32: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

поиск 2D-объектов

•поиск объектов в текущей прямоугольной видимой области

•поиск объектов в точке (под курсором)

Page 33: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

загрузка данных — 1 раз

поиск/фильтрация — много раз

Page 34: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

сетка

Page 35: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере
Page 36: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

древовидные структуры данных

•binary heap

•binary search tree

•range tree

•k-d tree

•quadtree

•R-tree

Page 37: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

точки в quadtree

Page 38: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

прямоугольники в R-tree

Page 39: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

var tree = new RTree();

tree.insert( {x: 5, y: 10, w: 10, h: 15}, obj);

...

tree.search( {x: 7, y: 7, w: 5, h: 5});

github.com/imbcmdth/RTree

Page 40: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

kothic.org/js

Page 41: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

определение коллизий

Page 42: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

Crossfilter (для многих измерений)

Page 43: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

отсечение ломаных линийалгоритм Коэна-Сазерленда

Page 44: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

отсечение полигоновалгоритм Сазерленда-Ходжмана

Page 45: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

упрощение ломаных линий

Page 46: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

упрощение по расстоянию

Page 47: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

алгоритм Дугласа-Пекера

Page 48: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

mourner.github.com/simplify-js

Page 49: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

кластеризациягруппировка похожих объектов

Page 50: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере
Page 51: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере
Page 52: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

иерархическая кластеризация

1 раз для всех масштабов

Page 53: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

загрузка и обработка данных

Page 54: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

UI JS UI

Page 55: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

UI JS

браузер залипаетна объемных вычислениях

UI

Page 56: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

Web Workers

Page 57: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

<script src='data.js'></script>

<script>...worker.postMessage(HUGE_DATA_ARRAY);...</script>

загрузка и пересылка в Worker

Page 58: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

UI

Worker JS

загрузка данных UI

Page 59: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

UI

Worker JS

браузер залипает на загрузке и пересылке данных

загрузка данных UI

Page 60: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

importScripts('data.js');

...

onmessage = function (e) { var result = searchData(e.data.query);

postMessage(result);}

загрузка в Worker

Page 61: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

UI

Worker JSзагрузка данных

UIUI

Page 62: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

UI

Worker JS

браузер залипает на получении данных

загрузка данных

UIUI

Page 63: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

var array = new Float16Array(len);...

var buffer = array.buffer;

postMessage(buffer, [buffer]);

// с этого момента buffer недоступен

transferable objects(Chrome, Firefox)

Page 64: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

UI

Worker JSзагрузка данных

UIUI

Page 65: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

UI

Worker JS

браузер не залипает, данные пересылаются как ArrayBuffer

загрузка данных

UIUI

Page 66: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

function addNumbers(a, b) { 'use asm';

a = a | 0; // int b = +b; // double

return +(a + b); // double}

светлое будущее — asm.js

Page 67: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

светлое будущее — asm.js

•оптимизация узких мест вычислений

Page 68: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

светлое будущее — asm.js

•оптимизация узких мест вычислений

•пока только в FF Nightly

Page 69: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

светлое будущее — asm.js

•оптимизация узких мест вычислений

•пока только в FF Nightly

•обратная совместимость!

Page 70: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

технологии рендерингаSVG, Canvas, HTML, WebGL

Page 71: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

SVG

•быстрые нативные события для интерактивности

Page 72: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

SVG

•быстрые нативные события для интерактивности

•легко обновлять отдельные объекты

Page 73: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

SVG

•быстрые нативные события для интерактивности

•легко обновлять отдельные объекты

•тормозит страницу (при большом кол-ве объектов)

Page 74: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

Canvas

•после отрисовки не влияет на отзывчивость страницы

Page 75: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

Canvas

•после отрисовки не влияет на отзывчивость страницы

•повторяющиеся части можно отрисовать один раз и раскопировать

Page 76: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

Canvas

•после отрисовки не влияет на отзывчивость страницы

•повторяющиеся части можно отрисовать один раз и раскопировать

•можно попиксельно рисовать/обрабатывать в Worker

Page 77: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

Canvas

•дорого перерисовывать при каждом обновлении

Page 78: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

Canvas

•дорого перерисовывать при каждом обновлении

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

Page 79: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

WebGL

•основной способ для 3D-визуализаций

Page 80: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

WebGL

•основной способ для 3D-визуализаций

•очень быстро в 2D, если нужно отрисовать много спрайтов

Page 81: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

WebGL

•основной способ для 3D-визуализаций

•очень быстро в 2D, если нужно отрисовать много спрайтов

•в остальных случаях преимущество в скорости перед Canvas-2D спорно

Page 82: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

WebGL

•основной способ для 3D-визуализаций

•очень быстро в 2D, если нужно отрисовать много спрайтов

•в остальных случаях преимущество в скорости перед Canvas-2D спорно

•API намного сложнее и неудобнее

Page 83: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

WebGL

•основной способ для 3D-визуализаций

•очень быстро в 2D, если нужно отрисовать много спрайтов

•в остальных случаях преимущество в скорости перед Canvas-2D спорно

•API намного сложнее и неудобнее

•поддержки в IE и iOS не ожидается

Page 84: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

HTML

•удобно использовать для текста и элементов интерфейса

Page 85: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

HTML

•удобно использовать для текста и элементов интерфейса

•очень удобно анимировать с помощью CSS Transitions

Page 86: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

HTML

•удобно использовать для текста и элементов интерфейса

•очень удобно анимировать с помощью CSS Transitions

•тормозит страницу при большом кол-ве объектов

Page 87: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

производительность Canvas

Page 88: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

частичная перерисовка

Page 89: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

частичная перерисовка

Page 90: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

частичная перерисовка

Page 91: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

function drawStar(x, y) { ... // нарисовать звезду в x, y}

drawStar(10, 20);drawStar(50, 70);...

Page 92: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

function drawStar() { var canvas = document.createElement('canvas'); ... // нарисовать звезду return canvas;}

var star = drawStar();

ctx.drawImage(star, 10, 20);ctx.drawImage(star, 50, 70);...

копирование

Page 93: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

группируйте отрисовку по стилям, минимизируйте stroke/fill

Page 94: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

function drawLine(x1, x2, y1, y2) { ctx.strokeStyle = 'red'; ctx.beginPath(); ctx.moveTo(x1, y1); ctx.lineTo(x2, y2); ctx.stroke();}

drawLine(10, 20, 30, 40);drawLine(200, 10, 0, 50);drawLine(30, 40, 70, 0);

Page 95: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

function drawLine(x1, x2, y1, y2) { ctx.beginPath(); ctx.moveTo(x1, y1); ctx.lineTo(x2, y2);}

ctx.strokeStyle = 'red';

drawLine(10, 20, 30, 40);drawLine(200, 10, 0, 50);drawLine(30, 40, 70, 0);

ctx.stroke();

Page 96: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

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

worker.postMessage(data, [data]);

...

worker.onmessage = function (e) { var imageData = ctx.createImageData(width, height);

imageData.data.set(e.data);

ctx.putImageData(imageData, 0, 0);}

Canvas + Worker

Page 97: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

var pixels = new Uint8ClampedArray( width * height);

function drawPixel(x, y, r, g, b, a) { var i = 4 * (256 * y + x);

pixels[i] = r; pixels[i + 1] = g; pixels[i + 2] = b; pixels[i + 3] = a;}

...

postMessage(pixels.buffer, [pixels.buffer]);

рисование пикселей в Worker

Page 98: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

var pixels = new Uint8ClampedArray(data);

for (var x = 0; x < width; x++) { for (var y = 0; y < height; y++) { var i = 4 * (256 * y + x);

pixels[i] = 2 * pixels[i]; pixels[i + 1] = 2 * pixels[i + 1]; pixels[i + 2] = 2 * pixels[i + 2]; }}

...

postMessage(pixels.buffer, [pixels.buffer]);

обработка пикселей в Worker

Page 99: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

UTFGrid

Page 100: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

UTFGrid

•65535 разных символов

Page 101: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

UTFGrid

•65535 разных символов

•каждый символ — 4х4 пикселя

Page 102: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

UTFGrid

•65535 разных символов

•каждый символ — 4х4 пикселя

•сетка + маппинг

Page 103: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

UTFGrid

•65535 разных символов

•каждый символ — 4х4 пикселя

•сетка + маппинг

•в среднем 1-3 КБ на тайл 256х256

Page 104: CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в браузере

Спасибо!Вопросы?

Владимир Агафонкин[email protected]