Skip to content

Instantly share code, notes, and snippets.

@MBkkt
Last active May 5, 2020 17:18
Show Gist options
  • Save MBkkt/ddcfb599b71464e559893c872c980d2e to your computer and use it in GitHub Desktop.
Save MBkkt/ddcfb599b71464e559893c872c980d2e to your computer and use it in GitHub Desktop.
Отчет по практике

Отчет по проекту

1. Задачи

Изначальной задачей было написать две рисовалки для библиотеки Legend используемой в проекте Uninav:

  • основная: для OpenGL(когда есть GPU и OpenGL)
  • запасная: для AGG(Anti-Grain Geometry)

Они должны уметь рисовать полилинии, полигоны, текст, растровые и векторные изображения

Их главными преимуществами перед уже имеющимися аналогичными рисовалками, должна была стать меньшая загрузка CPU (например: рисование двух следов корабля за день могло потреблять порядка 30% загрузки главного потока и 200+ Мб памяти, это был хорошо оптимизированный алгоритм).

Засчет чего они должны быть лучше:

  1. Долгий перевод гео координат на проекцию(меркатор на данный момент), осуществляется в другом потоке.
  2. Это statefull рисовалки, данные лучше батчатся, и реже обновляются, чем в текущих stateless рисовалках.

После того как рисовалки будут написаны нужно перевести на них слои Uninav(слои это обьекты отвечающие за рисование какого-то функционала)

  1. Cлой трека(описан выше)
  2. Cлой logbook(бортовой журнал)
  3. Cлой AIS и ARPA целей
  4. Возможно и некоторые другие слои на вроде AIM

2. Текущий результат

Я реализовал асинхронные версии этих рисовалок, но пока еще не добавил программное кроссплатформенное сглаживание в opengl версию.

Также я перевел слой трека на новые рисовалки:

  • В OpenGL использование новой рисовалки дало выигрыш в уменьшении нагрузки главного потока этим слоем с 30% до менее 1%.
  • В AGG примерно в 1.5 - 2 раза повысило FPS, также благодаря новому stateless клиппингу были устранены зависания на аллокациях для boost::geometry::intersection для всех AGG рисовалок.
  • Благодаря другой модели хранения данных (SoA) удалось снизить потребление этим слоем памяти c ~200Мб до ~20Мб

3. Трудности

Главные трудности связаны с тем что код библиотеки Legend(сурс рисовалок) довольно плохого качества и без сложных манипуляций не собирается под linux (я работаю именно под ним, проект и библиотека кросплатформены), а также Legend все еще в процессе перехода со Scons на CMake(я пользуюсь CLion). В целом меня выручает grep и vscode, но работа над библиотекой все еще сильно утомительнее чем над проектом.

Также я все еще испытываю сложности с алгоритмом программного кроссплатформенного сглаживания для OpenGL. У меня есть пару идей, но пока это только dev branch.

Из успешно преодоленных:

  • Использование SoA привлекло к незаметному на взгляд, но ощущаемом на производительности баге, в итоге я несколько дней улучшал производительность AGG рисовалки, хотя на самом деле это не было необходимо, но в итоге производительность AGG возросла, а я пофиксил несколько других багов.
  • Еще так как GL-контекст нельзя трогать из разных потоков реализация этой рисовалки нетривальна. Я использовал классический паттерн с очередью gl задач которые затем исполняются в gl треде. В процессе я выявил баг в thread pool нашего проекта, его деиницилизация вызывалась раньше, чем у некоторых обьектов, которые отправляли в него задачи. Так как до этого не было задач на которых было заметно, что мы ждем не в деиницилизации обьекта, а в деиницилизации пула, этот баг выявился только с очередью, которую при ожидании в gl потоке нужно явно прокручивать.

4. Технологии

Проект Uninav и библиотека Legend полностью написаны на C++, и на данный момент компилируются с поддержкой C++14.

Помимо уже упомянутых библиотек, в своих задачах я использовал boost, qt, thrift.

5. Взаимодействие с командой

Я много взаимодействовал с командой Legend Core, так как это был почти новый для меня код, обсуждал архитектурные решения, которые были приняты в дальнейшем. Пару раз просил помощь с профилированием под windows.

С командой Uninav Core в которой я состою, в основном обсуждал требования к рисовалкам, и баги возникшие в ходе переписывания слоя.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment