При попытке перенести мой игровой движок на mac, я наткнулся на одну основную (но большую) проблему. В окнах мой основной код выглядит так (очень упрощен):
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);
Я уже читал, что это не малый путь. Макинтош проверяет какое-то событие, такое как v-sync экрана, для рендеринга нового фрейма. Но, как вы можете видеть, я хочу сделать намного больше, чем только рендеринг, я хочу, чтобы другие потоки выполняли работу. Некоторые потоки нужно называть быстрее, чем каждые 1/60 секунды. (кстати, моя инфраструктура потоков: thread помещает событие в синхронизированную очередь, основной поток вызывает processEvents, который обрабатывает элементы в этой синхронизированной очереди в основном потоке. Это используется для сетевого материала, загрузки/обработки изображений, шума perlin поколение и т.д. и т.д.)
Я хотел бы иметь возможность сделать это аналогичным образом, но об этом мало информации. Я бы не хотел помещать рендеринг в событие v-sync (я буду реализовывать это также в Windows), но я бы хотел немного реагировать на остальную часть кода.
Посмотрите на это так: я хотел бы иметь возможность обрабатывать остальные, пока GPU все равно делает вещи, я не хочу ждать, когда v-sync начнет делать вещи, которые уже были обработаны до только тогда начните отправлять материал на GPU. Вы понимаете, что я имею в виду?
Если мне нужно взглянуть на это с совершенно другой точки зрения, скажите, пожалуйста.
Если мне нужно прочитать книги/руководства/учебники/что-нибудь для этого, скажите, пожалуйста, что читать!
Я не разработчик cocoa, я не программист на объекте c, мой движок игры полностью на С++, но я знаю, что мой путь вокруг xcode достаточно, чтобы отобразить окно и показать, что я рисую внутри этого окна, Он просто не обновляется, как моя версия Windows, потому что я не знаю, как правильно это сделать.
Обновление: я даже считаю, что мне нужен какой-то цикл, даже если я хочу синхронизировать по вертикальной обратной линии. Программирование OpenGL в документации MacOSX показывает, что это делается путем установки SwapInterval. Поэтому, если я правильно понимаю, мне всегда понадобится какой-то цикл при рендеринге реального времени на Mac, используя параметр swapInterval, чтобы снизить потребление энергии. Это правда?