2012-01-13 2 views
6

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

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

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

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

+0

Вы используете полноэкранный режим, а не в полноэкранном режиме в отладчике? Это означает, что V-sync включен. – stonemetal

+0

Не полноэкранный, но максимизированный. V-sync должен быть отключен в обоих случаях. Иногда я получаю fps-rate более 100 и все еще отстаю. – AareP

+0

вы должны использовать что-то вроде Process Explorer, чтобы увидеть, какие DLL-файлы загружаются в обоих случаях, и если одна и та же DLL загружается из путей differenc. – PeterT

ответ

0

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

SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS); 

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

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

+0

Seens разумно, но каково отношение вашего ответа с разницей в производительности между версиями debug/release? –

+0

Не помогло. Скорость Fps по-прежнему «нестабильна» при выполнении отдельно от визуальной студии.Btw Я всегда использую версию Release, но выполняю либо визуальную студию, либо обычно. – AareP

+0

Также изменение SetProcessPriorityBoost не помогает. – AareP

3

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

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

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

2

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

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

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

+0

Спасибо! Я подтверждаю, что драйверы nVidia OpenGL имеют существенную разницу в производительности (x100) между версиями Release и Debug при определенных условиях. У меня был проект OpenGL, в котором использовались скин-анимации, и он работал на .4FPS на двух разных машинах Windows на базе nVidia. Однако проект будет работать примерно на 30FPS на машинах AMD или на моем аппаратном обеспечении nVidia от Macbook. Однако на машинах Windows/nVidia, если я запускаю проект с открытым окном Profiler Unity, он будет ускоряться от .4FPS до 30FPS, и если я запустил автономный инструмент OpenGL debug, он также будет работать с 30FPS. –

+0

@RiazRizvi В настоящее время я сталкиваюсь с подобными проблемами и задаюсь вопросом, какой инструмент отладки OpenGL вы использовали? – ShinNoNoir

+0

Это было давно, но я думаю, что это было бесплатное https://www.opengl.org/sdk/tools/gDEBugger/. Я пришел к выводу, что DLL OpenGL Window, созданный для отладки, работает лучше, чем версия выпуска, для облегающих анимаций, поскольку запуск проекта с помощью инструмента отладки приводит к загрузке версий отладочной версии драйверов OpenGL. Опять же, хотя это было два года назад - не уверен, что это все еще так. –

Смежные вопросы