.NET C # рисует медленно - PullRequest
       20

.NET C # рисует медленно

6 голосов
/ 09 января 2009

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

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

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

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

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

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

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

Спасибо!

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

Ответы [ 4 ]

1 голос
/ 09 января 2009

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

Очки начисляются за шведский юмор.

1 голос
/ 09 января 2009

Как я могу отследить это?

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

0 голосов
/ 09 января 2009

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

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

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

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

0 голосов
/ 09 января 2009

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

...