Как стать автором
Обновить
111.71
АСКОН
Крупнейший российский разработчик инженерного ПО

Как мы разогнали САПР КОМПАС-3D → Часть 2

Время на прочтение 8 мин
Количество просмотров 11K
В прошлой части мы рассказывали о зарождении КОМПАС-3D v18, кое-что о выборе критериев и моделей для тестирования новых функций, а также затронули тему отрисовки в варианте «Базовый».
Продолжим рассказом о варианте отрисовки «Улучшенный».


Отрисовочные вызовы

Александр Тулуп, программист:
«Основная проблема производительности отображения больших сцен связана с большим числом так называемых «отрисовочных вызовов». Старая версия отрисовки построена поверх математической модели данных. Таким образом, для каждого примитива — точки, ребра, грани — вызывался отдельный метод для своего отображения.

На каждый «отрисовочный вызов» (draw call) OpenGL (драйвер) выполняет ряд проверок, попутно переводя поступающие команды в формат, понятный видеокарте, после чего вызовы складываются в очередь и уже оттуда поступают на выполнение.


Схема передачи команд на GPU в OpenGL (источник)

При большом числе деталей количество обращений к CPU вырастает настолько, что данные просто не успевают поступать на видеокарту. Мы получаем ситуацию, когда на очень сильной видеокарте «тормозит» так же, как и на средней или более слабой.

Бороться с этим можно через уменьшение числа отрисовок (смены состояний) — группировать по материалу, объединять общую геометрию (instancing) и т. д.

Не следует забывать, что из всей сцены мы видим только некоторую её часть. Тут применимы алгоритмы определения невидимых объектов (frustum culling, occlusion culling, etc.)

Вдохновившись примером The Road to One Million Draws и AZDO, мы решили пойти довольно непривычным путем: избавиться от смены состояний на стороне CPU насколько это возможно. Теперь почти все выполняется на видеокарте. Все необходимые атрибуты достаются напрямую из видеопамяти во время рисования из самого шейдера (shader), что стало возможным благодаря увеличению объемов видеопамяти (VRAM) и появлению SSBO.


1 000 000 кубиков

Из достоинств такого подхода: скорость отображения стала действительно высокой. Скорость ограничена только возможностями GPU, а именно объемом данных, который он способен обработать.

Также это позволило достаточно эффективно реализовать механизмы отсечения невидимых объектов. Результаты проверки видимости записываются напрямую в видеопамять и оттуда же на их основе формируются команды на рисование. То есть на стороне CPU ждать не нужно.

Один из главных недостатков такого подхода — это высокая сложность разработки. Многое приходится реализовывать заново, с учетом выбранного подхода. К тому же, часто приходилось сталкиваться с ситуацией, когда один и тот же код шейдера работал по-разному или не работал вовсе на видеокартах разных производителей. Часто такое «лечилось» обновлением драйвера, но иногда после долгой отладки приходилось переписывать код.

Естественно, требования к видеокарте тоже возросли. Поддержка OpenGL 4.5 является ключевым, но не единственным требованием.
Ниже приведем полученные результаты скорости отрисовки при вращении сборки. Напомним, комфортными показателями для человеческого глаза считаются 24 кадра в секунду (fps).
Здесь и далее по тексту замеры проведены на ПК со следующей конфигурацией:
CPU: Intel Core i7-6700K 4.00 GHz
RAM: 32 Gb
GPU: NVidia Quadro P2000
OS: Microsoft Windows 10 x64 Professional
Таблица 1. Скорость смены кадров (количество кадров в секунду, fps) на различных моделях. Больше — лучше. Режим отображения: Полутон+каркас, упрощенный режим отключен, качество сглаживания: среднее (MSAA 8x)
Модель Количество
компонентов
Скорость смены кадров, fps
V16.1 v17.1 v18
image
Машина
мозаично-шлифовальная

2764 4,1 4,7 124,9

ПГУ-410
108337 0,3 0,4 28,6

Вагоноопрокидыватель
17342 1,1 1,4 124,7

Троллейбус
9783 1,9 2,4 124,9

Северная приливная
электростанция
48445 0,3 0,5 76,1

Установка
вакуумно-технологическая
7189 1,9 2,3 124,9

Редуктор судовой
энергетической установки
6414 2,6 3,6 123,9


Добавление компонентов в большую сборку


Сценарий с добавлением компонентов в большую сборку со временем перерос в так называемый комплексный тест, который описан в таблице 2.

Таблица 2. Сценарий с добавлением компонентов в большую сборку. Критерии тестирования.
Критерий Описание критерия
Скорость открытия файлов Добавляемый в сборку компонент нужно загрузить с диска
Скорость отрисовки Сборку и вставляемый компонент нужно позиционировать, для этого требуется повернуть/переместить/зуммировать изображение
Скорость выбора объектов Для создания сопряжений нужно выбирать базовые объекты: грани, плоскости, ребра и т. д.
Скорость синхронизации с деревом построения Добавленный в сборку компонент и его сопряжения должны быть представлены в дереве построения
Скорость синхронизации с модулем спецификации Добавленный в сборку компонент должен учитываться в спецификации

