7

現在、Windows と Mac OS X の両方で動作するゲームを書いています。メインのゲーム ループは次のようになります。

while(running)
{
    ProcessOSMessages(); // Using Peek/Translate message in Win32
                         // and nextEventMatchingMask in Cocoa
    GameUpdate();
    GameRender();
}

それは明らかに少し単純化されていますが、それがその要点です。アプリケーションを完全に制御できる Windows では、うまく機能します。残念ながら、Apple には Cocoa アプリで独自の方法があります。

Cocoa で最初にメイン ループを実装しようとしたとき、どこに配置すればよいかわからなかったので、この投稿NSApplicationに従って独自のループを作成しました。私は自分の機能に自分の権利を投げかけ、すべてが正しく機能しました。GameFrame()run

しかし、それが「正しい」方法だとは思いません。機能するソリューションをハッキングしようとするのではなく、Apple のエコシステム内でうまく遊びたいと思っています。

Apple のこの記事では、 を使用した古い方法と、 をNSTimer使用した「新しい」方法について説明していCVDisplayLinkます。私はCVDisplayLinkバージョンを接続しましたが、それはただ....奇妙に感じます. ゲームがディスプレイによって駆動されるという考えは好きではなく、その逆ではありません。

CVDisplayLinka を使用するか、自分のものを上書きするオプションは 2 つだけNSApplicationですか? これらの解決策のいずれも、まったく正しくないと感じています。

4

3 に答える 3

2

実際にこれを行ったことのある人が参加してくれるかどうか知りたいのですが、私の理解は次のとおりです。

Apple は、UI コントロールの応答性が向上するため、をCVDisplayLink使用するメイン スレッドでループを実行することよりもソリューションを推進しています。-nextEventMatchingMask:untilDate:inMode:dequeue:これは、フルスクリーン ゲームには関係ない場合があります。NSApplication(注:その形式のゲーム ループを使用するために置換する必要はありません )使用に関する主な潜在的な問題CVDisplayLinkは、事前に 1 フレームしか実行されず、この決定が早期に行われることであり、これは垂直よりも強力です。同期します。プラス面としては、レイテンシが改善される可能性があります。

その他のソリューションには、レンダリングをゲーム ロジックから分離すること、ゲーム ロジックをメイン スレッドで定期的に実行し、スレッドでレンダリングすることが含まれCVDisplayLinkます。ただし、ゲーム駆動型ディスプレイのパラダイムで問題が発生した場合にのみ、これをお勧めします.

于 2012-03-25T23:00:46.577 に答える
1

アプリの実行ループが Cocoa で隠されているという事実を回避するために、必ずしも独自の NSApplication ベースのクラスを作成したり、CVDisplayLink を使用したりする必要はありません。

スレッドを作成して、代わりに実行ループをそこに入れることができます。

ただし、価値があるのは、CVDisplayLink を使用することだけです。

于 2012-03-26T10:16:59.823 に答える