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

"Howto: интерактивная визуализация на сотни тыс...

Avatar for Quantori Quantori
November 14, 2021

"Howto: интерактивная визуализация на сотни тысяч элементов внутри браузера"

Иван Затравкин, Chief Software Engineer

"В этом докладе мы рассмотрим комплексный подход к решению проблемы взаимодействия в режиме реального времени с датасетами в сотни тысяч элементов. Обязательно поговорим о технологиях браузера, которые можно использованы в подобных сценариях: WebAssembly, WebWorkers, WebGL (спойлер: не все из них пригодились и принесли ожидаемые результаты). Не избежать и разговора о будущем: заглянем вперед и посмотрим, как подобное будет решаться в браузере через несколько лет."

Avatar for Quantori

Quantori

November 14, 2021
Tweet

More Decks by Quantori

Other Decks in Programming

Transcript

  1. quantori.com 6 Что нам удалось достичь - Увеличили допустимый размер

    датасета с 5000 до ~1,000,000 точек; - Увеличили допустимое количество фильтров с 8 до неограниченного; - Значительно расширили функционал.
  2. quantori.com 7 Компоненты решения - Быстрая фильтрация - WebAssembly, алгоритмы

    - Быстрая интерактивность - Структуры данных - Быстрая визуализация - WebGL
  3. quantori.com 9 WebAssembly https://developer.mozilla.org/ru/docs/WebAssembly “WebAssembly – это новый открытый формат

    байт-кода, исполняемого современными браузерами.” “WebAssembly ... предоставляет способ исполнения кода ... со скоростью близкой к нативной, чего ранее невозможно было достичь.”
  4. quantori.com 10 WebAssembly example #include <emscripten/bind.h> using namespace emscripten; float

    add(float a, float b) { return a + b; } EMSCRIPTEN_BINDINGS(my_module) { function("add", &add); }
  5. quantori.com 11 WebAssembly: SQLite https://sql.js.org - In-memory база данных внутри

    WebAssembly - Возможность писать обычный SQL для фильтрации данных
  6. quantori.com 13 Почему WebAssembly медленно - WebAssembly - виртуальная машина

    - WebAssembly работает параллельно с JS (registry pressure) - Медленный обмен данными с JS https://www.usenix.org/system/files/atc19-jangda.pdf
  7. quantori.com 14 JavaScript - быстрый function h(k) { return k

    * (k + 3) % 7919; } function benchmark() { let k = 12; for (let i = 0; i < 100000000; i++) { k = h(k); } return k; } native -O3 389ms JS 384ms WASM 483ms https://www.reddit.com/r/WebAssembly/comments/kk9vuv/webassembly_much_slower_than_js_in_this_benchmark/ [benchmark source]
  8. quantori.com 15 JS solution - Фильтрация происходит мышкой -> маленькие

    изменения - Можно пересчитывать только границы - Первичная фильтрация предикатом - В 10 раз быстрее SQL и 100+ раз быстрее начальной версии
  9. quantori.com 21 PixiJS https://github.com/pixijs/pixijs/blob/a0a1b668194e6f6de2399fae1fd ef8fa63efda70/packages/interaction/src/TreeSearch.ts#L13 const children = (displayObject as

    Container).children; for (let i = children.length - 1; i >= 0; i--) { const child = children[i]; // time to get recursive.. if this function will return if something is hit.. const childHit = this.recursiveFindHit(interactionEvent, child, func, hitTest, interactiveParent); ...
  10. quantori.com 25 Где может использоваться - Отображение информации на картах

    - Подгрузка уровней в играх - Оптимизация алгоритмов: поиск пути, пересечения и тд - Расчет освещения - Многое другое, где данные связаны с пространством
  11. quantori.com 28 PixiJS PixiJS - библиотека в первую очередь для

    игр. Ни одна из предоставляемых возможностей не используется. Значительный overhead на использование абстракций Pixi.
  12. quantori.com 31 WebGL - shaders //переменные передающиеся между стадиями varying

    vec4 color; //переменные уникальные для каждой вершины attribute vec2 a_position; //переменные общие для всех вершин uniform vec2 u_resolution; //координата вершины gl_Position = vec3(1.,1.,1.); //итоговый цвет пикселя gl_FragColor = vec4(1.,1.,1.,1.);
  13. quantori.com 32 WebGL - результат Потребление памяти одного графика на

    60k точек: 280mb -> 60mb Время добавления одного графика на 60k точек: 1800ms -> 400ms