ゲームエンジンをmacに移植しようとしているときに、1つの基本的な(しかし大きな)問題に遭遇しました。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秒ごとよりも速く呼び出す必要があります。(ちなみに、私のスレッドインフラストラクチャは次のとおりです。スレッドはイベントを同期キューに入れ、メインスレッドはプロセスイベントを呼び出します。これはメインスレッド内の同期キュー内のアイテムを処理します。これはネットワーク関連、画像の読み込み/処理、パーリンノイズに使用されます。世代など...など...)
同様の方法でこれを実行できるようにしたいと思いますが、これに関する情報はほとんどありません。レンダリングをv-syncイベントに配置してもかまいません(これはWindowsにも実装します)が、残りのコードの応答性をもう少し高めたいと思います。
このように見てください:GPUが処理を実行している間に残りを処理できるようにしたいと思います。v-syncが処理を開始するのを待ってから、すでに処理されているはずの処理を開始するのを待ちたくありません。 GPUにデータを送信します。私の言いたいことが分かりますか?
これをまったく別の視点から見る必要がある場合は、教えてください。
このために本/ガイド/チュートリアル/何かを読む必要がある場合は、何を読むべきか教えてください!
私はココア開発者ではなく、object-cプログラマーでもありません。また、ゲームエンジンは完全にC ++ですが、ウィンドウを表示し、そのウィンドウ内に描画したものを表示するのに十分なxcodeの使い方を知っています。私はそれを正しくする方法がわからないので、それは私のウィンドウズバージョンのように更新されません。
更新:垂直リトレースで同期したい場合でも、何らかのループが必要だとさえ信じています。MacOSXドキュメントのOpenGLプログラミングは、これがSwapIntervalを設定することによって行われることを示しています。したがって、正しく理解していれば、Macでリアルタイムにレンダリングするときは、swapInterval設定を使用して電力使用量を減らすために、常に何らかのループが必要になります。これは本当ですか?