Одновременные обновления в двух контекстах отображения в openGL - PullRequest
1 голос
/ 26 ноября 2008

У меня есть приложение на C # .NET, с помощью которого я создал пользовательский элемент управления отображением изображений. Каждое изображение отображает собственный контекст отображения и рисует изображение с помощью glDrawPixels (да, я знаю, что было бы лучше использовать текстуры, я планирую в будущем, но это приложение уже слишком далеко, и мое время ограничено).

Я сейчас пытаюсь сделать оба изображения панорамированными одновременно. То есть, когда одно изображение перемещается вниз на десять пикселей, второе изображение перемещается вниз на десять пикселей. Вот так:

imageOne.YPan -= 10;
imageTwo.YPan -= 10;
imageOne.Invalidate(); //This forces a redraw.
imageTwo.Invalidate(); //This forces a redraw.

Хорошо, вот моя проблема. Только одно из отображаемых изображений перерисовывается. Если я поставлю паузу между двумя вызовами Invalidate и сделаю так, чтобы длительность паузы составляла не менее 110 миллисекунд, обе перерисовались, но не одновременно. Таким образом, похоже, что второе изображение всегда пытается догнать первое. Кроме того, 110-миллисекундная пауза слишком сильно замедляет движение.

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

В начале рисунка я делаю соответствующий контекст текущим, а в конце я вызываю swapbuffers (). Я попытался добавить glFinish в конец функции рисования, но изменений не было.

Может быть, проблема в видеокарте? Я застрял с помощью встроенного графического процессора, который имеет только OpenGL 1.4.

Надеюсь, я предоставил достаточно подробностей, чтобы найти ответ на мою проблему.

Ответы [ 2 ]

1 голос
/ 26 ноября 2008

Трудно сказать, что не так с тем, что вы делаете, так как вы даете так мало деталей. Вот несколько советов, которые могут помочь.
- прежде чем делать что-то в контексте, убедитесь, что вы делаете это текущим. Если вы хотите панорамировать два контекста, сделайте первый текущий, панорамируйте его, а затем сделайте второй текущий и панорамируйте его. Это не реальная причина, почему это не должно работать.
- Если кажется, что есть проблема с синхронизацией, добавление glFinish() в стратегических местах может помочь устранить проблему
- Как всегда должно быть сделано, иногда звоните glError() и смотрите, что все прошло хорошо.
- Я не уверен, как это делается в рамках, о котором вы говорите, но вы должны убедиться, что оба контекста получают вызов swapBuffers() для каждого кадра.

0 голосов
/ 12 апреля 2011

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

Обычно анимация OpenGL является исключением из правила выполнения всего рисования внутри Control.OnPaint (или в обработчике для события Control.Paint).

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