В таблице можно увидеть пункты (отрисовка, открытие), которые с самого начала были выбраны как отдельные направления ускорений. Но доработки требовали другие составляющие.

Существенное время занимала синхронизация с деревом. Мы решили проблему, реализовав его частичное обновление.

Другой сложностью было значительное влияние характеристик спецификации на производительность КОМПАС-3D. На некоторых сценариях комплексного теста эта составляющая была основной (50% и более).
Спецификация
Спецификация — модуль системы КОМПАС-3D, который отвечает за формирование одноименного конструкторского документа. Его разрабатывает отдельная команда.

В частности, команда ускорила синхронизацию при вставке за счет переделки внутренних механизмов модуля спецификации.


Некоторые результаты


Добавляем компоненты в сборку «Редуктор судовой энергетической установки».


Комплексный тест для сборки «Редуктор судовой энергетической установки».
Цифрами показаны: 1 — кронштейн, 2 — шайба, 3 — болт.


Таблица 3. Время вставки компонентов в большую сборку в секундах. Меньше — лучше.
Компонент Действие Время, с
V16.1 v17.1 v18
Вставка
компонента
Кронштейн

Загрузка 2,0 3,0 2,2
Переключение на способ по сопряжениям 0,6 0,4 0,4
Первое сопряжение Выбор первого объекта 0,4 1,0 0,2
Выбор второго объекта 0,5 1,1 0,2
Выбор нужного сопряжения 3,8 3,6 1,0
Второе сопряжение Выбор первого объекта 0,5 1,4 0,5
Выбор второго объекта 0,5 1,4 0,2
Выбор нужного сопряжения 3,6 3,0 1,2
Третье сопряжение Выбор первого объекта 0,5 0,5 0,5
Выбор второго объекта 0,3 1,1 0,3
Выбор нужного сопряжения 3,7 3,2 1,1
Подтвердить создание вставки 7,8 5,2 2,3
Суммарно вставка Кронштейна 24,2 24,6 10,1
Вставка
шайбы
из библиотеки
стандартных
изделий



Выбор первого сопряжения 6,4 2,4 0,4
Выбор второго сопряжения 4,2 3,1 0,4
Подтвердить создание вставки 15,7 9,2 4,4
Суммарно для вставки Шайбы 26,3 14,7 5,2
Вставка
болта

Загрузка 2,0 2,7 2,0
Переключение на способ по сопряжениям 0,5 0,5 0,5
Первое сопряжение Выбор первого объекта 0,4 1,0 0,2
Выбор второго объекта 0,4 1,1 0,2
Выбор нужного сопряжения 3,4 2,7 1,0
Второе сопряжение Выбор первого объекта 0,4 1,2 0,4
Выбор второго объекта 0,5 0,5 0,4
Выбор нужного сопряжения 3,7 2,9 1,0
Третье сопряжение Выбор первого объекта 0,5 1,0 0,5
Выбор второго объекта 0,5 1,0 0,2
Выбор нужного сопряжения 4,2 3,9 1,2
Подтвердить создание вставки 32,5 5,4 2,2
Суммарно для вставки Болта 49 21,2 9,8
Суммарно вставка трех компонентов 99,5 60,5 25,1


Комплексный тест можно рассматривать как один из сценариев редактирования сборки (из числа часто встречающихся).

Помимо этого, ускорилось перестроение сборок. Теперь, если отредактировать какую-либо операцию, не произойдет полного перестроения всей сборки — будут обновлены только измененные объекты. Для определения зависимых операций, т. е. тех операций, на результат которых мог повлиять результат измененной операции, используется специальный алгоритм, который строит связи между операциями, телами и вставками.

Открытие сборок


Основная идея повысить скорость чтения файлов — сделать так, чтобы КОМПАС-3D читал только то, что требуется пользователю в данный момент.

Например:

  • читать только текущее исполнение для вставок сборки,
  • для типов загрузки читать только нужную информацию: триангуляцию или триангуляцию+результаты (B-rep).

Все это потребовало доработки структуры данных в файле, чтобы можно было вычитывать его отдельные части.

Антон Сидякин, программист, teamlead:

«С некоторых пор файл КОМПАС-3D представляет из себя архив, объединяющий несколько служебных файлов. Один из них содержит данные о документе модели/сборки, организованные в древовидную структуру. Возможность навигации по этой структуре уже была. Для частичного чтения нужно было обеспечить независимость частей друг от друга. Таким образом, полученные части не должны были ссылаться друг на друга, иначе часть со ссылкой стала бы «неполноценной».

В результате для деталей удалось отделить исполнения от документа и друг от друга. В сборках контейнер вставок и сопряжений выделен отдельно. Внутри исполнений также получилось разделить исходные данные для построения и результаты в виде триангуляции и тел.



