1

友人と私は、2 つの AI が互いに戦うゲーム エンジンを作成しています。AI スレッドがゲームの速度を落としたり、任意のユニットを自由に破壊したりできないように、ゲーム エンジン スレッドを設定しようとしています。

私たちが抱えている問題は、ゲーム エンジンと AI の間でデータを共有する必要があることです。今までは を使用synchronizeしていましたが、AI は変数をブロックするだけで、ゲーム エンジンはそれ以上先に進むことができません。または、AI が同期しないことを選択してゲームをクラッシュさせる可能性もありますが、これも私たちが望んでいることではありません。

Lock の実装を検討してきましたが、これは AI が変数を使用する前にロックされているかどうかを確認することを前提としているようです。

私たちがやりたいことは、データがロックされている場合の予測可能な時間を調べることです。ロックされている場合、AI は失格となります。それ以外の場合は、ゲームを続行します。同期の問題は、進行がデフォルトであり、変数がロック解除されるまでゲームエンジンが待機し、ハングする可能性があることです。

質問

変数がロックされているかどうかを確認してロックを強制できるように、変数/共有データをロックする方法は? または、ロックを伴わない解決策はありますか?

4

4 に答える 4

2

これを保証する唯一の方法は、どちらのシステムもコードを制御できない中立的な領域で AI が情報を共有することです。このようにして、同期またはロックまたは並行コレクションを使用できますが、どちらの AI もこの情報を保持するコードにアクセスできないため、互いに悪影響を与えることはありません。ロックが公開されておらず、共有ストアによって制御されていることを確認します。

于 2013-07-15T11:07:22.460 に答える
1

常に同期/ロック/ロック解除コンテキストからのみ共有データを読み書きすることをお勧めします。

What we would like to do is look at a predictable time if our data is locked.

はい、できます。ReentrantLock を使用します。 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/ReentrantLock.html

それはApiのようなものを持っています

 boolean tryLock(); // it will return true if lock available else false

 boolean tryLock(long time, TimeUnit unit) // same as above but will wait for the time 
     // you specify and and also can be interrupted.

ReadWriteLock のようなロックのフレーバーが他にもあります。要件に最も適したものを確認してください。

于 2013-07-15T11:08:48.803 に答える
0

インターフェイスLockとその実装をご覧ください: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html

また、java.util.concurrent.locksパッケージのドキュメントを参照してください: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/package-summary.html

于 2013-07-15T11:08:22.133 に答える