0

私はゲーム sim に取り組んでおり、マッチ シミュレーション ビットを高速化したいと考えています。特定の日付で、シミュレーションが必要なマッチが 50 件以上ある場合があります。現在、私はそれぞれをループして、自分自身をシミュレートするように指示していますが、これには永遠にかかる可能性があります. 私は望んでいた

1) 「忙しい」画面を重ねる

2)それぞれのスレッドを起動します

3) 最後のスレッドが終了したら、オーバーレイを削除します。

これで 1 と 2 を実行できますが、最後のスレッドがいつ終了したかを知る方法がわかりません。これは、デタッチした最後のスレッドが最後のスレッドではない可能性があるためです。それを行う最善の方法は何ですか?

また、通常はスレッドを使用して、ユーザーが他の作業を行っている間にバックグラウンドで作業を行うことができますが、私はそれを少し異なる方法で使用しています。私のアプリはコアデータアプリであり、試合をシミュレートしている間、ユーザーが他の方法でストアに触れないようにしたい. したがって、ほとんどの場合はシングルスレッドが必要ですが、sim エンジンに時間がかかるため、この状況ではマルチスレッドが必要です。誰かがこのアプローチについて他のアイデアを持っている場合、私はオープンです。

ロブ

4

5 に答える 5

2

おそらく、50スレッドではなくNSOperationを使用したいでしょう。iPhoneでは50スレッドは正常ではなく、NSOperationsは起動が簡単です。一度に50を実行しようとすると、パフォーマンスが低下している可能性があります(私の推測です)。NSOperationは、まさにこの問題のために設計されています。さらに、コーディングも簡単です。

NSOperationに関する私の唯一の問題は、呼び出し元に完了したことを通知する標準的な方法がないことです。

NSOperationQueueを定期的にポーリングできます。カウントが0の場合、残りはありません。また、各操作でカウンターをインクリメントすることもできます。カウントが50になると、完了です。または、各操作は、実行されたメインスレッドでperformSelectorOnMainThreadを使用して通知を投稿できます。

単一のコアでもパフォーマンスが向上するはずです。メインスレッドがブロックされ、ユーザー入力やグラフィックスの描画などを待っていることがよくあります。さらに、マルチコア電話とiPadは1年以内に発売される可能性があります(完全な推測ですが、今後発売される予定です)。

また、Instrumentsでの操作も確認してください。計算を2倍または10倍に高速化できる可能性があります。

于 2010-09-06T17:30:58.310 に答える
1

あなたはシングルコアを使用しているので、スレッド化はおそらくあまり役​​に立たず、オーバーヘッドは物事を遅くすることさえあります。

最初に行うことは、Instrumentsを使用してコードのプロファイルを作成し、何を高速化できるかを確認することです。それが済んだら、ボトルネックの特定の最適化を確認できます。

簡単なアプローチの1つ(GCDを使用できる場合)はdispatch_apply()です。これにより、一致をループし、ハードウェアに最適な方法で自動的にスレッド化し、すべてが完了するまで戻りません。

于 2010-09-06T15:13:21.047 に答える
0

特定の質問に対する解決策は @drowntoge から得られるかもしれませんが、一般的に、マルチスレッドについてアドバイスしたいと思います。

1/ グラハムが言ったように、常にプログラムを高速化するとは限りません。あなたのiPhoneにはシングルコアしかありません。

2/ プログラムに時間がかかる大きな IO、データベース、またはネットワーク プロセスがある場合は、データ処理に時間がかからず、データのロードを待つ必要があるため、マルチスレッドを検討できます。この場合、マルチスレッド化によりパフォーマンスが大幅に向上します。ただし、スレッドの切り替えにはオーバーヘッドがあるため、注意が必要です。

おそらく、IO 処理に必要なスレッドは 1 つだけで、画像/データを共有するためのキャッシュ レイヤーがあるとします。次に、ループしてシミュレーションを実行するメインスレッドのみが必要です

3/ ユーザーが同時に 50 のシミュレーションが発生するように見せたい場合は、マルチスレッドも必要です :)

于 2010-09-06T16:06:38.993 に答える
0

最も簡単な解決策は、終了する前に、すべてのスレッドがカウンターをデクリメントする特定のメソッドに対して「performSelectorOnMainThread」を実行することです。そして、デクリメントされたカウンターがゼロに達したときに、メソッドがオーバーレイ画面を削除できるようにします。

ただし、すべての一致を同時にシミュレートしても、必ずしもパフォーマンスが向上するとは限りません。

于 2010-09-06T15:19:19.063 に答える
0

スレッド化を使用すると、CPU がタスクを実行する順序がわからず、多くのスレッド スケジューリング リソースを消費する可能性があります。NSOperationQueue を使用し、performSelectorOnMainThread を使用して各タスクの完了を通知することをお勧めします。カウンターの減分については既に説明しましたが、これはプログレス バーの表示に役立つ場合があります。ただし、50 個のビジー フラグの配列を維持し、完了時にそれらをクリアすることもできます。タイム スタンプで完了をマークすると、特定のタスクが遅いかスタックしているかどうかのデバッグに役立つ場合があります。

于 2010-09-06T18:46:13.340 に答える