2013-01-17 2 views
3

차례 차례로 작동하는 턴 기반 멀티 플레이어 게임을 제작하고 있습니다. 기본적으로 플레이어는 성냥을 호스트하고 다른 사람이 그것을 합친 다음 게임이 진행됩니다. 내 서버는 이러한 일치 사항을 처리하고 5 초마다 클라이언트에 업데이트를 제공해야합니다. 나는 보통 타이머/thread.sleep()을 사용하여이 작업을 수행한다. 내 문제는 여러 일치를 동시에 수행하는 방법에 대해 확신 할 수 없다는 것입니다. 경기 당 스레드를 사용하는 것이 우스꽝스럽게 느껴질 것입니다. 아무 것도하지 않고 유휴 상태로 앉아있을 것입니다.Java NIO 서버 턴 기반 게임

내 생각으로는 5 초 간격으로 매치를 업데이트하는 스레드가 하나만있는 것입니다. 내가 거기있는 유일한 문제는 많은 경기가 한꺼번에 진행될 때 마지막으로 업데이트되는 게임이 상당히 지연 될 수 있다는 것입니다. (내 게임이 시간 기반이기 때문에 이것이 얼마나 비판적인지 모르지만 원시적 인 것처럼 보입니다.)

내 다른 옵션은 유망한 것으로 보이는 ScheduledExecutorService (스레드 풀)를 사용하는 것이 었습니다. 나는 또한 소켓 연결에 대한 스레드 풀을 실행하는거야 때문에

  1. 나는 나의 ScheduledExecutorService를 스레드 풀 문제로 실행시겠습니까?

    2. 달성하고자하는 목표를 달성하는 데 더 좋은 방법이 있습니까?

그냥 명확히하기 위해 매치마다 매 5 초마다 함수를 호출하는 방법을 찾고 있습니다. 예 :

내 게임은 0에서 시작하고 게임은 2 초에서 시작됩니다. , 2,7,12,17,22,27 : 당신을 위해

... 05101520,25 등 : 나를 위해

: 서버는 업데이트 기능을 부를 것이다 등등 ...

+0

이 게임은 Java Swing으로 작성되어 클라이언트 측에서 실행됩니까? – amphibient

+0

이것은 네트워크 게임입니까? 로컬 네트워크 또는 이더넷 용? 어떤 프로토콜을 알림 (tcp, udp, 등)에 사용합니까? – iMysak

+0

1, 서버가 바뀌면 자원 관리 문제 이외의 문제는 생기지 않습니다. 2, udp 멀티 캐스팅을 약간 볼 수 있으며 JMS 항목을 살펴볼 수도 있습니다. – BevynQ

답변

0

"내 아이디어는 5 초 간격으로 모든 경기를 업데이트하는 하나의 스레드 만있는 것입니다." 은 초당 업데이트 스크립트를 실행하는 것이 더 좋지만 ID mod 5 == 0 인 업데이트가 일치합니다. 이렇게하면 HOT 초의 나쁜 영향을 줄일 수 있습니다.

또한 thread.sleep()이 잘못되어 정확하게 엄격한 시간을 보장하지 못합니다. 에 Thread.sleep (5000) - 최소 5 초 동안 잠을 의미한다 (그러나 나쁜 경우는 10 초 이상의 이벤트가 될 수 있습니다) Java Timerhttp://www.javacodegeeks.com/2012/07/quartz-2-scheduler-example.html

봐.

TimerTask를 사용하면 좋은 결정이라고 생각합니다.

java timer for game

업데이트 참조 : 당신이 비동기 비 블록 I/O와 아직 :) 를 사용하지 않는 경우에 당신은 단지 하나 개의 스레드 충분 하리라 // https://netty.io에 "항목"알림 보인다 10000 개의 동시 연결. (좋은 예를 들면 10-160k 연결 실제 상업 프로젝트에 실제)

관련 문제