2009-06-12 4 views
6

OS Xゲームでは、これはキーボードとマウスイベントを取得する方法として推奨されていました。誰でも知っているnextEventMatchingMask:untilDate:inMode:dequeue:イベントを返すのに何ミリ秒かかりますか?

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
for(;;) 
{ 
    NSEvent* event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:nil inMode:NSDefaultRunLoopMode dequeue:YES]; 
    if(!event) break; 
    processevent(event); 
    ... 
} 
[pool release]; 

ゲームメインループ(クロスプラットフォーム)で呼び出されます。

OSX 10.5.Xの最新バージョンでは、イベントが発生したときに突然このイベントが数ミリ秒かかるため、ゲームのフレームレートはイベントが発生したときにいつも影響を受けます。複数のイベントがある場合は、遅いMacではフレームごとに10ミリ秒かかることがあります。

これはなぜですか?それとも、ゲームにあまり影響を与えずにイベントを得るために何ができるのですか?

マウスの位置を手動で取得することで、マウスのイベントを自分で管理していましたが、画面の端に近づくと中央に歪みましたが、動きの障害になります(カーソルが隠れている場合のみコース)。

他の選択肢は、すでにジョイスティック用に行っているHIDマネージャからのものですが、HIDはそれほど明確ではありません。

Macが高速になればなるほど、これらのヒッチがイベントを受け取ることが顕著になります。

答えて

1

オハイオ州オフハンド、私は方法がなぜ戻ってくるのに時間がかかるのかわかりません。それはcocoa-dev listまたは別のAppleフォーラムリソースで調査する価値があります。私の推測では、イベントを自分で管理するのは悪い考えです.AppKitはそのために最適化されており、スローされたカスタムコードよりもはるかに高速になると確信しています。

ただし、ゲームに影響を与えないようにするためにできることがあります。別のスレッドに入れてください。これは、長いメソッド呼び出し中にUIがフリーズしないようにするための推奨される方法です。アップルはIntroduction to Threading programming guideを公開しています。これは、必要とする重要な概念に迅速に対応するのに役立ちます。

2

私はあなたのループの中にautoreleaseプールを解放し、再割り当てする必要があると思います:あなたがループを持っているので、オートレリースされたアイテムはすべて蓄積され、決してフラッシュされません。

1

[NSDate distantFuture]または[NSDate distantPast]のように、untilDate引数の実際の値を使用する必要があると思います。この関数は、前者の場合はイベントが利用可能になるまでブロックし、後者の場合はすぐにnilイベントを返します。

私はこれをGLFWソースコードから学びました。

関連する問題