Kendi oyunumda benzer bir tedarik sistemi geliştiriyorum, bu yüzden arz kilidi sorununun ve favoritizmin nasıl çözüleceğini de düşünüyorum. Sorunu göstermek için basit bir örnek oluşturacağım:
Bir listeniz varsa: [yapımcı1, tüketici1, tüketici2, tüketici3] ve sipariş = 0'dan başlayarak sırayla güncelleme yaparsanız, şunları elde edersiniz:
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...
Tüketici1 tüm eğlenceyi alırken, tüketici 2 ve 3 tüketici 1 tatmin olana kadar açlıktan ölüyor. Oyununuza bağlı olarak, bu istenmeyebilir. Oyunumda biliyorum, değil. Oraya geldiğimde, bir kene ile beslenen tüketicilerin bir sonraki kene için kuyruğun arkasına geçeceği bir kuyruk oluşturacağım, ki Roy T.'nin ne olduğuna inanıyorum. Yukarıdaki örnek şöyle görünecektir:
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...
Bu şekilde, herkes kaynaklardan adil bir şekilde pay alacaktır.
Ayrıca, kullanıcının kaynak önceliğine sahip belirli yapıları seçebilmesi için öncelik kuyruğu olarak kullanılacak ek bir kuyruk uygulamayı planlıyorum. Öncelik kuyruğu her zaman standart kuyruktan önce sunulur. Önce tüm üreticilerin güncellendiğinden emin olun, ardından tüm kaynakları ikinci sırada kullanın, aksi takdirde kaynakları bir onay işaretiyle kısmen ürettiğinizde ve bazı tüketiciler zaten aç bırakıldığında kuyruk bozulur.
Özetle: Üreticileri güncelleyin, ardından öncelik sırasını, beslenen tüketicileri öncelik sırasının sonuna taşıyın, ardından standart kuyruğu güncelleyin ve beslenen tüketicileri standart kuyruğun sonuna taşıyın.