2013-05-17 3 views
1

자바 멀티 플레이어 턴 기반 게임을 만들고 각 플레이어가 이동해야하는 시간을 제한하고 싶습니다. 게임은 게임 세션이나 게임 룸으로 구성되며 각 게임 룸에는 4 선수. 게임에는 약 40 개의 게임 세션이 있으며 각 세션에는 최소 160 회 교대가 있습니다.게임 서버 턴 타이머

먼저 나는 그때, 나는, 각 게임 세션에 대한 SingleThreadScheduledExecutor이 새로운 실행 가능한 각각의 차례를 만들 수 있습니다 더 나은 것 같습니다 ScheduledExecutorService에 대해 알게의 java.util.Timer로 보았다 플레이어 제조업체가 이동 인 경우 실행 가능한이되기 전에 나는 ScheduledFuture.cancel() 메서드를 호출하여 실행할 수 있습니다. 이론적으로

그것을 잘 보이지만 좀 문제가, 그래서 나는 알고 싶어 :

  • 이것이 올바른 접근 방식인가? 또는 더 나은 대안이 있습니까?

  • 각 게임 세션에 대해 개가 각각 개가 될 수 있습니다. 모든 게임 세션에 대해 ScheduledThreadPool을 사용할 수 있습니까?

  • 는 는
  • 는 내가 ScheduledFuture을 취소하면 메모리 사용이 될 수있는, 자신의 실행 시간까지 메모리에 문제를 유지할 것으로 나타났습니다?

  • 마지막으로, 각 차례마다 새 게임을 생성하는 대신 동일한 실행 파일 (각 게임에 대해 1 회 세션)을 다시 사용할 수 있습니까?

답변

0

ScheduledExecutorService은 시작하기 좋은 곳입니다. 게임 상태에 대한 액세스를 올바르게 동기화하는 것을 잊지 마십시오.

일반적으로 실행 가능한 파일을 재활용하는 것은 적법하지만 여기서는 최선의 방법은 아닙니다.

턴 수가 많지 않으면 작업 취소에 대한 오버 헤드가 그만한 가치가 없습니다. 대신, 어떤 게임이 시작되었는지에 대한 실행 가능한 정보를 시간에 포함하십시오. 작업이 실행되면 게임 상태를 점검하여 현재의 턴인지 확인하고 턴 카운트가 이미 이동 된 경우 아무 작업도 수행하지 않습니다.

이렇게하면 cancel() 완료와 작업 실행 사이의 경쟁 조건을 피할 수 있습니다. 이는 마감 기한에 가까운 시점에서 이동이 제출 될 때 발생합니다.

+0

회전 수는 시간당 약 30.000입니다. 작업을 실행시키고 게임 상태 솔기 만 확인하는 것이 더 쉬운 해결책이지만 메모리가 현명하다면 회전 수를 고려하여 ScheduledFuture를 취소하는 것이 더 낫다고 생각합니까? – Rias

+0

각 개체는 20 바이트 미만입니다. 따라서 데드 라인이 이동하는 데 1 시간이라면 핵심 기능에 대해서는 겨우 600k에 불과합니다. 마감 기한이 하루 인 경우, 여전히 15 메가 미만입니다. 걱정할 필요가 없습니다. 마감 기한이 훨씬 길면 디스크에 마감 기한을 저장하고 주기적으로 스캔하여 가까운 장래에 만료일을 예약하십시오. –