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

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

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

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

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

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

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

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

спасибо!

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

4 ответов


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

очки присуждаются за шведский юмор.


Как я могу отслеживать его?

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


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


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

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

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

Это все блажь.