2017-11-11 8 views
1

저는 HTML5 웹 소켓과 자바를 백엔드로 사용하여 웹 게임을하고 있습니다. 현재 모든 플레이어에 대한 게임 클래스의 새 인스턴스를 만들고, 게임 루프를 실행하고 60fps마다 프런트 엔드에 업데이트를 보내는 타이머 태스크가있는 타이머를 만듭니다.게임 클래스의 싱글 톤 패턴 사용

이 타이머는 많은 플레이어가있는 서버 리소스에서 매우 무겁기 때문에 게임 클래스에 Singleton 패턴을 적용하고 일치하는 배열을 유지하려고합니다. 모든 싱글 플레이어에 대한 타이머를 만드는 대신 배열의 모든 일치에 대해 for 루프를 사용하여 게임 루프를 업데이트하는 단일 타이머를 만듭니다.

더 나은 접근 방법이 있는지 궁금합니다. 특히 단원 테스트를 위해 싱글 톤 패턴이있는 단점이 많이 있다는 것을 들었습니다.

답변

1

내가 질문을 이해 가정입니다 추천 무엇 singelton으로 이것을하게 고려 각 경기마다 for-loop를 사용하여 게임을 업데이트하십시오.

그건 끔찍한 생각입니다. 해당 라인을 따라 어디에서나 렌더링을 차단하면 모든 서버에 영향을 미칩니다. 첫 번째 일치하는 사람이 서버에 많은 양의 데이터를 보내면 스레드가 차단되고 FPS가 매 일치으로 느려집니다.

예, 타이머는 서버에서 무겁습니다. 단일 스레드가 높은로드를 처리 할 수없고 60FPS에서 실행하기 때문에 한 번에 너무 많은 활성 일치가있는 경우 모든 일치에 대해 하나의 타이머를 사용하면 스레드 차단이 발생합니다.

주어진 게임 서버를 설계하는 가장 좋은 방법은 스레드를 사용하는 것입니다.

지연을 생성하고 주어진 FPS를 유지하기 위해 Thread.sleep을 사용할 수 있으며 타이머 대신 스레드를 사용하면로드가 밝아집니다. IT는 여전히 무겁지 만 쓰레드를 사용하는 것이 타이머보다 가볍습니다.

public void run(){ 


long lastLoopTime = System.nanoTime(); 
    final int TARGET_FPS = 60;//The FPS. Can be reduced or increased. 
    final long OPTIMAL_TIME = 1000000000/TARGET_FPS;//1 second = 10^9 nanoseconds 
    long lastFpsTime = 0;//Used to calculate delta 
    while(running){ 
     long now = System.nanoTime();//Get the current time 
     long updateLength = now - lastLoopTime;//get the time it took to update 
     lastLoopTime = now;//set the last time the loop started to the current time 
     double delta = updateLength/((double)OPTIMAL_TIME);//Calculate delta 

     lastFpsTime += updateLength; 
     if(lastFpsTime >= 1000000000){ 
      lastFpsTime = 0; 
     } 

     //Right here you place your code. Update the servers, push and read data, whatever you need 

     try{ 
      long gt = (lastLoopTime - System.nanoTime() + OPTIMAL_TIME)/1000000;//calculate the time to sleep, and convert to milliseconds 
      Thread.sleep(gt);//And finally, sleep to maintain FPS 
     }catch(InterruptedException e){ 
     } 
    } 
} 

클래스이 스레드 연장 running 불리는 부울을 가지고 실제 스레드로서

이 그것의 일부이다. boolean를 사용하면 (자), 예외를 슬로우 할 필요없이 Thread를 정지 할 수가 있습니다.

각 경기마다 하나의 스레드를 만드십시오 (중요한 점입니다. 각 플레이어에 대해 수행하고 리소스를 죽입니다.) 모든 경기에 대해 하나씩 수행하십시오. 슈퍼 컴퓨터가 없으면 60FPS를 유지할 수 없습니다 성냥의 양에)), 연결을 관리하고 스레드를 일치시키기위한 메인 스레드가있다

0

singelton 디자인 패턴에 대한 간단한 규칙은 -

  1. 이 곳의 내부 프로젝트를 통해 한 번만 인스턴스화 할 코드> 정적 블록 - 만들기 개인 생성자
  2. 만들기
  3. 하나의 정적 메서드를 만든 다음 해당 개체를 반환하십시오.
  4. 3 단계를 완료하려면 하나의 개인 정적 인스턴스 변수를 선언하십시오.

는 최대 절전 모드의 구성 및 buildsessionfactory 방법의 예를 들어 내가 바로, 당신은 모든 일치하는 1 개 타이머를 사용하려면

public class Singelton { 

    private static SessionFactory sessionFactory=null; 
    static { 
     Configuration configuration = new Configuration(); 
     configuration.configure(); 
     sessionFactory = configuration.buildSessionFactory(); 
    } 

    public static SessionFactory getSessionFactory() { 
     return sessionFactory; 
     } 

    private Singelton() { 
    } 
}