2008-10-02 4 views
4

내가 염두에두고있는 시뮬레이션 게임의 종류는 다양한 위치에 건설 할 물건과 그러한 장소를 연결하는 근로자/운송인이있는 종류입니다.시뮬레이션 게임에 대한 고려 사항

더 많은 것은 정착민 시리즈와 비슷합니다.

현재 그래픽이 필요 없다고 가정 해 보겠습니다. 으로 관리 할 수 ​​있다고 생각합니다.

  1. 모든 엔티티 클래스해야하며, 각각의 스레드가 :

    그래서 내 의심은 다음과 같습니다?

  2. 엔티티는 클래스 내부의 목록에 그룹화되어야하며 각각 하나의 스레드가 있어야합니까?

구현 1을 수행하면 낮은 사양의 컴퓨터에서 실행하기가 매우 어려워서 많은 수의 경우 잘 확장되지 않습니다.

하나의 구현 2, 자원의 측면에서 더 나은 될 것하지만 ...

어떻게해야 내가 그룹 엔티티 걸린다면?

  1. 일반 주택용 클래스가 있고이를 관리 할 인터페이스 목록이 있습니까?
  2. 특정 주택 그룹에 대한 수업을 갖고 있으며이를 관리 할 개체 목록이 있습니까?

스레드는 어떻게됩니까?

  1. 단순한 기본 게임 루프를 사용해야합니까?
  2. 각 클래스 그룹에 대한 스레드가 있어야합니까?
  3. 근로자/운송인은 어떻게 사진에 적합합니까?

답변

14

일반적인 방법은 스레딩을 전혀 사용하지 않고 엔티티를 상태 시스템으로 구현합니다. 그런 다음 주회 돌이는 다음과 같습니다

while(1) 
{ 
    foreach(entity in entlist) 
    { 
     entity->update(); 
    } 

    render(); 
} 
+0

몇 가지 예외를 제외하고는 이것이 어떻게 수행되는지입니다. – postfuturist

2

하나의 스레드 만 게임 논리를 실행하기를 원합니다. 여러 스레드가 있으면 속도가 향상되지 않으며 코드가 혼란 스럽습니다. 게임에 멀티 플레이어가 있다면 상황이 다소 복잡해 지지만 메인 게임 루프를 갖는 것은 완벽합니다.

나는 수업과 관련된 질문에 대해 다소 혼란 스럽다. 귀하의 질문을 정확하게 이해한다면 제 제안은 일반적인 추상 기본 클래스 House에서 파생 된 각 유형의 집 (돼지 농장, 풍차 등)에 대한 수업을 작성하는 것입니다. 그런 다음 게임 세계의 모든 주택을 주택 목록에 저장하십시오.

+0

@Adam Pierce의 제안에 따르면 많은 스레드가 빠르게 관리하기 어려워 질 것입니다. 멀티 코어 프로세서를 사용하기 위해 게임 로직에 멀티 스레딩을 사용할 수 없었습니까? 행복한 매체를 찾을 수 있을까요? – Danimal

+0

IMHO 멀티 코어 프로세서는 여전히 희귀하고 스레딩은 끔찍하고 털이 많고 위험한 곳이므로 한 스레드 만 사용하는 것이 좋습니다. – Zarkonnen

0

그때 당신은 당신이 중 하나를 공유 기능에 대한 반복 코드있어 상황을해야하기 때문에 각 개체에 대해 별도의 클래스를 만드는 피할 것이다, 또는 당신은 펑키 상속을해야합니다 나무.

나는 원하는 것은 하나의 클래스와 그 위에 구성된 기능을 가진 객체라고 주장한다. 나는 RTS에서이 바로 그 개념에 관해 이야기하는 블로그에 관한 기사를 보았다. .. 기다림, 나는 그것이 design patterns that someone was writing의 여행이었다라고 생각한다.

각 개체의 DoEvents (더 나은 단어 부족) 메서드에 스레드를 생성하는 Visitor 패턴을 사용하여 각 개체에이 루프 동안 수행 할 작업을 수행하도록 지시합니다. 루프의 끝에서 스레드를 동기화하십시오. 왜냐하면 복잡한 논리를 가진 일부 오브젝트가 실제로는 5 루프 이전에 실제로 10 루프에서 다시 돌아 오는 것을 원하지 않기 때문입니다.

1

얼랑 사용에 대한 생각. Erlang을 사용하면 일반적인 시스템 스레드보다 훨씬 많은 프로세스 (경량 스레드)를 생성 할 수 있습니다. 그 분산 된 의미는 시스템이 충분하지 않다면 다른 노드를 추가하는 것입니다.

또 다른 대안은 stackless python (또는 현재의 파이썬 대안) 일 것입니다. 또한 게임 엔진에서 매우 멋진 lightweightthread를 지원하기 때문에 가능합니다. Eve Online은 서버용으로 이브 온라인을 사용합니다. 그러나 배포되지는 않지만 수동으로 쉽게 구현할 수 있습니다.

1

@Mike F의 대답이 대부분 올바른 반면, foreach주기의 엔티티에 대한 반복은 평가의 순서가 상당히 결정적이되어 바람직하지 않은 부작용이 있다는 것을 명심해야합니다. 반면에 스레드를 도입하면 heisenbugs 및 동시성 문제가 발생할 수 있으므로 두 가지 사이클을 결합하는 데 가장 많이 사용되는 방법은 이전 상태를 기반으로 에이전트/작업자의 작업을 수집하는 두 번째 사이클입니다. 작업 결과를 작성하고 시뮬레이션 상태를 업데이트합니다. 가능한 편향을 피하기 위해 각주기마다 평가 순서가 무작위 화됩니다. 이 BTW는 매 사이클마다 동기화가 이루어지면서 대용량 병렬 평가를 수행합니다.