У меня проблема с быстрым рисованием в .NET. Я не думаю, что что-то конкретное должно занимать много времени, но на каждой машине, на которой я это пробовал, возникают серьезные проблемы. Это реализовано в vs2008 .NET с использованием C# (с некоторыми вещами на C++, но не имеющими отношения к рисунку).
У меня есть три экрана, и пользователь должен иметь возможность переключаться между ними без задержек. На первом экране есть четыре кнопки, восемь пользовательских элементов управления, состоящих из двух кнопок и 6 меток каждая, текстовое поле и раскрывающийся список. Я не думаю, что это так уж много.
На втором экране у меня есть четыре метки, шесть кнопок и два элемента управления, которые имеют шесть кнопок, один контекст рисования opengl и около десяти меток каждый.
На третьем экране у меня есть один контекст opengl и 10 кнопок.
Переход с любого экрана на любой занимает буквально секунду. Например, если я перехожу со второго экрана к первому, все приложение исчезает, показывая фоновый экран, а затем рисуется первый экран. Часто экран рисуется по частям, как если бы машина на фабрике в Швеции преднамеренно вручную создавала тонкие и вкусные буквы, а затем отправляла каждую по отдельности на мой экран. Я преувеличиваю и хочу прояснить это, потому что не думаю, что шведы так медлительны, как эта перерисовка.
Первый и второй экран рисуются в памяти и хранятся там с помощью только «.Hide ()» и «.Show ()», чтобы они появлялись и исчезали. Двойная буферизация не имеет значения. Третий экран каждый раз отрисовывается заново, и на его рисование уходит столько же времени, что и на первый и второй.
Есть предположения? Что могло происходить? Как я могу его отследить?
Спасибо!
Обновлено: я должен добавить, что любая обработка C++ и тому подобное происходит в отдельном потоке. Иногда используется метод MethodInvoke для вывода результатов операции на экран, но эта проблема возникает без вызова каких-либо функций, просто путем нажатия кнопок для перехода от одного экрана к другому.





Выполняете ли вы какую-либо другую обработку во время события "переворот экрана"? кроме того, чтобы просто перерисовать форму? Если вы обрабатываете что-то между флипами (может быть, ваше дополнение C++?), И вы не используете многопоточность, вы получаете этот эффект белого цвета. Форма, вероятно, ожидает, пока процессорное время перерисовывается.
Неа. Dottrace вылетает при каждом запуске, что очень расстраивает. По меньшей мере.
Вы пробовали другие профилировщики ... ANTS Profiler должен быть очень хорошим
В дополнение к упомянутому профилировщику вы также можете отключить контексты OpenGL. Если вы заметили ускорение, значит, вы поймете, что это ваша графика, и сможете соответствующим образом сфокусировать свои усилия на оптимизации.
Баллы за шведский юмор.
Работа с opengl оказалась, безусловно, самой большой потерей времени - 80 мс на контекст на перерисовку, как только я разобрался с dotTrace.
How can I track it down?
dotTrace - http://www.jetbrains.com/profiler/
по какой-то причине dotTrace фактически ломает мое приложение, когда я пытаюсь его запустить. Я могу отлаживать нормально, но при запуске dotTrace приложение немедленно прерывается.
Вы также можете попробовать класс System.Diagnostics.Stopwatch. Он очень прост в использовании и хорош для профилирования определенных фрагментов кода без использования каких-либо надстроек или сторонних приложений.
Используя dotTrace, попробуйте как «Профилирование трассировки», так и «Профилирование выборки». В моем приложении мне больше повезло с «Профилированием выборки», но он немного менее точен.
Я понял, в чем проблема с запуском dotTrace - каталог запуска по умолчанию не был локальным каталогом приложения, и это приводило к сбоям в языковых пакетах.
Я никогда не использовал OpenGL таким образом, но вы, возможно, захотите посмотреть, как контексты OpenGL меняются местами. При переключении с одной страницы на другую вы можете получить сброс устройства (в терминах DirectX), что могло вызвать задержку.
Если это вообще возможно, пусть устройство будет рисовать на задней панели System.Drawing.Bitmap и использовать это растровое изображение на экранах. Сделайте ваш код OpenGL осведомленным о текущей странице, на которой находится пользователь, и вы мощь получите желаемую скорость.
Чтобы проверить это перед внесением серьезных изменений, попробуйте удалить отображение OpenGL в вашей форме.
Это все прихоть.
Эта обработка запускается пользователем; если пользователь не запускает его, проблема все равно возникает.