Как может AutoCAD так быстро панорамировать и масштабировать?

Я занимаюсь разработкой средства просмотра изображений, в котором графика отображается в режиме сглаживания. Изображения могут быть сначала отредактированы с помощью Autocad, который генерирует файлы DXF.

Приложение написано с использованием Visual C ++ и Direct2D.

Хотя я могу загружать изображение довольно быстро, для меня остаются проблемы с масштабированием и особенно панорамированием по сравнению с производительностью Autocad для того же изображения (с таким же количеством фигур).

Ниже приведен фрагмент кода, предназначенный для визуализации графики:

auto shapes = quadTree.get_visible_shapes();
shapes.sort_by_Zorder();

for each shape in shapes:
shape.draw();

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

Рисование только видимых фигур благодаря реализации Quadtree значительно улучшило производительность; Я также визуализирую графику в режиме псевдонимов во время панорамирования, но с Autocad все еще есть большая разница.

Мне интересно, если Autocad рисует растровое представление изображения, даже если я еще не пробовал этот подход, поэтому я не могу сказать, может ли быть эффективное улучшение скорости.

Учитывая эту гипотезу, есть ли способы улучшить действие панорамирования и масштабирования?

2

Решение

В AutoCAD есть механизм, называемый Адаптивная деградация который прерывает рендеринг, когда FPS падает ниже предопределенного значения:

Адаптивная деградация

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

3

Другие решения

При панорамировании на 2D / 3D-сцене есть несколько соображений, особенно когда перерисовка дорогая.

  1. Вне экрана холст

    Визуализируйте свой экран на растровом экране за пределами экрана с немного большим холстом (например, w + N * h + N), после PAN вы мгновенно поднимаете экран и обновляете закадровый фон. Есть также много способов дальнейшей оптимизации в этом направлении.

    РЕДАКТИРОВАТЬ: Подробнее:

    Например, экран вашей сцены имеет размер 640×480, сама сцена имеет размер 1000×1000, вы хотите показать регион (301, 301) ~ (940, 780). Вместо этого вы должны создать внеэкранный буфер с, скажем, 740×580 (т.е. N = 50) из (251,251) ~ (990, 830). поэтому, если операция PAN перемещается менее чем на 50 пикселей (например, PAN оставляет 5 пикселей), у вас уже есть такой контент для мгновенного рендеринга на экран.
    Кроме того, после PAN вы можете подготовить новый внеэкранный буфер в фоновом режиме (или в режиме ожидания), чтобы последующее PAN могло выполняться мгновенно.
    В случае PAN слишком далеко, вам все равно придется подождать или снизить качество рендеринга для промежуточных экранов, и отображать полные детали только тогда, когда PAN остановлен — пользователь не заметит детали при перемещении.

  2. Предельная частота обновления

    Операция PAN обычно запускается мышью (или касанием жеста), что может происходить при большом количестве событий. Вместо того чтобы ставить в очередь все 20 событий перемещения мыши за одну секунду и тратить 3 секунды на перерисовку мира 20 раз, вам следует ограничить частоту обновления.

3