私は自分のゲームで同様の供給システムを開発しているので、供給ロックの問題を解決する方法と、偏見も考えています。問題を説明するために、簡単な例を作成します。
リストがある場合:[producer1、consumer1、consumer2、consumer3]、supplier = 0から順番に更新すると、次のようになります。
producer1 produces 5 mass. You now have 5 mass
consumer1 wants 3 mass. Success, you now have 2 mass
consumer2 wants 3 mass. Fail
consumer3 wants 3 mass. Fail
[next tick]
producer1 produces 5 mass. You now have 7 mass
consumer1 wants 3 mass. Success, you now have 4 mass
consumer2 wants 3 mass. Success, you now have 1 mass
consumer3 wants 3 mass. Fail
etc...
消費者1はすべての楽しみを享受し、消費者2と3は消費者1が満足するまで飢えます。ゲームによっては、これは望ましくない場合があります。私のゲームでは知っていますが、そうではありません。それに近づいたら、1つのティックで供給された消費者が次のティックのためにキューの後ろに移動するキューを作成します。上記の例は次のようになります。
producer1 produces 5 mass. You now have 5 mass
consumer1 wants 3 mass. Success, you now have 2 mass. <-- Move to end of queue
consumer2 wants 3 mass. Fail
consumer3 wants 3 mass. Fail
[next tick]
producer1 produces 5 mass. You now have 7 mass
consumer2 wants 3 mass. Success, you now have 4 mass <-- Note the order change
consumer3 wants 3 mass. Success, you now have 1 mass
consumer1 wants 3 mass. Fail
etc...
このようにして、誰もがリソースの公平な分配を得ます。
また、ユーザーがリソースの優先度を持つ特定の構造を選択できるように、優先度キューとして使用される追加のキューを実装する予定です。優先キューは常に標準キューの前に提供されます。すべてのプロデューサーが最初に更新され、次にすべてのリソースが消費されることを確認してください。そうしないと、ティックの途中でリソースを生成し、一部のコンシューマーがすでに飢already状態になっているときにキューが壊れます。
要約すると、プロデューサー、次に優先度キューを更新し、フィードコンシューマを優先度キューの最後に移動し、次に標準キューを更新して、フィードコンシューマを標準キューの最後に移動します。