Отображение 2D-схем в WPF с помощью графических элементов чертежа - PullRequest
0 голосов
/ 02 марта 2012

Я создаю приложение WPF, которое будет отображать двухмерную векторную графику городской системы управления водными ресурсами.Я собрал данные с сотен страниц схематических чертежей клапанов, насосов, очистных сооружений и т. Д. И трубопроводов, которые их соединяют.Объедините это с информацией отображения отдельных домов и коммерческих объектов, и в наборе данных будет около 100 000 экземпляров узлов, а также информация о соединительных каналах.У меня есть приложение для проверки концепции, которое создает DrawingVisual для каждого сегмента трубы или узла (узлы довольно простые; прямоугольник, окружность и т. Д.), Создает DrawingContext, отображающий отрезки линии для трубы или графического представления узла.DrawingVisuals добавляются на холст.Каждый визуальный объект тестируется на попадание (мне нужно иметь возможность щелкнуть любой из них, чтобы получить более подробную информацию).Проблема заключается в том, что, поскольку число визуальных эффектов превышает несколько тысяч, производительность (панорамирование, масштабирование) снижается (правда, до тех пор это здорово!).Я пробовал возиться с сглаживанием и кэшированием растровых изображений, но это не сильно помогает.

Возможно ли подобное в WPF?Есть ли лучший подход?Я родом из MFC и только начал работать с WPF 6-8 месяцев назад, хотя у меня достаточно опыта в C #.Читая посты здесь, я вижу, что Direct3D часто упоминается, но он действительно «подходит для плоских, 2D, линейных чертежей, или я ошибаюсь?Уроки XNF, которые я видел, касаются только спрайтов, и это вряд ли уместно?Я прочитал сообщения, связанные с бизнес-графиками;Данные понижающей дискретизации кажутся уместными в этих случаях, но я не уверен, что смогу это сделать, так как каждый узел и соединительный канал релевантны.Пользователям требуется достаточно быстрое масштабирование и панорамирование в любой точке схемы.Я подумал, что OpenGL может быть хорошей идеей для изучения, но мне ДЕЙСТВИТЕЛЬНО нравятся все возможности WPF (тестирование попаданий, классы геометрии и т. Д.)

Есть предложения?

Спасибо!

1 Ответ

0 голосов
/ 02 марта 2012

Если вы еще этого не сделали, вам следует взглянуть на инструменты производительности WPF: http://msdn.microsoft.com/en-us/library/aa969767.aspx. Вы сможете получить представление о том, где находятся настоящие узкие места, что каждый раз перерисовывается, инамного больше.

Мне приходилось сталкиваться с проблемой масштабирования WPF для некоторых 3D-моделей.Хотя я не слишком уверен насчет двухмерных эквивалентных терминов, совет все же может быть применим.

WPF имеет достаточно преимуществ, чтобы довольно сильно постараться оптимизировать его для вашего варианта использования, вместо того, чтобы рассматривать какую-то альтернативную архитектуру.Я думаю, для меня было меньше работы, чтобы понять и обойти проблемы производительности, чем иметь дело с какой-то другой структурой.

В конце концов, для меня была большая задача объединить модели и визуальные эффекты.Вместо того, чтобы иметь множество маленьких моделей, каждая из которых может быть протестирована на удар, со своим собственным цветом и т. Д., Я собираю их в большие модели, которые представляют множество компонентов.Затем я занимаюсь тестированием на удар больших моделей, чтобы еще больше уточнить выбор и решить, какой из компонентов на самом деле должен быть «хит».Оттуда, вместо изменения цвета всей совокупной модели, я накладываю меньшую модель, чтобы представить выборку.Я думаю, вы поняли ...

Итак, вам нужно выяснить, какая абстрактная часть в вашем чертеже плохо масштабируется - может быть, число DrawingVisuals или, может быть, какой-то другой UIElement, который вы используете, а затем попытаться объединитьэто.

...