編集:
今日、私は自分のコードを少し操作し、バックグラウンドスレッドタスクにメインスレッドタスクよりもいくつかの利点を与えました。基本的に、一方のスレッドは配列内の偶数番号のアイテムを処理し、もう一方のスレッドは奇数番号を処理します。バックグラウンドスレッドに偶数の半分を与えました。これは奇数の半分以下になります。また、while(!collisionDone)
スレッドセーフを維持するために、コードの少し後の方に移動しました。そこに入れて、NSLog
その時点に達したときに条件が偽であり、一度も発火していないかどうかを検出します。さらに、インストルメントビルドは正常に動作するようになりました。これは、問題がwhileループでメインスレッドをストールさせていることを意味します。つまり、私の質問は次のとおりです。
バックグラウンドスレッドがタスクを完了するまで待機するために、メインスレッドをどのように停止する必要がありますか?おそらくNSLock
、その機能を実現するためにどのように使用するかを示していますか?
今日は、ゲームのラグを減らすためにマルチスレッドを追加しました。NSTimerを使用して、次のようなタイムループ関数を呼び出しています。
[NSTimer scheduledTimerWithTimeInterval:0.03 target:self selector:@selector(time:) userInfo: nil repeats: true];
次に、その関数では、次のようになります。
//run collision using multithreading
collisionDone = false;
[self performSelectorInBackground:@selector(collideBackground:) withObject:objectToSend];
[self collideMain:objectToSend];
while (!collisionDone) {
//notdone
}
アイデアは、あるスレッドで1セットの衝突チェックを実行し、別のスレッドで別のセットを実行しているということです。空のwhileループは、関数を続行する前にバックグラウンドスレッドが完了したことを確認するためのものです。このビットの後、コードはビューを更新します。
これはすべて正常に実行されますが、FPSを確認するためにInstrumentsにアクセスしたところ、ゲームがフリーズしていることがわかりました。タイムループの最初の実行のどこかでフリーズしているようです。アプリはマルチスレッドの前にInstrumentsで正常に実行されました。マルチスレッドは、[self collideBackground:objectToSend]
別のスレッドに送信するのではなく単に使用することを除いて、基本的に同じように機能しました。バックグラウンドスレッドが完了していないか、まったく実行されていないように見えるため、collisionDoneは常にfalseになります。したがって、アプリは、強制終了するまでその無限のループで待機します。
また、その行をに置き換えてみたところ、[self collideBackground:arrayToSend];
再び動作し始めました。私が試したもう一つのことは、最初に置くことNSLog(@"called");
です、viewWillAppear:
そしてそれはちょうどもう1つのフレームを実行しているようです!?!?!?
なぜこれが起こっているのか、そしてそれをどのように修正するのかについてのアイデアが欲しいです。シングルスレッドですべてを実行すると修正されるため、マルチスレッドとは無関係ではないかと思います。