1

まず、私は Objective-C の初心者です。私のバックグラウンドのほとんどは Java です。また、ほとんどの Objective-C に関する質問は Cocoa に関するものであるため、これはGNUStepに関するものであることを指摘しておく必要があります。

学校のプロジェクトのために、単純なエージェント ベースのモデリング フレームワークを作成しています。これらのフレームワークは通常、複雑なシステム (病気の蔓延など) をモデル化するために使用されます。私のフレームワークには、ワールドとバグという 2 つの主要なオブジェクトがあります。世界は「レイヤー」で構成され、各レイヤーはトロイダル グリッドに関連付けられています。世界には虫が住むことができ、それぞれの虫には x 座標と y 座標、および虫が属するレイヤーがあります。

私の一般的な考えは、世界にバグを追加し、バグごとにスレッドを起動して、バグがやりたいようにすることです。メイン クラスをサブクラス化し、プロトコルで定義されたメソッドBugを実装することで、あらゆる種類のバグを作成できます。actこのようにして、さまざまな種類のカスタム バグとカスタム動作を作成できます。バグは、世界と相互にやり取りできる必要があります (世界からバグを削除したり、世界にバグを追加したり、自分自身を移動したりします)。ご覧のとおり、これはすぐにマルチスレッド地獄に向かっています。

現在、私はたくさんの@synchronizedブロックを持っており、世界が常に一貫した状態に保たれるようにするのに苦労しています。バグは世界と通信して行動する必要があり、その逆も同様であるため、これは特に困難になります。RandomBug世界中をランダムに移動するa という単純なバグを実装しようとしています。状態が破損したり無効になったりする可能性がある潜在的な問題が見られるため、これでさえ困難であることが証明されています。

と を調べ始めたのはNSOperationNSOperationQueueこれにより作業が簡単になる可能性があるためです。これに関して2つの質問があります。

  • NSOperations を繰り返し (つまり、特定の間隔で)実行する簡単な方法はありますか。
  • スレッドの最大同時操作数を 1 に設定した場合でも、@synchronizedブロックは必要ですか? ある時点で世界とやり取りするスレッドは 1 つだけではありませんか?
  • この種の問題 (複数のスレッドが 1 つの共有リソースと繰り返し対話する) に取り組むためのより良い方法はありますか?
  • スレッド化を完全にやめて、単純に世界のバグを反復処理し、ランダムにアクティブ化する必要がありますか?
4

1 に答える 1

2

ゲーム/シミュレーションループのようなものが必要なようです...したがって、シミュレーションのタイムステップごとに実行ループの「更新ワールド」フェーズがあり(によってトリガーされますNSTimer)、各バグが相互作用する機会があります。世界; 繰り返す。バグがCPUに集中していない限り、これが最善の方法かもしれません。

NSOperationの使用に関しては、確かに、これによりすべてのCPUコアを使用できるようになる可能性がありますが、ワールドステートにアクセスするための競合が多い場合、これは結局のところ勝利ではない可能性があります。その場合、あなたはあなたの世界の各タイルをあなたが@synchronized対抗できる別々のオブジェクトにして、競合を減らしそしてあなたのCPUのより良い使用を可能にすることを試みるかもしれません。

シングルNSOperationQueueと設定を使用することmaxConcurrentOperations = 1は、基本的にゲームループを実装することと同じです。を使用するが、 maxConcurrentOperationsNSOperationQueueを設定しない場合は、CPUコアと同じ数の操作を同時に実行することを期待します。NSOperationQueue

于 2012-08-21T04:01:58.420 に答える