Я занимаюсь разработкой средства просмотра изображений, в котором графика отображается в режиме сглаживания. Изображения могут быть сначала отредактированы с помощью 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 рисует растровое представление изображения, даже если я еще не пробовал этот подход, поэтому я не могу сказать, может ли быть эффективное улучшение скорости.
Учитывая эту гипотезу, есть ли способы улучшить действие панорамирования и масштабирования?
В AutoCAD есть механизм, называемый Адаптивная деградация который прерывает рендеринг, когда FPS падает ниже предопределенного значения:
И есть также много оптимизации. Вы не можете конкурировать с такой большой программой.
При панорамировании на 2D / 3D-сцене есть несколько соображений, особенно когда перерисовка дорогая.
Вне экрана холст
Визуализируйте свой экран на растровом экране за пределами экрана с немного большим холстом (например, 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 остановлен — пользователь не заметит детали при перемещении.
Предельная частота обновления
Операция PAN обычно запускается мышью (или касанием жеста), что может происходить при большом количестве событий. Вместо того чтобы ставить в очередь все 20 событий перемещения мыши за одну секунду и тратить 3 секунды на перерисовку мира 20 раз, вам следует ограничить частоту обновления.