2017-11-11 10 views
1

私はHTML5ウェブソケットとJavaをバックエンドとして使用してWebゲームを開発しています。現在、すべてのプレーヤーのゲームクラスの新しいインスタンスを作成します。タイマータスクを使用してゲームループを実行し、60fpsごとにフロントエンドに更新を送信するタイマーも作成します。ゲームクラスのシングルトンパターンを使用

これらのタイマーはプレイヤーが多いサーバーリソースに非常に重いので、ゲームクラスにシングルトンパターンを適用し、マッチの配列を保つことを考えていました。 1人のプレイヤーごとにタイマーを作成するのではなく、1つのタイマーを作成して、配列内のすべての一致に対してforループを使ってゲームループを更新します。

特に単体テストのシングルトンパターンに付随する短所がたくさんあると聞いたので、より良いアプローチがあるのだろうかと思います。

答えて

1

で考えてみましょう、あなたはすべての一致のために1つのタイマーを使用したいです、ゲームを更新するために各試合にforループを使用します。

これはひどい考えです。その行に沿った任意の種類のレンダリングブロックは、サーバー全体に影響します。最初の試合で誰かが大量のデータをサーバーに送信すると、スレッドがブロックされ、ののFPSが遅くなります。

はい、タイマーはサーバー上で重いです。しかし、1つのスレッドがその高負荷を処理できず、60 FPSで動作するため、すべての一致に1つのタイマーを使用すると、アクティブな一致が一度に多すぎるとスレッドのブロックが発生します。

任意のゲームサーバーを設計するための最良の方法は、スレッドを使用することです。

遅延を作成し、特定の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では、例外をスローすることなくスレッドを停止することができます。

あなたはスーパーコンピュータを持っていない限り、60フィート/秒を維持することはできません(それは重要なポイントです。マッチの量について))、接続を管理しスレッドをマッチさせるためのメインスレッドを持つ

0

singeltonデザインパターンのための最も簡単なルールがある -

  1. はこの場所の内側には、プロジェクト全体で一つだけの時間をインスタンス化するコードを>静的ブロック - を作成し、プライベートコンストラクタ
  2. を作成
  3. 1つの静的メソッドを作成し、そのオブジェクトを返します。
  4. 手順3を実行するには、プライベート静的インスタンス変数を宣言します。

私がお勧めするものsingeltonとしてこれを行うために休止状態のconfigureとbuildsessionfactory方法の一例は、私は右のあなたの質問を理解していると仮定すると、

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() { 
    } 
} 
関連する問題