2017-12-10 79 views
6

मैंने बैकएंड के रूप में एचटीएमएल 5 वेबसाकेट्स और जावा का उपयोग करके एक दोस्त के साथ एक ब्रेकआउट विकसित किया और हाल ही में 20 डॉलर डिजिटलओअन बूंद (3 जीबी रैम, 2 सीपीयू) पर चल रहे ग्लासफ़िश सर्वर पर अपना गेम तैनात किया। ।अजीब व्यवहार में सर्वर परिणामों के लिए गेम को तैनात करना

खेल विकसित करते समय मैंने इंटेलिजे और नेटबींस के साथ सह-कार्यकर्ता के साथ काम किया, जब हमारे पीसी पर चल रहे ग्लासफ़िश सर्वर पर हमारी डब्ल्यूएआर फाइल को तैनात करते समय सबकुछ अपेक्षित काम कर रहा है। लेकिन जब बूंद पर एक ही WAR फ़ाइल को तैनात करते हैं, तो गेंद तेजी से 3 गुना आगे बढ़ती प्रतीत होती है।

मैंने एक ही उबंटू सर्वर को एक वर्चुअल मशीन पर बूंद के रूप में स्थापित करके और ओपनजेडीके, ग्लासफ़िश को स्थापित करने के लिए उपयोग किए जाने वाले चरणों को निष्पादित करके समस्या को पुन: उत्पन्न करने का प्रयास किया है ... लेकिन वीएम पर यह ठीक काम कर रहा था।

1 सीपीयू (उबंटू और सेंटोस की कोशिश की गई) के साथ अन्य बूंदें एक ही समस्या उत्पन्न करती हैं। मुझे आश्चर्य है कि इस मुद्दे का कारण क्या हो सकता है कि मुझे याद आ रही है?

नीचे कोड है कि मैं कनेक्शन/खेल के लिए उपयोग कर रहा हूँ है:

WebSocket:

 public class Game implements Runnable { 

     private final int TARGET_FPS = 60; 
     private final long OPTIMAL_TIME = 1000000000/TARGET_FPS; 

     private volatile boolean gameRunning; 
     private volatile boolean gamePaused; 

     private Session session; 
     private Thread thread; 
     private Gson gson; 

     public Game(Session session, int width, int height, String difficulty) { 
      this.session = session; 
      this.WIDTH = width; 
      this.HEIGHT = height; 
      gson = new Gson(); 
      timer = new Timer(); 

      setup(difficulty); 
     } 

     private void setGameRunning(boolean gameRunning) { 
      this.gameRunning = gameRunning; 
     } 

     private void update(double delta) { 
      ball.move(delta); 
      collisionDetectionWalls(); 
      collisionDetectionPaddle(); 
      collisionDetectionBricks(); 
     } 

     public void start() { 
      thread = new Thread(this); 
      thread.start(); 
      setGameRunning(true); 
     } 

     public void stop() { 
      setGameRunning(false); 
     } 

     private void end(boolean won) { 
      updateScore(); 
      sendGameEnd(won); 
      stop(); 
     } 

     private void sendMessage(String message) { 
      try { 
       session.getBasicRemote().sendText(message); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     private void sendGameUpdate() { 
      GameUpdateData data = new GameUpdateData(paddle, ball, bricks); 
      GameUpdateResponse response = new GameUpdateResponse("gameUpdate", data); 
      sendMessage(gson.toJson(response)); 
     } 

     @Override 
     public void run() { 
      long lastLoopTime = System.nanoTime(); 
      long lastFpsTime = 0; 

      while (gameRunning) { 
       long currentTime = System.nanoTime(); 
       long updateLength = currentTime - lastLoopTime; 
       lastLoopTime = currentTime; 
       double delta = updateLength/((double) OPTIMAL_TIME); 

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

       if (!gamePaused) { 
        update(delta); 
        sendGameUpdate(); 
       } 

       try { 
        long sleepTime = (System.nanoTime() - lastLoopTime + OPTIMAL_TIME)/1000000; 
        Thread.sleep(sleepTime); 
       } catch (InterruptedException e) { 
       } 
      } 
     } 
    } 

public class Ball { 
    public void move(double delta) { 
     if (isLaunched()){ 
      double trigoX = Math.cos(angle); 
      double trigoY = Math.sin(angle); 

      x += trigoX * velocity * delta; 
      y += trigoY * velocity * delta; 
     } 
    } 
} 
+0

दो चीजें। 1: आप अपने बाधित अपवाद को अनदेखा करते हैं। यदि Thread.sleep जल्दी उठने के लिए होता है, तो आप इसके बारे में कभी नहीं जानते। 2: क्या आप समझा सकते हैं कि आखिरी फ्रेम के बाद से आपके डेल्टा को आपके विलुप्त समय के अंश के रूप में क्यों गणना की जाती है? ऐसा लगता है कि यह आपके लक्ष्य एफपीएस द्वारा नैनो सेकंड में विभाजित समय बीत चुका है। नैनो सेकंड के माध्यम से और उसके माध्यम से क्यों न रहें? मुझे कुछ याद आ रहा है – Harvtronix

उत्तर

2

बहु खिलाड़ी खेल मैं मुद्दों के एक जोड़े पर ठोकर खाई और console.log() जावास्क्रिप्ट में साथ चर के एक जोड़े की जांच करने का फैसला किया पर काम कर रहा है। मैंने देखा कि बटन पर क्लिक करते समय गेम को दो बार शुरू किया जा रहा था और 'प्ले' बटन पर क्लिक करते समय गेम को कई बार शुरू करने से रोकने के लिए सर्वर साइड चेक जोड़कर इस मुद्दे को हल किया गया था।

private void gameStart() { 
    if (!game.isGameRunning()) { 
     game.start(); 
     sendMessage("Game started"); 
    } 
} 

गेंद की गति अब ठीक काम कर रही है।

1
शायद

आप:

@ServerEndpoint("/singleplayer") 
public class SingleplayerSocket { 

    private static final Set<Session> PLAYERS = Collections.synchronizedSet(new HashSet<Session>()); 

    private Session session; 
    private Gson gson; 
    private Game game; 

    private void sendMessage(String message) { 
     try { 
      for (Session player: PLAYERS) { 
       if (player == session) { 
        player.getBasicRemote().sendText(message); 
       } 
      } 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 

    private void gameStart() { 
     game.start(); 
     sendMessage("Game started"); 
    } 

    @OnOpen 
    public void onOpen(Session session) { 
     this.session = session; 
     gson = new Gson(); 
     PLAYERS.add(session); 

     sendMessage("Connection established"); 
    } 

    @OnMessage 
    public void onMessage(String message) { 
     if (session != null && session.isOpen()) { 
      String messageType = gson.fromJson(message, MessageType.class).getMessage(); 

      switch (messageType) { 

       case "gameSetup": 
        gameSetup(message); 
        break; 

       case "gameStart": 
        gameStart(); 
        break; 
      } 
     } 
    } 

    @OnClose 
    public void onClose(Session session) { 
     PLAYERS.remove(session); 
     this.session = null; 
    } 
} 

खेल नीचे गेंद कदम विधि के साथ वर्ग System.cnrentTimeMillis() को System.nanoTime() थ्रेडसेव नहीं होने का प्रयास कर सकते हैं।

संदर्भ: Is System.nanoTime() consistent across threads?

संबंधित मुद्दे