2009-11-25 3 views
2

Я написал программу 3D-Stereo OpenGL на C++. Я отслеживаю, что объекты позиции на моем дисплее должны использовать timeGetTime после timeBeginPeriod (1). Когда я запускаю программу с помощью «Начать отладку», мои объекты плавно перемещаются по дисплею (как и должно быть). Когда я запускаю программу с помощью «Начать без отладки», объекты замерзают для нескольких обновлений экрана, а затем переходят в новую позицию. Любые идеи относительно того, что может вызвать эту проблему и как ее исправить?Что может заставить OpenGL вести себя по-разному в настройках «Начать отладки» или «Начать без отладки»?

Редактировать: Кажется, что рывка может быть решена после небольшой задержки, когда я запускаю «Начать без отладки», если я нажму кнопку мыши. Мое приложение - консольное приложение (я беру некоторые параметры, когда программа сначала запускается). Может ли быть разница в фокусе окна между этими двумя параметрами? Есть ли явный способ заставить фокус открыть окно OpenGL (в полноэкранном режиме через glutFullScreen();), когда я закончил делать ввод из окна консоли?

Спасибо.

+0

Как выполняется ваша выпускная сборка и каково ваше общее использование ЦП? –

+0

Поскольку я почти полностью работаю в среде разработки, а использование ЦП не должно быть проблемой с простыми дисплеями, которые я визуализую, я никогда не строил выпускную сборку. Моя недавняя попытка сделать это была сорвана библиотекой захвата экрана, которую я использовал, которая отказывается ссылаться правильно. Использование процессора на ядре, выполняющем процесс, является высоким, но редко привязывается. – russellpierce

ответ

0

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

Что-то более специфичное для OpenGL - Возможно, у вас могут быть проблемы с промывкой команд. Попробуйте вставить glFinish() после рисования каждого кадра.
Также может быть полезно, чтобы как-то действительно убедиться, что когда происходит замораживание, на самом деле отображаются кадры, а не то, что все приложение заморожено. Если есть более вероятно, что у вас есть ошибка в логике, так как кажется, что OpenGL выполняет свою работу.

+0

Спасибо за совет. Любое предложение о том, как определять, будут ли кадры выполняться во время кажущегося замораживания? Я пытался проверить это раньше, но обнаружил, что замедление из-за написания файла было темным, что бы это ни происходило. Поскольку это стереодисплей @ 120 Гц, у меня есть около 8,33 мс, чтобы пройти весь мой цикл отображения. – russellpierce

+0

Обычно сборка отладки будет инициализировать память точно так же, как запустить ее через отладчик или нет. В окнах вы все равно будете использовать библиотеки времени отладки. Это может иметь большое значение при переходе к сборке релиза. –

1

API timeGetTime имеет только точность примерно 10 мс. Если интервалы, которые вы измеряете, составляют менее 50 мс или около того, вы можете просто увидеть эффекты ожидаемой дисперсии в системном таймере. Я понятия не имею, почему отладчик повлияет на это, но тогда вся работа системы - это черный ящик. Вы можете использовать QueryPerformanceCounter для получения таймингов с более высоким разрешением, что может помочь.

+0

Спасибо, я посмотрю на это. Я думал, что timeBeginPeriod (1) точно устанавливает разрешение до 1 мс. Если разрешение составляет 10 мс, это может вызвать определенные проблемы для моего кода. – russellpierce

+0

@drknexus Документация для timeGetTime и timeBeginPeriod подразумевает, что это 1 мс, но, похоже, сильно зависит от того, какое оборудование доступно. Полагаю, возможно, что «современное» оборудование исправило это, прошло несколько лет с тех пор, как я играл с ним. Здесь я помню значение 10 мс, но это также несколько лет: http://support.microsoft.com/kb/172338 –

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