.NET C# отрисовывает медленно

У меня проблема с быстрым рисованием в .NET. Я не думаю, что что-то конкретное должно занимать много времени, но на каждой машине, на которой я это пробовал, возникают серьезные проблемы. Это реализовано в vs2008 .NET с использованием C# (с некоторыми вещами на C++, но не имеющими отношения к рисунку).

У меня есть три экрана, и пользователь должен иметь возможность переключаться между ними без задержек. На первом экране есть четыре кнопки, восемь пользовательских элементов управления, состоящих из двух кнопок и 6 меток каждая, текстовое поле и раскрывающийся список. Я не думаю, что это так уж много.

На втором экране у меня есть четыре метки, шесть кнопок и два элемента управления, которые имеют шесть кнопок, один контекст рисования opengl и около десяти меток каждый.

На третьем экране у меня есть один контекст opengl и 10 кнопок.

Переход с любого экрана на любой занимает буквально секунду. Например, если я перехожу со второго экрана к первому, все приложение исчезает, показывая фоновый экран, а затем рисуется первый экран. Часто экран рисуется по частям, как если бы машина на фабрике в Швеции преднамеренно вручную создавала тонкие и вкусные буквы, а затем отправляла каждую по отдельности на мой экран. Я преувеличиваю и хочу прояснить это, потому что не думаю, что шведы так медлительны, как эта перерисовка.

Первый и второй экран рисуются в памяти и хранятся там с помощью только «.Hide ()» и «.Show ()», чтобы они появлялись и исчезали. Двойная буферизация не имеет значения. Третий экран каждый раз отрисовывается заново, и на его рисование уходит столько же времени, что и на первый и второй.

Есть предположения? Что могло происходить? Как я могу его отследить?

Спасибо!

Обновлено: я должен добавить, что любая обработка C++ и тому подобное происходит в отдельном потоке. Иногда используется метод MethodInvoke для вывода результатов операции на экран, но эта проблема возникает без вызова каких-либо функций, просто путем нажатия кнопок для перехода от одного экрана к другому.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
2 098
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Выполняете ли вы какую-либо другую обработку во время события "переворот экрана"? кроме того, чтобы просто перерисовать форму? Если вы обрабатываете что-то между флипами (может быть, ваше дополнение C++?), И вы не используете многопоточность, вы получаете этот эффект белого цвета. Форма, вероятно, ожидает, пока процессорное время перерисовывается.

Эта обработка запускается пользователем; если пользователь не запускает его, проблема все равно возникает.

mmr 09.01.2009 02:43

Неа. Dottrace вылетает при каждом запуске, что очень расстраивает. По меньшей мере.

mmr 09.01.2009 05:00

Вы пробовали другие профилировщики ... ANTS Profiler должен быть очень хорошим

Michael Prewecki 09.01.2009 15:42
Ответ принят как подходящий

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

Баллы за шведский юмор.

Работа с opengl оказалась, безусловно, самой большой потерей времени - 80 мс на контекст на перерисовку, как только я разобрался с dotTrace.

mmr 10.01.2009 04:40

How can I track it down?

dotTrace - http://www.jetbrains.com/profiler/

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

mmr 09.01.2009 04:24

Вы также можете попробовать класс System.Diagnostics.Stopwatch. Он очень прост в использовании и хорош для профилирования определенных фрагментов кода без использования каких-либо надстроек или сторонних приложений.

Charlie Salts 09.01.2009 05:42

Используя dotTrace, попробуйте как «Профилирование трассировки», так и «Профилирование выборки». В моем приложении мне больше повезло с «Профилированием выборки», но он немного менее точен.

Sean 10.01.2009 00:39

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

mmr 10.01.2009 04:41

Я никогда не использовал OpenGL таким образом, но вы, возможно, захотите посмотреть, как контексты OpenGL меняются местами. При переключении с одной страницы на другую вы можете получить сброс устройства (в терминах DirectX), что могло вызвать задержку.

Если это вообще возможно, пусть устройство будет рисовать на задней панели System.Drawing.Bitmap и использовать это растровое изображение на экранах. Сделайте ваш код OpenGL осведомленным о текущей странице, на которой находится пользователь, и вы мощь получите желаемую скорость.

Чтобы проверить это перед внесением серьезных изменений, попробуйте удалить отображение OpenGL в вашей форме.

Это все прихоть.

Другие вопросы по теме