2012-04-29 2 views
10

게임 서버의 경우 Erlang의 가능성을 생각하고 있습니다. (오, 나는 Erlang의 전문가가 아니라 단지 무대를 고려하고있다.) 이것은 게임 시뮬레이션을 위해서 액터 모델을 사용한다는 것을 의미한다. 물론 가장 큰 매력은 동시성이 여러 노드에 분산되어 있다는 것입니다.액터 모델과 충돌 감지

현재 가장 큰 문제는 충돌 감지와 같은 다중 액터 상호 작용을 어떻게 수행해야 하는가입니다.

충돌 검색은 본질적으로 모든 게임에서 필요하지만 액터 모델의 특성상 필수적이지만 전역 적으로 동기화 된 상태 쿼리가 필요하기 때문에 효율적으로 보이지 않으며 심지어 말이되지 않습니다. 모든 타겟팅 액터에 업데이트 할 수 있습니다. 동기화를 사용하면 Erlang의 액터 모델의 모든 이점을 무시합니다.

물론 공간 분할을 올바르게 사용하면 한 번에 액터를 대상으로 지정할 수 있지만, 기본 응답이 아닌 최적화에 불과합니다. 아니면이 질문에 대한 정답입니까? 상호 작용하는 액터의 수를 줄임으로써 동기화 범위를 줄입니까?

답변

9

지도를 더 작은 부분으로 나눠서 각 부분을 고유 한 프로세스로 만듭니다 (각 타일을 고유 프로세스로 너무 많이 나눌 수도 있습니다). 이동을 시도하는 플레이어는 타일/서브맵에 메시지가 전송 될 것이라고 말하고, 타일이 괜찮 으면 응답합니다. 이렇게하면 한 번에 하나의 메시지 만 타일/서브맵에서 처리되기 때문에 충돌을 피할 수 있습니다. 여러 개의 하위 맵/타일이 동시에 메시지를 처리 ​​할 수 ​​있으므로 여전히 동시 프로그램입니다.

+0

유일한 방법은 상호 작용의 범위를 줄이는 것입니다. 감사. – Eonil

7

나는 Erlang에서 서버를하고있는 공간 기반 게임을 가지고있다. 트릭은 각 위치/노드/etc도 배우라는 것입니다. 물리학을 지속적으로 실행하고 정기적으로 각 게임 엔티티 배우에게 정보를 전송합니다.

배우/엔티티에 대해 더 추상적으로 생각하기 시작하면 모든 것이 훨씬 깨끗해집니다. 예를 들어 충돌은 완전한 본격적인 액터가 될 수 있습니다. 이렇게하면 클라이언트 측이 훨씬 쉽게 그래픽과 사운드 효과를 충돌에 연결합니다. 서버 측에서는 주어진 시간에 두 개체 사이에 여러 충돌 효과가 두 번 이상 발생하는 것을 방지합니다.

+0

모든 물리학이 단일 배우로 이루어 지나요? 물리학을 어떻게 만들었습니까? – Eonil

+2

예. Bullet을 사용하여 물리를 실행합니다. 엔터티 행위자는 자신의 게임 상태를 추적하고, 서로 쏘고, 움직임을 결정합니다. 그들은 시뮬레이션을 실행하는 위치로 명령을 전송합니다. 위치가 계속해서 실행되며 "사용자가 여기 있습니다"라는 메시지가 주기적으로 전송되고 "X가 충돌했습니다." 엔티티는 위치에도 쿼리를 보냅니다. – Nialscorva