Как улучшить производительность и использование памяти с большим количеством полигонов на холсте?

  1. Загрузите и установите node.js & amp; npm отсюда - https://www.npmjs.com/get-npm

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

    Код

  3. Затем откройте командную строку в этой папке и запустите «npm install puppeteer» (это может занять несколько минут)

    [114 ]
  4. Затем запустите «node extract.js»

  5. После успешного запуска у вас будет файл «store.txt» в той же папке, в котором содержится ожидаемый результат.

5
задан Dylan 29 September 2008 в 20:08
поделиться

8 ответов

Никакая потребность обратиться к GDI, просто необходимо спустить слой в API WPF и объединить геометрию в меньшее количество зрительного ряда. У Pablo Fermicola есть немного полезной информации о выборе, в котором нужен слой использовать в зависимости от Вашей производительности.

Мне удалось получить превосходное использование производительности DrawingVisual и класс DrawingContext.

7
ответ дан 13 December 2019 в 22:19
поделиться

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

И: преобразование вещи к битовому массиву: что различие к рендерингу его?

В конце концов, у Вас есть объекты n, которыми/somehow/должны быть представлены (если Вы не можете выяснить, какие объекты скрыты позади других объектов, но это не помогает Вам очень, так как необходимо было бы посмотреть на n! объектные отношения).

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

0
ответ дан 13 December 2019 в 22:19
поделиться

Вы можете быть ограничены производительностью виджета холста. Если у Вас есть опция использования стороннего взгляда инструментария на QT. Это имеет высокопроизводительный виджет холста, который разработан для рендеринга сложных форм быстро. Это уже использовалось по крайней мере для одного ГИС-приложения, таким образом, оно имеет некоторый послужной список в этом пространстве.

Можно перенести QT как элемент управления ActiveX или использовать привязку .NET Qyoto/Kimono для взаимодействия через интерфейс к приложению .NET. Технология сообщения-розыгрыша только что обновила их веб-сайт, и я не могу найти загружаемую демонстрацию, которую они раньше имели там, но это показывает виджет QGraphicsView, представляющий очень большой векторный рисунок и уменьшение масштаб в режиме реального времени.

1
ответ дан 13 December 2019 в 22:19
поделиться

Вы могли попытаться использовать GDI + или прямой x вместо WPF.

Я сделал подобный проект (представляющий данные Карты через WPF) для статьи MSDN Magazine, которую я написал приблизительно год назад.

Это было просто что-то, что я записал скорее быстро (статья +, приложение заняло приблизительно 1 неделю), и был разработан, чтобы просто быть, "это - что-то аккуратное, которое можно сделать", и таким образом, я не сфокусировался на производительности очень. В любом случае я столкнулся с той же проблемой. После того как количество полигонов на холсте стало большим, выполнение рендеринга начало страдать. Например, изменение размеров окна включило бы о 1/2 второй задержке или около этого.

Многое из этого имеет отношение к издержкам WPF. Это, прежде всего, разработано как инструментарий GUI, а не высокопроизводительный графический механизм. Это означает, что фокусируется на богатстве функции по рендерингу efficent. С меньшими числами объектов (что, вероятно, будет найдено в большинстве приложений GUI), производительность довольно хороша и привязка данных, анимация и декларативные функции стиля (и вся маршрутизация событий и другие вещи, которых они требуют), может действительно пригодиться.

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

Если бы Вам не нужны декларативное моделирование и анимация, то я просто устранил бы WPF, и использовать GDI + для рисования карты Ваш сам. Это basicly включает установку правильной матрицы преобразования, чтобы заставить карту тянуть на поверхность управления, и затем итерацию через все полигоны и вызов набора методов DrawPolygon.

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

Выполнение его, тот путь, однако, должен улучшить производительность, потому что это свелось бы к выполнению только о 20-30K векторных преобразованиях, который не берет много питания процессора на самом современном ЦП. Вы могли также изучить использование Прямого X, который позволит Вам использовать в своих интересах GPU также, который мог дать еще большее повышение производительности.

2
ответ дан 13 December 2019 в 22:19
поделиться

Используйте DrawingGroup и добавьте/удалите Графические объекты для решения этого. См. мой ответ на подобный вопрос о работе DrawingVisual с Opacity=0. Я думаю, что мой ответ на самом деле соответствует этому вопросу лучше.

0
ответ дан 13 December 2019 в 22:19
поделиться

@xmjx

И: преобразование вещи к битовому массиву: что различие к рендерингу его?

Моя мысль здесь была то, что мое замедление могло быть вызвано при наличии n количество объектов на холсте, по сравнению с 1 битовым массивом. Тем не менее я не знаю производительность, или что происходит в фоновом режиме при преобразовании холста с n количеством объектов к Битовому массиву.

Я предпочел бы не использовать Битовый массив, так, чтобы я мог позволить пользователю взаимодействовать (modify/delte) с формой/полигонами.

0
ответ дан 13 December 2019 в 22:19
поделиться

Если производительность является проблемой затем, Вы хотите избежать Визуальных Кистей. Эти кисти лучше всего используются для проектирования некоторой видимой части экрана к другому месту на экране. Они вызывают большой хит производительности, потому что эти кисти автоматически обновляют, когда содержание кисти изменяется.

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

Больше информации из MSDN на VisualBrush

0
ответ дан 13 December 2019 в 22:19
поделиться

, если вам не нужно показывать ВСЕ полигоны сразу (например, из-за масштабирования, панорамирования и т. Д.), Ознакомьтесь с примером виртуализации холста здесь

0
ответ дан 13 December 2019 в 22:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: