자원이 거의 소진되었을 때 어떻게 공장간에 자원을 공평하게 분배합니까?


12

내 게임의 주요 리소스는 mass 이며 시간에 따라 변하는 부동 소수점 숫자로 저장됩니다. 자원 노드는 질량을 증가시키고 공장은이를 비 웁니다. 예를 들어, 초당 5 질량의 자원 노드가있는 경우 5 * deltaT각 게임 단계에서 질량을 얻게 됩니다. 질량은 가장 가까운 정수로 반올림되어 표시되며 게인 / 손실 표시는 10 분의 1로 표시됩니다.

질량 타격 제로를 어떻게 처리해야합니까? 이는 여러 팩토리가 한 번에 빌드하려고 할 때 경쟁 조건을 만듭니다. 큐에서 먼저 팩토리를 사용하거나 더 많은 리소스가 들어 오면 더 적은 리소스를 우선적으로 사용하여 다른 리소스보다 빠르게 빌드합니다.

이 문제를 어떻게 처리 할 수 ​​있습니까? 단계를 완전히 건너 뛰어야합니까?


바, 내 의견이 저장되지 않았습니다. 나는 더 나은 설명을했다. 기본적으로 모든 개체가 모든 단계에 액세스하는 리소스가 있습니다. 각 개체는 리소스에서 더하거나 뺍니다. 내 문제는 리소스가 0에 도달하면 어떻게 해야할지 모르겠다는 것입니다. 일종의 대기열을 만들어야합니까? 객체의 단계를 건너 뛸까요? 뭐?
Mob

3
라운드 로빈. 문제 해결됨.
Patrick Hughes

아래 Roy의 답변은 이에 대한 의견과 결합하여 적당하고 유지 보수가 쉽고 라운드 로빈 시스템을 조정합니다. 당신의 즉각적인 디자인 문제가 해결되는 한 그것은 모두 좋은 =)
Patrick Hughes

답변:


9

Petr에 동의합니다. 정해진 방법이 없습니다. 어떻게하고 싶은지는 게임을 어떻게 디자인하고 싶은가의 문제입니다.

그러나이 상황에서 나는 당신이 얻고 자하는 기계공의 종류가 즉시 명백하다고 생각합니다. 당신은 가능한 한 대량의 양 안에서 가능한 빨리 물건을 생산하기를 원합니다.

용량 내에서 생산

나는 당신이 그들의 시스템과 매우 유사한 시스템을 수행하고 있기 때문에 최고 사령관의 책에서 잎을 가져갈 것입니다. 용량을 초과하여 생산하는 경우, 그것을 처리하는 가장 적은 방법은 전반적으로 생산 속도가 느려집니다. 생산 능력을 낮추는 것은 실제로 매우 간단합니다.

생산 속도 정비공

각 업데이트 단계에서 공장은 정해진 양만 생산하지 않습니다. 생산 속도로 운영되므로 각 단계에서 얼마나 많은 진전이 있는지 그리고 얼마나 많은 양을 사용하는지 결정합니다. 75 % 용량으로 생산하는 경우, 공장은 각 단계마다 75 % 많은 진전을 보이고 100 % 용량에 비해 75 %의 질량을 사용합니다.

생산 속도를 계산하려면 무언가를 구축하기 전에 공장에 문의하여이 단계에서 전체 용량으로 사용할 총 자원을 결정해야합니다. 그런 다음 간단한 계산을 수행하십시오.

production speed = (total mass capacity / mass required this step)
if (production speed > 1.0) production speed = 1.0

최대 용량으로 생산하려면이 단계에서 125 질량이 필요하지만이 단계에서 100 질량 만 가지고 있다고 가정 해 봅시다. 이 방정식은 0.8의 생산 속도 (소수점 80 %)를 제공합니다. 공장에 실제로 건물을 짓 도록 지시 할 때이 값을 전달하여 건물의 속도를 알려주십시오. 이제 생산이 전반적으로 느려집니다.

대안

생산 용량이 확보 될 때까지 공장을 일시적으로 종료 할 수 있으며, 용량이 매우 적을 때 발전기에서 멀리 떨어진 공장에서 발생하는 것을 보는 것은 매우 흥미로울 수 있습니다.

여러 자원?

당신이 이것을 어떻게 처리하는지 당신에게 달려 있습니다. 많은 옵션이 있습니다. 가장 간단한 방법은 각 리소스의 생산 능력을 계산 한 다음 가장 낮은 리소스를 선택 하여 가장 약한 리소스가 나머지 모든 리소스에 병목 현상을 일으키는 것입니다.


공장에서 생산하는 것은 고정 된 양의 질량을 사용하기 때문에 80 %의 속도로 생산하도록 공장에 지시 할 필요조차 없다고 생각합니다. 예를 들어, 빌드하는 데 100 질량이 걸리는 탱크를 빌드하면 일반적으로 팩토리는 사이클마다 2 질량을 사용할 수 있습니다. 이것은 탱크를 완성하는 데 50 사이클이 걸리고 매 사이클마다 탱크의 현재 질량에 2를 추가한다는 것을 의미합니다. 이제 1 개의 질량 만 사용할 수 있습니다. 이것은이 사이클을 의미합니다. 현재 사용 된 탱크의 질량이 2가 아니라 1 씩 증가합니다. 각 사이클이 끝나면 현재 질량과 탱크가 완전히 구축되었는지 확인하는 데 필요한 총 질량을 확인하십시오.
토마스

사용 가능한 질량이 0 인 경우 탱크에 질량을 추가하지 마십시오. 이런 식으로 무언가를 만드는 데 걸리는 시간은 대량 수입에 따라 달라질 수 있습니다. 2 질량 / 사이클을 사용할 수 있고 3 소득 만 사용할 수있는 2 개의 공장이있는 경우, 탱크 1은 50 사이클로, 탱크 2는 100으로 빌드됩니다. 또 다른 방법은이를 사용하는 모든 공장에서 사용 가능한 총 질량을 분할하는 것입니다. 적극적으로 someting 구축). 공장에서 사용할 수있는 총 질량은 공장에 레벨을 추가하여 업그레이드 할 수 있습니다. 예를 들어 1 단계에서 2 단계, 2 단계에서 3 단계 등을 사용할 수 있습니다.
Thomas

@Thomas 제작 과정에서 제품에 질량을 추가하는 것은 단순히 제품의 백분율을 완성하는 것과 비교할 때 지나치게 복잡한 방법으로 보입니다. 특히 공장은 단순한 "생산 속도"속성 대신 자원 시스템에 대한 모든 정보를 알아야합니다. 플레이어에 대한 결과가 동일하면 구현을 가능한 한 단순하게 유지하십시오. 또한 나중에 리소스를 추가 / 제거 할 때와 같이 변경하기가 더 쉽습니다.
Hackworth

@Hackworth 나는 동의하지 않는 경향이있다. 공장은 자원 시스템에 대해 알 필요가 없다. 공장은 건물과 건물의 거리 만 알고 있습니다. 자원 시스템은 팩토리에 X 양을 빌드에 추가하도록 지시합니다. 이 방법으로이 공장이 보유한 자원 수입의 백분율을 계산할 필요가 없으며 자원 수입을 추가 완료율로 변환 할 필요가 없습니다.
Thomas

6

Jonathan Hobbs의 답변이 마음에 들지만 대기열 시스템이 더 간단하다고 생각합니다.

Queue<Factory> queue = ...;
int numFactories = ...;

Update()
{
    int resources = GetAllResourcesForThisStep();
    for(int i = 0; i < numFactories; i++)
    {
        if(queue.Peak().RequiredResources <= resources)
        {
            Factory f = queue.Pop();
            resources -= f.RequiredResources;
            queue.Push(f);
        }
        else
        {
            break;
        }
    }
}

이것은 아마도 Jonathan의 구현과 같은 방식으로 평균적으로 작동합니다. 그러나 Jonathan의 솔루션은 작업 속도가 매우 낮게 설정되어 있고 구현 에이 프레임에 대한 리소스 요청이 매우 높은 공장이있을 수 있으므로 여러 프레임에 대한 다른 공장을 차단해야합니다.


+1 질문과 같이 이중 리소스로 게임을 개발하고 있으며 공급 잠금 문제를 해결하려고 할 때 이와 비슷한 것을 사용할 계획입니다. 정확한 코드는 아니지만 그 기본 개념입니다. 한 틱으로 리소스를 사용할 수있는 소비자는 다음 틱 동안 우선 순위가 낮아집니다. 또한이 소비자가 우선 순위가 높은지를 나타내는 플래그를 추가하고 해당 플래그를 사용자에게 제어 할 계획입니다.
John McDonald

별개의 우선 순위를 부여 할 경우 기아에주의하십시오. :)
Roy T.

별도의 우선 순위를 가진 기아가 목적이 될 것입니다. Settlers 4 또는 Knights & Merchants를 한 적이 있습니까? 건물을 과도하게 건설하면 제한된 자원이 무작위 건물로 이동하여 무엇이든 끝내는 데 영원히 걸립니다 . 그러나 또한 건물이 중요한지 여부를 선택할 수 있으며,이 경우 자원이 중요한 건물로 먼저 이동합니다. 열쇠는 가능한 한 과도하게 구성하지 않으면 안됩니다.
존 맥도날드

5

내 게임에서 비슷한 공급 시스템을 개발 중이므로 공급 잠금 문제와 편애를 해결하는 방법에 대해서도 생각하고 있습니다. 문제를 설명하기 위해 간단한 예를 작성하겠습니다.

[producer1, consumer1, consumer2, consumer3] 목록이 있고 supply = 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이 만족할 때까지 굶주립니다. 게임에 따라 바람직하지 않을 수 있습니다. 나는 내 게임에서 그렇지 않다. 내가 그것에 도달하면, 나는 한 진드기에 공급 된 소비자가 다음 진드기의 대기열 뒤로 이동하는 대기열을 만들 것입니다. 이것이 Roy T.가 얻는 것입니다. 위의 예는 다음과 같습니다.

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...

이런 식으로 모든 사람이 자원을 공정하게 분배합니다.

또한 우선 순위 대기열로 사용할 추가 대기열을 구현하여 사용자가 리소스 우선 순위를 갖는 특정 구조를 선택할 수 있도록 계획하고 있습니다. 우선 순위 대기열은 항상 표준 대기열보다 먼저 제공됩니다. 모든 생산자를 먼저 업데이트 한 다음 모든 자원을 두 번째로 소비해야합니다. 그렇지 않으면 틱을 통해 자원을 생산하고 일부 소비자가 이미 기아 상태가되면 대기열이 중단됩니다.

요약 : 생산자를 업데이트 한 다음 우선 순위 대기열을 업데이트하고 피드 소비자를 우선 순위 큐의 끝으로 이동 한 다음 표준 큐를 업데이트하여 피드 소비자를 표준 큐의 끝으로 이동하십시오.


한계에 도달하면 모든 소비자가 마칠 때까지 소비자가 끝나지 않는다는 것을 의미 할 수 있습니다. 현실적인 생산 체인 시나리오에서 이는 거의 불가능하며 누군가가 대규모 군대를 위해 건설 대기 행렬을 원한다면 상당히 재앙이 될 수 있습니다. 그는 군대가 건설되는 전체 시간 동안 실질적으로 병력이 없다.
Cardin

그 대답은 제가 그 질문을 읽을 때의 초기 생각이었습니다. 또한, 틱당 소비되는 질량은 완전한 단위를 생성하기위한 질량 일 필요는 없지만 시간이 지남에 따라 필요한 단위 비용이므로 단위가 아닌 한 @Cardin의 우려가 유효한지 확실하지 않습니다. 틱당 비용은 총 수집 속도에 매우 가깝습니다. 플레이어가 우선 순위 대기열을 명시 적으로 관리하여 굶주림을 결정할 수 있습니다.
brice

@ Cardin, 당신은 꽤 정확하지만 게임 메카닉으로도 사용될 수 있습니다. Settlers 4, Knights & Merchants, Total Annihilation, Supreme Commander는 제가 알고있는 게임입니다. 비결은하는 것입니다 하지 이 공급 잠금 장치에 도달하고, 당신이 할 경우, 당신이 최대한 빨리 공급 잠금의 나가합니다. 우선 순위 대기열을 추가하면 사람들이 더 쉽게 나갈 수 있습니다.
존 맥도날드

3

글쎄, 우리 가 채팅 에서 조금 논의했기 때문에 John의 아이디어를 확장하겠습니다 .

편집 :이 솔루션은 실제로 소모품이 공장에서 자원 배치를 얻는 빈도와 관련이있는 경우에만 선호됩니다. 모두 동일하면 실제로 대기열을 사용할 수 있습니다.

내 해결책 : 모든 공장이 우선 순위 대기열에 나열되어 있습니다. 공장이 기아로 고통 받고있을 때 우선 순위가 증가합니다. 공장에서 자원을 소비하면 기아, 우선 순위가 0으로 설정됩니다. 최우선 순위는 항상 다음 리소스 배치를 얻는 것입니다.

어떤 종류의 의사 코드에서 어떤 팩토리가 어떤 리소스를 가져 오는지 결정하는 경우 :

iterator i = factoryqueue.start()
bool starvation = false
while(i.next())
  if(i.ready)
    if (!starvation) 
      if (i.consumeAmount < resource.count) starvation = true
      else 
        i.consume(resource)
        i.priority = 0
    if (starvation)
      i.priority += 1

이 방법으로 팩토리는 차례로 1 개의 제품을 하나씩 만들며, 더 저렴한 제품이 더 자주 만들어 지도록 consumerAmount를 고려하여 조정하려는 경우 예를 들어 1 / consumeAmount의 우선 순위를 높일 수 있습니다.


나는 이것을 공표하고 싶지만 이것이 무엇을 의미하는지 확실하지 않습니다-기아를 추적하지만 그렇지 않으면 (아마도) 대기열을 통해 정상적으로 정상적으로 회전하고 기아와 우선 순위가 모두 나타나지 않습니다. 무엇이든 할 수 있습니다.
doppelgreener

우선 순위를 + = 1 / amountThisFactoryConsumes만큼 늘리면 차이가 분명해지며, 제품을 작성하기 위해 더 많은 자원이 필요한 항목은 약간 뒤쳐져 서 더 적은 자원이 비례하여 더 많은 자원을 가져갈 수 있습니다. 이것은 심지어 공장 당 자원 비율을 초과 할 것입니다. 그러나 자원이 공장에서 소비 될 때마다 기아 번호가 마법 번호 0으로 설정되어 있기 때문에 이것은 여전히 ​​멍청한 증거는 아닙니다. 따라서 자원 갱신이 변동될 때 정확하게 균등하게 분배되지는 않을 것입니다.
Toni

실제로 이것이 실제로 보장되지 않는지 확실하지 않습니다. 그래프를 그리고 확실하게 테스트해야합니다.
Toni

아, 그리고 우선 순위는 우선 순위 큐 자체의 품질입니다. 나는 그것을 만드는 방법을 설명하지 않을 것입니다. 우선 순위 큐 자체는 항상 멤버의 우선 순위 값에 따라 정렬됩니다.
Toni

+1 우선 순위 대기열임을 이해하면 작업이 단순 해 보입니다. 대기열을 따라 내려 가서 리소스를 소비 할 수있는 가장 빠른 것을 선택하십시오. 용량이 엄청나게 분할 된 경우 (이 틱에 1,000 개의 리소스가 있지만 100 개의 100 개의 리소스 빌드가있는 경우) 이것은 문제가되지 않으며 작업이 상당히 잘 진행됩니다. 자원이이 진드기보다 훨씬 위에 있어도 결국 약간의 진전을 이루기에 충분한 시간을 절약 할 수 있습니다. 이는 속도를 늦추거나 큰 일을 작은 일에 찬성하여 큰 일을 완전히 중단 시키는 것입니다. 나는 이것을 많이 좋아한다. :)
doppelgreener

2

이상한 질문입니다.

내 문제는 리소스가 0에 도달하면 어떻게 해야할지 모르겠다는 것입니다. 일종의 대기열을 만들어야합니까? 객체의 단계를 건너 뛸까요? 뭐?

당신이해야 할 일은, 게임 로직에 따라 달라집니다 당신이 만들 수 있습니다. 당신은 대기열을 할 수 있습니다, 당신은 건너 뛸 수 있습니다. 게임이 어떻게 동작해야하는지에 따라 다릅니다. 당신의 질문에 내가 틀렸다면 나를 바로 잡으십시오.


1

모든 구성에 대해 틱당 총 총 리소스 수요를 유지할 수 있습니다. 하나의 자원 스토리지가이 필요한 양보다 적 으면 스토리지가 최소한 1 틱의 생산을 지원할 수있을만큼 수집 될 때까지 모든 구성이 완전히 중지됩니다. 그런 다음 생산을 재개 할 수 있습니다.

따라서 생산 속도를 플로트로 저장하는 대신 공장에서 최대 속도로 생산하든 그렇지 않든 바이너리입니다.

즉,이 접근법은 생산 속도 특수 사례 0.0 및 1.0에 대해 Jonathan의 답변과 본질적으로 동일합니다. 0.0 <= f <= 1.0의 임의의 부동 소수점 f는 저장 용량이 적지 않기 때문에 아마도 더 우아합니다. 하지만 논리는 조금 더 단순해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.