2012-11-04 2 views
1

멀티 플레이어 게임을 개발 중이며 asp.net에 쓰여진 서버가 있습니다. 게임 사용자는 서버에 요청을 보내 oponent를 찾고 전투에 참여합니다. 전투 요청에는 매개 변수가있을 수 있지만 아무 것도 가질 수 없으므로 (가장 많이 사용되는 시나리오로 추정 됨) 발신자는 이미 요청을 보낸 사용자 중 누구에게 연결되어 있어야 연결이 이루어질 수 있습니다.여러 사용자가 동시에 액세스 할 수있는 스레드로부터 안전한 컬렉션

대기중인 모든 요청을 스레드로부터 안전한 컬렉션에 저장하는 것이 좋습니다. 전투에 대한 일치가 매우 빨리 발견되므로 항상 많은 요소가 포함되지만 많은 스레드가 한 번에이 컬렉션에 액세스하려고합니다. N 요청마다 다른 컬렉션을 만드는 것이 좋습니다. N의 최적 크기는 무엇입니까? 아니면 다른 아이디어일까요? 필자의 주요 쟁점은 현재 연결 수가 매우 큰 경우에도 서버 성능을 손상시키지 않고 신속하게 일치 항목을 찾는 것입니다.

UPD는

내가하지 매우 명확하게 내 문제를 설명한 것으로 보인다. 모든 전투 정보 - 참여하는 사용자, 전투 도중의 행동, 승자 등은 데이터베이스에 저장됩니다. 필요한 것은 전투 요청에 대한 처리입니다 (요청에는 보낸 사람 ID와 전투 필터 만 가능). 일반적으로 상대방은 거의 즉시 발견되므로 요청 데이터를 저장할 필요가 없습니다 (일치가 발견되면 제거해야하며 모든 전투 데이터는 데이터베이스에 저장됩니다). 그러나 많은 양의 데이터를 처리 할 준비가되어 있어야합니다. 동시에 요청.

+0

데이터베이스를 사용해야합니다. – SLaks

+0

@SLaks 일치하는 항목이 발견되면 몇 밀리 초 만에 요청을 데이터베이스에 저장해야합니까? 나는 단지 요청 - 발신자 ID와 전투 필터를 저장한다. 모든 batlle 정보는 물론 데이터베이스에 저장됩니다. –

답변

1

일치하는 플레이어의 기준을 따르지 않으면 웹 응용 프로그램을 작성할 때 메모리에 사용자 세션 데이터를 보유하지 않아야합니다. 웹 응용 프로그램이 가끔씩 재활용되어 느슨한 데이터가 발생할 수 있습니다.

SLAK이 말한 것처럼이 데이터를 데이터베이스에 저장하고 거기에서 선택해야합니다. 사용자 일치 로직에 따라이 기본 라인에서 성능 최적화를 고려해야합니다. 최상위 n 명의 사용자를 선택하거나 원하는 기준에 따라 쿼리를 만듭니다.

+0

어쩌면 제가이 문제를 아주 분명하게 기술하지 않았을 수도 있습니다. 모든 전투 정보 - 참여하는 사용자, 전투 도중의 행동, 승자 등은 데이터베이스에 저장됩니다. 필요한 것은 전투 요청에 대한 처리입니다 (요청에는 onlu 보낸 이드와 전투 필터가 포함되어 있음). 일반적으로 상대방은 거의 즉시 발견되어 요청 데이터를 저장할 필요가 없지만 많은 양의 요청을 동시에 처리 할 준비가되어 있어야합니다. –

+1

실패한 요청의 위험이 없도록 즉시 일치하는 경우 왜 단일 스레드 안전 수집을 사용하는 것이 문제가 될 수 있다고 생각합니까? 요청이 실패 할 수도 있습니다. 사용자가 신경 쓰지 않는 숫자가 충분하지 않다고 결정할 수 있습니다. 메모리 내 데이터 구조의 경우 플랫 데이터 구조 대신 인덱싱 된 데이터 구조를 만들려고합니다. 배틀 필터를 트리 구조로 표시하고 (가장 먼저 필터를 식별 할 수 있음) 플레이어를 트리 노드로 저장합니다. 여러 개의 게임 요청 모음을 여러 개 보유하면 어떤 결과를 얻을지 알 수 없습니다. –

관련 문제