Приложение C ++ / opengl работает более плавно с отладчиком - PullRequest
6 голосов
/ 14 января 2012

Сталкивались ли вы с ситуацией, когда приложение opengl на C ++ работает быстрее и плавнее при запуске из visual studio? При нормальном выполнении без отладчика у меня получается более низкая частота кадров, 50 вместо 80, и странное отставание, при котором частота кадров падает примерно до 25 кадров / сек каждые 20-30 кадров. Есть ли способ это исправить?

Редактировать : Также мы используем довольно много списков отображения (созданных с помощью glNewList). И увеличение количества списков отображения, кажется, увеличивает отставание.

Редактировать : Кажется, проблема связана с ошибками страниц. Настройка рабочего процесса процесса с помощью SetProcessWorkingSetSizeEx () не помогает.

Редактировать : С некоторыми большими моделями проблему легко выявить при использовании GPU-памяти утилиты proc. Использование памяти очень нестабильно, когда на каждый кадр приходится много вызовов glCallList. Новая геометрия не добавляется, текстуры не загружаются, но выделение памяти gpu колеблется в пределах + -20 Мбайт. Через некоторое время становится еще хуже, и он может выделить что-то вроде 150 МБ за один раз.

Ответы [ 3 ]

3 голосов
/ 18 января 2012

Я полагаю, что вы видите, что отладчик блокирует некоторые страницы, чтобы их нельзя было обменять, чтобы они были немедленно доступны для отладчика. Это приводит к некоторым оговоркам для ОС во время переключения процессов и, как правило, не рекомендуется.

Вам, вероятно, не понравится слышать, как я говорю это, но нет хорошего способа исправить это, даже если вы это сделаете.

Используйте VBO или, по крайней мере, массивы вершин, можно ожидать, что они будут значительно лучше оптимизированы в драйвере (давайте посмотрим правде в глаза - списки отображения становятся устаревшими). Списки отображения могут быть легко обернуты для создания буферов вершин, поэтому необходимо изменить только небольшую часть старого кода. Кроме того, вы можете использовать «графику без привязки», которая была разработана, чтобы избежать ошибок страницы в драйвере (GL_EXT_direct_state_access).

2 голосов
/ 09 июля 2012

У вас случайно есть видеокарта nVidia? nVidia OpenGL использует другую реализацию при подключении к отладчику. Для меня версия без отладчика - утечка памяти со скоростью до 1 МБ / с в определенных ситуациях, когда я обращаюсь к переднему буферу и не вызываю glClear каждый кадр. Версия отладчика абсолютно в порядке.

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

И я не использую списки отображения.

0 голосов
/ 16 января 2012

Вероятно, это приоритет потока или процесса.Visual Studio может запустить ваш процесс с чуть более высоким приоритетом, чтобы убедиться, что отладчик отзывчив.Попробуйте использовать SetPriorityClass () в коде вашего приложения:

SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS);

Класс «выше нормы» только подталкивает его впереди всего остального с классом «нормальный».Как сказано в документации, не бейте по сверхвысокому приоритету, иначе вы можете испортить системный планировщик.

В приложении, работающем со скоростью 60 кадров в секунду, вы получаете всего 16 мсек, чтобы нарисовать кадр (меньше при 80 кадрах в секунду!) - если это займет больше времени, вы уроните кадр, что может привести к небольшому падению частоты кадров.Если ваше приложение имеет тот же приоритет, что и другие приложения, то, скорее всего, другое приложение может временно украсть процессор для какой-либо задачи, и вы отбросите несколько кадров или, по крайней мере, пропустите окно 16 мс для текущего кадра.Идея в том, чтобы немного повысить приоритет, означает, что Windows возвращается к вашему приложению чаще, поэтому не теряет столько кадров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...