Если говорить про упрощенные типы загрузки, то редактируемая сборка загружается полностью, а из ее вставок загружается только триангуляция и, в зависимости от типа, граничное представление (B-rep). Некоторые сложности представляло отображение в данном режиме вставок с измененными внешними переменными, поскольку они ранее получались «на лету» с помощью перестроения при чтении, а в упрощенных типах загрузки нет данных для этого. Решением стало записать результаты перестроения таких вставок в сборку. Это дало ускорение и за счет отсутствия перестроения.

Описанное разделение документа на части позволило загружать в сборку только выбранные во вставках исполнения.
Помимо ускорения открытия файлов, частичное чтение также помогло сократить потребляемые ресурсы — в первую очередь оперативной памяти.

На базе доработок возник и новый тип загрузки сборки – «Частичный». В данном типе загрузки из файла вычитываются только результаты (тела, поверхности) и триангуляция. Частичная загрузка позволяет создавать сопряжения и близка с точки зрения функциональности к полной загрузке компонентов.

После реализации доработок по частичному чтению перспективным становится создание пользовательских типов загрузки.

Подсказка
Пользовательские типы загрузки представляют собой комбинации системных способов загрузки компонента. Функция эта не новая, но доработки, выполненные в v18, позволяют получить заметные бонусы от ее использования.


Для компонентов, которые не важны для дальнейших построений, может быть применен тип загрузки «Пустой». Это могут быть компоненты, скрытые внутри других («внутрянка»). В v18 компоненты (и целые сборки) с типом загрузки «Пустой» открываются практически моментально.

Таблица 4. Время открытия сборок с типами загрузки «Пустой» и «Габарит» в секундах. Меньше — лучше.
Модель Тип загрузки Время открытия, с
V16.1 v17.1 v18

Установка
вакуумно-технологическая
Пустой 12,8 11,7 2,5
Габарит 21,2 20,8 2,6

Редуктор судовой
энергетической установки
Пустой 31,0 15,9 7,2
Габарит 371,5 114,8 7,3


Остальные компоненты, которые нужны для понимания внешнего вида изделия или будут использоваться в качестве опорных объектов для дальнейшего построения, могут быть загружены «Полностью» или «Частично».

В качестве инструмента подготовки пользовательских типов загрузки можно использовать новые команды выбора «невидимых» компонентов. Применяем команду и далее с помощью контекстного меню меняем тип загрузки для выбранных компонентов на «Пустой».

Проецирование


При ускорении проецирования мы задались вопросом фильтрации данных, поступающих на вход математическому ядру.

В первую очередь решили фильтровать невидимые компоненты/тела. Для этой цели задействовали механизм отсечения невидимых тел (occlusion-culling) — он позволяет узнать, видно ли тело, которое будет проецироваться или оно закрывается и находится внутри какого-то другого тела. Эта операция производится на стороне видеокарты.

Наибольший эффект будет при создании проекций моделей с большим количеством компонентов, скрытых внутри замкнутых объемов, например:

  • сложные приводы, редукторы и т. д.,
  • транспортные средства,
  • строения,
  • шкафы с электрооборудованием.

За включение отвечает опция «Черновое проецирование». Название неслучайное — в масштабах сборки могут быть не спроецированы относительно мелкие детали (например болт в масштабах электростанции). Многих пользователей такое положение вещей устроит, особенно в случае создания габаритных чертежей и чертежей общего вида.

Подробнее про опцию «Черновое проецирование»
Опция доступна только для стандартных проекций. Для уточняющих изображений (разрезы, сечения, выносные виды) «Черновое проецирование» не задействуется.


Даже без использования этой опции проецирование заметно ускорилось по сравнению с V16 и v17. Этому помогли доработки на стороне математического ядра.

Таблица 5. Время создания трех стандартных проекций в секундах. Меньше — лучше.
Модель Время создания трех стандартных проекций, с
V16.1 v17.1 v18
Включено
черновое
проецирование
v18
Отключено
черновое
проецирование

Установка
вакуумно-технологическая
124,1 47,5 12,9 34,6

Редуктор судовой
энергетической установки
256 410 38,4 54,4

Многоцелевой
унифицированный
кузов-фургон
99,9 123,4 44,9 53,5


Также в v18 была реализована возможность перестроения отдельных ассоциативных видов.

В чертеже, содержащем множество ассоциативных видов, у пользователя появилась возможность перестроить отдельные неактуальные виды. Например тот, в который он хочет добавить аннотации. Также можно уточнить виды, построенные с включенной опцией «Черновое проецирование».

Перестроение отдельного вида


Эта функция не относится к явным ускорениям, но дает возможность пользователю сэкономить время.

Результат проделанной работы по ускорению проецирования модели Установка вакуумно-технологическая в чертёж:


В следующей части мы расскажем, как ускоряли расчет массо-центровочных характеристик (МЦХ), о вкладе в производительность КОМПАС-3D геометрического ядра c3dlabs, изменениях в C3D Modeler, а также о том, какое железо подходит для v18.
Теги:
Хабы:
+13
Комментарии 21
Комментарии Комментарии 21

Публикации

Информация

Сайт
ascon.ru
Дата регистрации
Дата основания
Численность
1 001–5 000 человек
Местоположение
Россия