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