>  일반 체팅 프로그램을 구현(!!!!)에서  방개념을 구현한건
>  패킷에 방번호를 넣코 방번호를 검색해서 데이타 전송을 했거든요!!
>  
>  그런데 지금 게임 만드는 와중에 생각해보면
>  그걸 Thread 만들어서 방을 옮길때마다 Thread를 옮겨다니는 방향쪽으로 하면
>  어떨까해서 질문 드려요!!!
>
>  학규형님( 이라고 불러도 될런지요 ^_^?  언짢으시다면 위대하신학규님) 기존에
>  보드게임관련에 방개념은 어떤 방식으로이뤄지고있는지요?
>  그리구 보드게임관련 네트워크에서 가장 중요시해야할것과
>  가장 잘 살펴(? 주의를 기울여 만들어)야할 점이있다면 어떤것이 있을찌요..?
>
>  가르침을 주세요 *__) 부탁드립니다~ ^_^

쓰레드 하나가 방 하나를 처리하게 하는 방식을 사용하게 되면, 방의 갯수만큼 쓰레드가 생겨나기 때문에 비효율적입니다. 채팅이란 것이 많은 계산작업과 아주 빠른 응답이 필요한 것이 아니기 때문에 쓰레드 하나가 여러개의 방을 처리하도록 하는 것이 바람직합니다.

i) 각각의 방은 개체로 존재하고, 방들을 모두 갖고 있는 방 매니저를 두도록 합니다.
ii) 각각의 방 개체는 OnProcess 같은 핸들러를 만들어서, 주기적으로 호출을 해주면, 자기 방에 있는 플레이어들마다 패킷 송수신 처리를 시켜주고, 방 자체적으로 해야 할 일들을 하게 합니다.
iii) 방 매니저는 ProcessAllRooms 같은 메소드를 만들어서 모든 방들에 대해서 한번씩 OnProcess 를 불러주도록 합니다.
iv) 네트워크 송수신을 전담하는 별도의 쓰레드와 방별 처리를 담당하는 쓰레드를 만듭니다. 각 쓰레드간 데이타 전송을 할때는 Critical Section 보호 처리가 되어있는 큐를 이용해서 데이타를 주고 받습니다.

가장 중요한 부분이라면 몇개의 쓰레드로 시스템을 구성할지와, 어떤 IO 방식으로 네트워크 입출력 작업을 할지를 결정하는 것, 메인 쓰레드에서 blocking 이 되는 부분이 없도록 주의하는 것입니다.

서버 하나가 500 개의 방을 처리하는데, 위와 같이 한개의 쓰레드가 500 개의 방을 처리하도록 만든 경우, 특정한 방 하나가 시간을 오래 잡아먹는 일이 없도록 해야 합니다. 예를 들어서 사람이 입장시 DB 에서 데이타를 읽어온다던가 할 때에는 DB 에 읽기 요청을 해놓고, 올때까지 하염없이 기다리고 있다던가 하면 다른 499 개의 방에 있는 사람들이 모두 그만큼 처리가 지연되므로, 반드시 비동기(Asynchronous)적인 처리를 하여야 합니다. 예를 들면 DB 에 읽기 쓰기 처리를 맡겨놓는 별도의 쓰레드를 분리한다던가 하는 것이 그런 처리방식중의 하나입니다.

imcgames 의 김학규입니다