Ich habe ein Kampfspiel in JavaFX geschrieben und JDBC verwendet, um Informationen in einer MySQL-Datenbank zu aktualisieren. Die meisten Aufgaben, die grundlegende Informationen vom Datenbankserver abrufen, funktionieren einwandfrei, wenn sie nicht ständig wiederholt werden. Das Problem entsteht, wenn ich das Programm benötige, um die Informationen des Gegners, wie Position, Level, Schaden usw. im Spiel ständig zu aktualisieren. Ich muss ständig ausgewählte Befehle an den Server senden, was den RAM erhöht, der von dem Thread verwendet wird, der diese Befehle ausführt.
void startUpdatingOpponentInfo() { Thread thread = new Thread(() -> { while (matchID != -1) { String query = String.format("select * from matchDetails where matchID = %d and userID = %d", matchID, opponentID); try { ResultSet resultSet = sqlConnection.getDataQuery(query); while (resultSet.next()) { double opponentX = resultSet.getDouble("xPos"); double opponentY = resultSet.getDouble("YPos"); if (opponentX != -1 && opponentY != -1) opponent.move(canvas, new Position(opponentX, opponentY)); } } catch (SQLException e) { e.printStackTrace(); } try { Thread.sleep(10); } catch (InterruptedException e) { throw new RuntimeException(e); } } }); } public ResultSet getDataQuery(String query) { Statement statement; ResultSet resultSet = null; try { statement = connection.createStatement(); resultSet = statement.executeQuery(query); } catch (SQLException e) { System.out.println(query); e.printStackTrace(); } return resultSet; }
Ich habe nach einigen Methoden gesucht und eine sehr nützliche Methode gefunden. Nach jeder Auswahl lasse ich den Thread eine Weile ruhen, bevor ich eine weitere Auswahl vornehme. Dieser Ansatz verbessert die Leistung erheblich und der RAM-Verbrauch bleibt stabil. Dieser Ansatz eignet sich jedoch nicht für Abfrageinformationen, die ständig aktualisiert werden müssen, da der kurze Ruhezustand des „select“-Threads immer noch zu einem hohen RAM-Verbrauch führt. Gibt es eine sinnvolle Möglichkeit, dieses Problem zu lösen und meinem Spiel eine direkte Verbindung zum Datenbankserver zu ermöglichen, ohne den Zwischenspielserver zu durchlaufen?
你应该首先尝试优化你的变量。
你的线程在查询时一直使用新的String,而实际上它只需要构建一次。同样,对于你的ResultSet,在每次进入新的循环时,你都会在RAM中使用一个新的位置来存储一个新的对象。
你可以通过在Java ID对象之外添加一个控制台输出来检查:
然后观察每次输出的结果是不是不同。
像这样:
然后我让你考虑改变你的查询,只选择xPos/yPos不等于"-1"的值,并且只获取真正的对手位置变化的结果,最后,也许不发送一个"new Position",而只发送两个变量opponentX和opponentY,这样可以避免将这个对象存储在RAM中。
不要忘记,Java只会在代码执行完成后清理你的RAM对象(简而言之),所以拥有一个永不结束的单一线程不会触发这种情况。