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

    В прошлой части мы рассказывали о зарождении КОМПАС-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.
    АСКОН
    85,00
    Крупнейший российский разработчик инженерного ПО
    Поделиться публикацией

    Комментарии 21

      0
      Ну наконец-то, честно говоря! :)
        0
        Наконец-то ускорили или наконец-то статья вышла?)
      0
      В итоге остались на OpenGL? У вас есть какая-то статистика платформ и железа, на которых работает КОМПАС? Есть ли там поддержка какого-нибудь DX12 или Vulkan?
      Рассматривали ли вы варианты реализации рендеринга через другие графические API?
        +1
        У нас пока не было планов уходить с OpenGL. Когда появился КОМПАС-3D, DirectX был в зачаточном состоянии, поэтому не рассматривался. Также DirectX — это привязка к Windows, что нам не нужно. Vulkan рассматриваем — но это пока тесты и опытные работы.
          0
          Также DirectX — это привязка к Windows

          То есть у вас в планах перейти и на другие ОС?
            0
            В смысле в планах? У нас вьюверу на андроид уже лет 5)
              0
              Мне не посмотреть, а поработать :). Желательно на Линуксе.
                  0
                  Супер, спасибо! Огромные планы. Успехов вам в их осуществлении!
                  0
                  Возможно, присоединился бы со своей архитектурной деятельностью.
                  То что CADов не хватает на линуксы это факт. Особенно всяких этих BIM
                    0
                    За BIM у нас отвечает Renga, про их планы в отношении линукса ничего сказать не могу.
          0
          Проблемы отрисовки порой оч и оч влияют на работу. особенно если много сложных деталей.
          Кстати как обстоят дела если приходится рисовать под пару тысач деталей сложной формы ( в основном поверхности двойной кривизны)?
            0
            Пара тысяч — это вообще не та цифра, где что-то можно заметить. Если оперативной памяти достаточно, никаких проблем точно не будет.
              +1
              Дела сильно зависят от желаемой точности разбиения этих поверхностей, я думаю.
                0
                Поверхность двойной кривизны описывается NURBS — по сути одним уравнением или системой уравнений. NURBS всегда точная. А дальше, в зависимости от того какую часть поверхности требуется отобразить на экране, происходит визуализация с разбиением NURBS на треугольники и треугольники передаются на видеокарту. Качество отображения настраивает пользователь. На максимальной точности FPS будет чуть ниже, чем на средней, но для 2000 деталей разница не будет заметна.
              0
              Добрый день! Я когда-то встречал в качестве рекомендации в каком-то из ваших материалов (не на хабре) литературу для разработки геометрического ядра. По-моему это была статья программиста вашей компании. Не могли бы вы, если имеется такая возможность, упомянуть тут данный источник?
              0
              Хочется статью про отображение ребер и линий в КОМПАС 3D, так как это для меня «больная» тема, я в разные времена для разных проектов разрабатывал системы визуализации линий включая отображение скрытых ребер и силуэтов в realtime.

              SolveSpace
              image
              NoteCAD
              image
                0
                Третья часть:
                habr.com/ru/company/ascon/blog/447752

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

                Самое читаемое