Сначала мой код настроил среду SDL и приступил к обновлению контекста OpenGL, без какой-либо обработки SDL_Event. Это приводит к тому, что окно, пока оно открыто, должно появиться в Windows, чтобы быть невосприимчивым. Окно мерцает. В заголовке будет добавлено "(Не реагировать)", а при нажатии внутри окна оно становится серым, так как Windows делает это по умолчанию в не реагирующих окнах. Однако в этом состоянии (даже после того, как оно становится серым), дисплей OpenGL продолжает обновляться и анимироваться, а вот кикер, он даже делает это, пока окно перетаскивается. Очевидно, что в этом случае приложение не обрабатывает события из окон правильно, заставляя окна думать, что они находятся в повешенном состоянии. Но есть очевидные доказательства того, что opengl продолжает оказывать.
Теперь я делаю одну модификацию кода, которая представляет собой эти три строки, помещенные в соответствующее место внутри цикла (что также делает DrawGL draw):
SDL_Event event;
if (SDL_PollEvent(&event) && event.type == SDL_QUIT)
break;
Все это делается при очистке очереди сообщений с помощью SDL.
Теперь поведение заключается в том, что Windows больше не думает, что он "не отвечает", и он не становится серым. Нет мерцания. Кажется, все работает плавно. Но как только я нажимаю и перетаскиваю строку заголовка, чтобы перетащить окно, рендеринг блокируется. Я не отлаживал это, но я подозреваю, что SDL_PollEvent блокирует длительность перетаскивания окна.
Есть ли способ обойти это? Это интересно, потому что часть поведения, проявляющаяся в отсутствии обработки событий, является доказательством того, что то, что я хочу, возможно в теории.
Обновление: я нашел эту тему: http://www.gamedev.net/topic/488074-win32-message-pump-and-opengl---rendering-pauses-while-draggingresizing/
Вердикт, похоже, сводится к определенным выборам, которые Microsoft сделала для нас... В основном он застревает в DefWindowProc()
до тех пор, пока мышь не будет выпущена. Было бы очень беспорядочно взломать исправление для этого, и я мог бы сделать работу с помощью рендеринга в другом потоке. Но я даже не хочу начинать думать о жонглировании контекста OpenGL из нескольких потоков, если это даже возможно.