Цикл сообщений какао? (против цикла сообщений Windows)

Пытаясь перенести свой игровой движок на Mac, я наткнулся на одну основную (но большую) проблему. В Windows мой основной код выглядит следующим образом (очень упрощенно):

PeekMessage(...) // check for windows messages
switch (msg.message)
{
case WM_QUIT: ...;
case WM_LBUTTONDOWN: ...;
...
}
TranslateMessage(&msg);
DispatchMessage (&msg);

for (std::vector<CMyBackgroundThread*>::iterator it = mythreads.begin(); it != mythreads.end(); ++it)
{
  (*it)->processEvents();
}

... do other useful stuff like look if the window has resized and other stuff...

drawFrame(); // draw a frame using opengl
SwapBuffers(hDC); // swap backbuffer/frontbuffer

if (g_sleep > 0) Sleep(g_sleep);

Я уже читал, что это не подход Mac. Mac-способ проверяет какое-то событие, такое как v-sync экрана, для рендеринга нового кадра. Но, как видите, я хочу сделать гораздо больше, чем просто рендеринг, я хочу, чтобы другие потоки работали. Некоторые потоки нужно вызывать быстрее, чем каждые 1/60 секунды. (кстати, моя инфраструктура потока: поток помещает событие в синхронизированную очередь, основной поток вызывает processEvents, который обрабатывает элементы в этой синхронизированной очереди в основном потоке. Это используется для сетевых материалов, загрузки / обработки изображений, шума Перлина поколение и т.д ... и т.д ...)

Я бы хотел иметь возможность сделать это аналогичным образом, но об этом имеется очень мало информации. Я бы не возражал против включения рендеринга в событие v-sync (я буду реализовывать это также в Windows), но я хотел бы, чтобы остальная часть кода была более отзывчивой.

Посмотрите на это так: Я бы хотел иметь возможность обрабатывать остальное, пока графический процессор все равно что-то делает, я не хочу ждать, пока v-sync начнет делать вещи, которые уже должны были быть обработаны, только затем начать отправлять данные на графический процессор. Вы понимаете, о чем я?

Если мне нужно взглянуть на это с совершенно другой точки зрения, пожалуйста, скажите мне.

Если мне нужно прочитать книги / руководства / учебные пособия / что-нибудь по этому поводу, пожалуйста, скажите мне что читать!

Я не разработчик какао, я не программист объектного c, мой игровой движок полностью на C ++, но я знаю свой путь в xcode достаточно, чтобы появилось окно и показать, что я рисую внутри это окно. Он просто не обновляется, как моя версия для Windows, потому что я не знаю, как это исправить.

Обновление: я даже считаю, что мне нужен какой-то цикл, даже если я хочу синхронизироваться по вертикальному откату.Программирование OpenGL в документации MacOSX показывает, что это делается путем установки SwapInterval. Поэтому, если я правильно понимаю, мне всегда будет нужен какой-то цикл при рендеринге в реальном времени на Mac, используя параметр swapInterval для снижения энергопотребления. Это правда?

13
задан scippie 11 July 2011 в 12:32
поделиться