SlideShare a Scribd company logo
Визуализация
автомобильных маршрутов
Денис Гладкий
Инженер-программист, 2ГИС
Постановка задачи
1
Постановка задачи:
маршрут от точки до точки
2
Постановка задачи:
моноширинная линия
3
Постановка задачи:
цветовое кодирование заторов
4
Постановка задачи:
технологические ограничения
Интерактивный режим через OpenGL ES 2.0 API.
5
Постановка задачи:
технологические ограничения
Максимально возможное переиспользование кода.
6
Постановка задачи:
дизайн
7
Постановка задачи:
дизайн
8
Визуализация: входные данные
9
Визуализация: градиент
10
Визуализация: градиент
11
Визуализация: градиент
12
Визуализация: самопересечения
13
Визуализация: самопересечения
14
Подъём при пересечении
охватывающего прямоугольника* предыдущих отрезков:
* англ. «aabb»
Визуализация: самопересечения
15
Визуализация: самопересечения
Cмещение вершин – в пространстве отсечения*:
— мировая система координат – артефакты перспективы;
— система координат камеры – сложность настройки.
* англ. clip space
16
Визуализация: навигация по маршруту
Постоянство градиента:
— визуальная привлекательность;
— понятность пользователю.
=> Нельзя «стирать», модифицируя геометрию при
движении.
17
Визуализация: навигация по маршруту
Решение разработано id Software.
18
Визуализация: навигация по маршруту
uniform float passed_distance; // set on every frame by the CPU
If (pixel_distance_from_start < passed_distance)
{
discard;
}
19
Визуализация: сглаживание
20
Визуализация: сглаживание
21
Визуализация: сглаживание
Фильтрация через буфер шаблона*.
— запись в буфер единицы на интерьере:
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_ALWAYS, 0, 0xFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
— фильтрация, где значение буфера отлично от 0:
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_EQUAL, 0, 0xFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
* англ. stencil buffer
22
Отладка: статистика
~4000 строк кода:
— структуры + функции;
— C++11 STL;
— классы.
23
Отладка: дефекты
— одна порча памяти;
— ~ два выхода за границы массива;
— ~ десять алгоритмических дефектов.
24
Отладка: производительность
Intel Systems Studio
Intel VTune Amplifier
25
Отладка: производительность
Забытый &
void foo(const std::vector<…> zig)
{
}
26
Отладка: производительность
void fun()
{
std::vector<…> zag = … ;
}
↓
void fun(Cache& cache)
{
auto& zag = cache.cached_zag ;
}
27
Отладка: производительность
template<typename T>
std::vector<T> make_vector_with_capacity(const size_t capacity)
{
std::vector<T> result;
result.reserve(capacity);
return result;
}
28
Отладка: производительность
29
Отладка: «зоопарк»
— Видеочипы Intel (Lenovo Vibe X2):
Авост компилятора шейдеров.
— Nvidia Tegra (HTC One X, Motorola Xoom):
16-бит Z-буфер.
— Google Angle (Windows Phone):
некорректная смена состояний (буфер шаблона, т.н. «polygon
offset»).
30
Выводы
— главное «бутылочное горло» - доступ к памяти;
— тестирование, на как можно большем количестве
устройств;
— дословное следование стандартам.
31
Выводы
Многие проблемы интерактивной трёхмерной графики уже
решены в индустрии компьютерных игр:
— Graphic Gems;
— ShaderX;
— GPU Gems;
— GPU Pro;
— jcgt.org.
32
Денис Гладкий
d.gladkiy@2gis.ru
http://droids-life.livejournal.com/
33
Спасибо

More Related Content

Viewers also liked

Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
victor-yastrebov
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
 

Viewers also liked (20)

Concepts lite
Concepts liteConcepts lite
Concepts lite
 
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
 
C++ exceptions
C++ exceptionsC++ exceptions
C++ exceptions
 
QML\Qt Quick на практике
QML\Qt Quick на практикеQML\Qt Quick на практике
QML\Qt Quick на практике
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках II
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IIДмитрий Кашицын, Вывод типов в динамических и не очень языках II
Дмитрий Кашицын, Вывод типов в динамических и не очень языках II
 
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на LinuxПавел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
 
Евгений Крутько, Многопоточные вычисления, современный подход.
Евгений Крутько, Многопоточные вычисления, современный подход.Евгений Крутько, Многопоточные вычисления, современный подход.
Евгений Крутько, Многопоточные вычисления, современный подход.
 
Тененёв Анатолий, Boost.Asio в алгоритмической торговле
Тененёв Анатолий, Boost.Asio в алгоритмической торговлеТененёв Анатолий, Boost.Asio в алгоритмической торговле
Тененёв Анатолий, Boost.Asio в алгоритмической торговле
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IДмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
 
Антон Бикинеев, Reflection in C++Next
Антон Бикинеев,  Reflection in C++NextАнтон Бикинеев,  Reflection in C++Next
Антон Бикинеев, Reflection in C++Next
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптер
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
Clang tidy
Clang tidyClang tidy
Clang tidy
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_cast
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 

More from Platonov Sergey

Categories for the Working C++ Programmer
Categories for the Working C++ ProgrammerCategories for the Working C++ Programmer
Categories for the Working C++ Programmer
Platonov Sergey
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
Platonov Sergey
 

More from Platonov Sergey (12)

Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализация
 
Аскетичная разработка браузера
Аскетичная разработка браузераАскетичная разработка браузера
Аскетичная разработка браузера
 
Денис Кормалев Метаобъектная система Qt
Денис Кормалев Метаобъектная система QtДенис Кормалев Метаобъектная система Qt
Денис Кормалев Метаобъектная система Qt
 
Максим Хижинский Lock-free maps
Максим Хижинский Lock-free mapsМаксим Хижинский Lock-free maps
Максим Хижинский Lock-free maps
 
Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...
Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...
Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...
 
High quality library from scratch
High quality library from scratchHigh quality library from scratch
High quality library from scratch
 
С++ without new and delete
С++ without new and deleteС++ without new and delete
С++ without new and delete
 
Categories for the Working C++ Programmer
Categories for the Working C++ ProgrammerCategories for the Working C++ Programmer
Categories for the Working C++ Programmer
 
Библиотека Boost с нуля на примере Boost.DLL
Библиотека Boost с нуля на примере Boost.DLLБиблиотека Boost с нуля на примере Boost.DLL
Библиотека Boost с нуля на примере Boost.DLL
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
Практика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверПрактика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-сервер
 
С++ without new and delete
С++ without new and deleteС++ without new and delete
С++ without new and delete
 

Визуализация автомобильных маршрутов