2008-09-26 6 views
11

"Rollercoaster Tycoon"및 "The Sims"및 FPS 게임과 같은 응용 프로그램의 성능에 매료되었습니다. 기본 응용 프로그램 아키텍처에 대해 더 자세히 알고 싶습니다. (UI에 그리 관심이 없다 - MVC/MVP piriciples이 여기에 적용된다고 가정한다.이 시점에서 수학과 물리에 관심이 없다.)실제 시뮬레이션은 어떻게 설계 되었습니까?

내 주요 질문은 시뮬레이션에서 수십 또는 수백 개의 개별 객체를 다룬다. (사람, 차량, 아이템 등) 모두가 움직이고, 결정을 내리고, & 사건에 반응합니다 - 모든 시간이 같은 것처럼 보입니다.

Q : 주로 이러한 개체가 한 번에 하나씩 거대한 루프로 처리되고 있습니까? 아니면 자체 스레드에서 각 개체 처리입니까? 이렇게 많은 시뮬레이션 스레드가 실용적입니까? (Ballpark figure, 10, 100, 1000)

게임을 쓰고 싶지 않습니다. 디자인이 여러 가지 결정이있는 다른 응용 프로그램에 적용될 수 있는지 궁금 해서요. 겉으로보기에는 동시에 만들었다.

답변

8

이런 종류의 시뮬레이션을 수행하는 기본적인 방법은 Agent BasedSystem Dynamics입니다. In 및 에이전트 기반 시뮬레이션 게임의 각 엔티티는 속성 및 동작이있는 클래스의 인스턴스로 표현되며 엔티티 간의 모든 상호 작용은 명시 적으로 정의되어야하며 이러한 엔티티가 상호 작용하도록하려면 이러한 속성을 속성 상호 작용하는 엔티티가 변경됩니다.

시스템 다이내믹은 완전히 다르며 합계 및 합계 만 처리하므로 시스템에 단일 엔터티가 없습니다. 그 중 가장 쉬운 예는 Predator and Prey 모델입니다.

두 가지 모두 장단점이 있지만 System Dynamics 방법은 런타임을 짧게 유지하면서 많은 수의 엔티티에 맞게 확장됩니다. 계산해야하는 수식이 여러 개 있지만 계산 시간은 수식의 값과 관계가 없습니다. 그러나이 방법에서는 개별 개체를 볼 방법이 없습니다. 에이전트 기반 접근 방식을 사용하면 엔티티를 특정 위치에 배치하고 시뮬레이션에서 특정 엔티티와 상호 작용할 수 있습니다.

FSM과 Celular automata은 게임에서 시스템을 시뮬레이트하는 다른 방법입니다. 예 : 에이전트 기반 접근법에서는 FSM을 사용하여 한 에이전트의 동작을 모델링 할 수 있습니다. Simcity는 Celular automata를 사용하여 일부 시뮬레이션 작업을 수행했습니다.

일반적으로 특정 작업을 수행하는 여러 시스템을 제외한 모든 기능을 수행하는 하나의 큰 거대한 모델은 없을 것입니다.이 중 일부는 매우 자주 업데이트 할 필요가 없습니다.날씨를 결정하는 것, 다른 사람들은 일정한 업데이트가 필요할 수 있습니다. 별도의 스레드에 넣어도 일시 정지하거나 필요할 때 시작할 수 있습니다. 여러 프레임으로 작업을 분할 할 수 있습니다 (예 : 특정 수의 에이전트에 대한 업데이트 만 계산합니다.

+0

완벽한! 감사! –

1

아주 최근까지는 게임의 논리와 관리가 큰 유한 상태 시스템의 단일 스레드에있었습니다. 이제는 게임의 여러 부분 (오디오, 그래픽, 물리, '시뮬레이션'논리 등)이 스레드의 자체 FSM으로 분할되는 것을 보게됩니다.

편집 : Btw는 스레드가 '동시에'발생하는 시뮬레이션에서 상황을 악용하는 매우 나쁜 방법입니다. 이는 경쟁 조건으로 이어집니다. '같은 시간에'작업을 진행하고자 할 때 데이터를 반복하고 별도로 저장하는 과정에서 필요한 작업을 파악한 다음 모든 데이터가 처리 된 후에 적용하는 것이 일반적입니다. Rince, 되풀이.

+0

각 스레드는 자신의 스레드가 자신의 상태 (속성)를 "동시에"설정 한 다음 마스터 프로세스에서 결과를 처리 할 수 ​​있습니까? 사건이나 인종이 없어. 그러나 루프는 각 객체가 처리하는 동안 오래 기다리지 않습니다 ...? –

+1

threadpools 또는 일부를 통해이 작업을 상당히 효율적으로 수행 할 수 있지만 데이터를 블록으로 분할 한 다음 처리기를 처리하여 설명한 것처럼 변경 집합을 구성하는 것이 좋습니다. –

+0

답변에 전혀 동의하지 않습니다. "서로 다른 스레드에 비트가있는 하나의 뚱뚱한 FSM"처럼 간단하다면 모든 사람들이 이와 같은 게임을 공개 할 것입니다. 이 단순화 된 응답보다 더 많은 방법이 있습니다. 전에 심각한 게임 타이틀을 사용해 본 적이 있습니까? –

0

@Cody Brocious는

CodeProject이 연습을 입증하기 위해 Linq를 사용합니다. (Linq to Life)

+0

나는이 방법이 확장 성이 아닌 방법에 대한 주석을 추가했다. 그 전에 이것이 구현 된 것임을 알기 전에 - LINQ에 대한 나의 부족한 부분을 잘 이해하고있다.) 좋은 링크. –

+0

이 응답은 Cody의 게시물에 대한 주석이었고 자신의 게시물에 대한 주석이 아니었을 것입니다. –

+0

이 프로젝트는 매우 유망 해 보입니다 - 감사합니다! –

0

게시 된 제안 외에도 sourceforge에서 시뮬레이션 태그를 찾아 보는 것이 좋습니다. 다양한 복잡성 수준에서 다양한 시뮬레이션 프로젝트가 있습니다.

Sourceforge

또한 나는 그것이 물리학에 초점을 맞추고 있지만 그것은 시뮬레이션의 문제를 다루는 기본적인 개요는 다음과 같은 책을 추천합니다.

Physics for Game Developers

+0

감사합니다. 나는이 두 가지 자료를 모두 검토 할 것이다. –

4

심시티 원래의 소스 코드는 오픈 소스 Micropolis로했다. 흥미로운 연구 일 수 있습니다.

관련 문제