|
0 / 0 / 0
Регистрация: 22.01.2013
Сообщений: 5
|
||||||
.NET 4.x Простая программа отрисовки линий съедает до 50% производительности14.06.2013, 08:28. Показов 1749. Ответов 8
Метки нет (Все метки)
Привет Всем!
Создал программу иммитатор обмена и первичной обработки: есть класс для хранения данных DataClass, класс поставщик данных DataMinner, окно-класс рисования WinGraph. Всё реализовано через события. Упрощенно, датамайнер при создании получает ссылку на датакласс и через определенные интервал времени (20 мс) вырабатывает целое число, передавая через метод датакласса во внутреннюю коллекцию датакласса. Внутри датакласса возникает событие - вызывая обработчик уже WinGraph.Add. Подходя к интересному, у WinGraph есть собственная коллекция и таймер обновления картинки(зачем рябить часто), который перебирает коллекцию и строит картинку. Если оставить класс WinGraph as is, то через некоторое время всё зависает, но если закомментировать строку с добавлением линий или добавлением группы рисования, то всё нормально (меньше 8% ЦП). Как правильно рисовать в WPF?
0
|
||||||
| 14.06.2013, 08:28 | |
|
Ответы с готовыми решениями:
8
Программа для отрисовки линий отрезками нажатием на клавиши мыши(по двум точкам), но при этом надо ограничить ее Библиотека для отрисовки линий уровня функции от 2-ух переменных куда программа съедает первый элемент массива? |
|
432 / 433 / 93
Регистрация: 16.07.2012
Сообщений: 886
|
|
| 14.06.2013, 12:05 | |
|
На самом деле WPF не очень быстр если вам надо отрисовывать ОЧЕНЬ много графики. Для начала можно убрать лишние линии. То есть округлять например координаты до целых и сохранять их в словаре. Потом смотреть по словарю, рисовали ли мы уже на этом месте линию, если рисовали, то пропускать. Я как-то делал на WPF графики с миллионами точек, только такие вот ухищрения помогали. Интервал обновления меньше секунды даже и не пытался ставить. Еще можно сглаживание (антиалиазинг) отключить, но тогда картинка не очень красивая будет. Ну и не забудьте geoDraw.Brush = null поставить. Возможно, тоже значительно ускорит отрисовку.
0
|
|
|
0 / 0 / 0
Регистрация: 22.01.2013
Сообщений: 5
|
||||||
| 14.06.2013, 12:45 [ТС] | ||||||
|
Перешел на класс попроще: Visual (по книге M.McDonald "WPF Windows Presentation Foundation в .NET 4.0 с примерам")
Без пользы. Видимо придется перейти на точки экрана и выбирать только видимые, не знаю пока как(усреднять значения группы линий и только их рисовать или четко попадающую на пиксель линию) Кликните здесь для просмотра всего текста
0
|
||||||
|
432 / 433 / 93
Регистрация: 16.07.2012
Сообщений: 886
|
||||||
| 14.06.2013, 13:47 | ||||||
|
Смотрите, умножаем координаты на 300 чтобы перейти к целым координатам и толщина линии составила 1 пиксель и заводим HashSet:
0
|
||||||
|
0 / 0 / 0
Регистрация: 22.01.2013
Сообщений: 5
|
||||||
| 14.06.2013, 14:15 [ТС] | ||||||
|
Интересно. Еще не имел дел с хеш-таблицами, но тем не менее - две точки имеющие одинаковые Х и разные У будут иметь разные ключи (Х + У << 32), но видимой будет только большая точка ( с большим У).
Добавлено через 14 минут Не успел сразу исправить... Интересно. Еще не имел дел с хеш-таблицами, но тем не менее - две точки имеющие одинаковые Х и разные У будут иметь разные ключи (Х + У << 32), но видимой будет только большая точка ( с большим У) ,остальные(с тем же Х) будут не нужны . Пока сделал с усреднением: получаю число каналов на точку по Х, усредняю столбики - получаю мега-столбик и в текущем Х рисую линию с его высотой. Кликните здесь для просмотра всего текста
0
|
||||||
|
432 / 433 / 93
Регистрация: 16.07.2012
Сообщений: 886
|
|
| 14.06.2013, 14:56 | |
|
Кстати, drawPen.Freeze() неплохо было бы сделать перед тем как ею рисовать.
И зачем вам вообще Image? Можно выставить у окна Background = null и рисовать в OnRender прямо в DrawingContext. А по таймеру просто вызывать InvalidateVisual();
0
|
|
|
0 / 0 / 0
Регистрация: 22.01.2013
Сообщений: 5
|
||||||
| 17.06.2013, 09:16 [ТС] | ||||||
|
Почему-то не рисует на DrawingContent :-(
Только черный фон окна. Попутно хочу узнать: 1) Есть ли метод коллекций - заполняющий количество элеметов дефолтными(0) значениями? 2) Что дает обнуление Background = null? Кликните здесь для просмотра всего текста
0
|
||||||
|
432 / 433 / 93
Регистрация: 16.07.2012
Сообщений: 886
|
|
| 17.06.2013, 09:39 | |
|
Почему же, все рисует. Просто когда толщина линии 0.1 пиксель, а длина - 1 пиксель, то это очень трудно заметить )
А фон null - для того чтобы все что вы рисуете в OnRender не залилось потом поверх цветом фона. Насчет заполнения List нулями не знаю, но раз у вас количество элементов все равно не меняется, то можно вместо List<int> использовать масссив (int []). В массиве после его создания будут дефолтные значения.
0
|
|
|
0 / 0 / 0
Регистрация: 22.01.2013
Сообщений: 5
|
||||||
| 17.06.2013, 11:15 [ТС] | ||||||
|
Спасибо!
Всё стало отлично. Загрузка до 8 -10 % ЦП Загнал графику в OnRender - рисую в Content, обновляю по таймеру. Как советовали. Единственно только, переформатирую точки отдельно, чтобы побыстрее выйти из lock{...}(освободить ресурс). Поле для оптимизации есть. Кликните здесь для просмотра всего текста
Буду вводить красоту в виде маркерных линий и подписей.
0
|
||||||
| 17.06.2013, 11:15 | |
|
Помогаю со студенческими работами здесь
9
Программа отрисовки винтов LISP Программа для отрисовки в окне произвольного, придуманного Вами, рисунка
Программа для сравнения производительности процессоров? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|