mirror of
https://github.com/yairm210/Unciv.git
synced 2025-09-27 22:06:05 -04:00
Improve performance of multiplayer load poll (#2758)
* Switch to schedule instead of schedulefixedrate to prevent floodgate of requests after long delays * Move everything possible off of main thread so user can have smoother interaction with game during poll
This commit is contained in:
parent
0f09ed2800
commit
213f71def3
@ -132,8 +132,8 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() {
|
|||||||
stopMultiPlayerRefresher()
|
stopMultiPlayerRefresher()
|
||||||
// isDaemon = true, in order to not block the app closing
|
// isDaemon = true, in order to not block the app closing
|
||||||
multiPlayerRefresher = Timer("multiPlayerRefresh", true).apply {
|
multiPlayerRefresher = Timer("multiPlayerRefresh", true).apply {
|
||||||
scheduleAtFixedRate(object : TimerTask() {
|
schedule(object : TimerTask() { //todo maybe not use timer for web request, from timer docs "Timer tasks should complete quickly."
|
||||||
override fun run() { Gdx.app.postRunnable{ loadLatestMultiplayerState() } }
|
override fun run() { loadLatestMultiplayerState() }
|
||||||
}, 0, 10000) // 10 seconds
|
}, 0, 10000) // 10 seconds
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -226,30 +226,35 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() {
|
|||||||
private fun loadLatestMultiplayerState(){
|
private fun loadLatestMultiplayerState(){
|
||||||
val loadingGamePopup = Popup(this)
|
val loadingGamePopup = Popup(this)
|
||||||
loadingGamePopup.add("Loading latest game state...".tr())
|
loadingGamePopup.add("Loading latest game state...".tr())
|
||||||
loadingGamePopup.open()
|
|
||||||
thread(name="MultiplayerLoad") {
|
|
||||||
try {
|
|
||||||
val latestGame = OnlineMultiplayer().tryDownloadGame(gameInfo.gameId)
|
|
||||||
if(gameInfo.isUpToDate && gameInfo.currentPlayer==latestGame.currentPlayer) { // we were trying to download this to see when it's our turn...nothing changed
|
|
||||||
Gdx.app.postRunnable { loadingGamePopup.close() }
|
|
||||||
return@thread
|
|
||||||
}
|
|
||||||
latestGame.isUpToDate=true
|
|
||||||
// Since we're making a screen this needs to run from the main thread which has a GL context
|
|
||||||
Gdx.app.postRunnable {
|
|
||||||
stopMultiPlayerRefresher()
|
|
||||||
game.loadGame(latestGame)
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (ex: Exception) {
|
// Since we're on a background thread, all the UI calls in this func need to run from the
|
||||||
Gdx.app.postRunnable { // otherwise the popups of the screen could be concurrently modified, and we'll get an unhappy thread
|
// main thread which has a GL context
|
||||||
loadingGamePopup.close()
|
Gdx.app.postRunnable { loadingGamePopup.open() }
|
||||||
val couldntDownloadLatestGame = Popup(this)
|
|
||||||
couldntDownloadLatestGame.addGoodSizedLabel("Couldn't download the latest game state!").row()
|
try {
|
||||||
couldntDownloadLatestGame.addCloseButton()
|
val latestGame = OnlineMultiplayer().tryDownloadGame(gameInfo.gameId)
|
||||||
couldntDownloadLatestGame.addAction(Actions.delay(5f, Actions.run { couldntDownloadLatestGame.close() }))
|
|
||||||
couldntDownloadLatestGame.open()
|
// if we find it still isn't player's turn...nothing changed
|
||||||
}
|
if(gameInfo.isUpToDate && gameInfo.currentPlayer==latestGame.currentPlayer) {
|
||||||
|
Gdx.app.postRunnable { loadingGamePopup.close() }
|
||||||
|
return
|
||||||
|
}
|
||||||
|
else{ //else we found it is the player's turn again, turn off polling and load turn
|
||||||
|
stopMultiPlayerRefresher()
|
||||||
|
|
||||||
|
latestGame.isUpToDate=true
|
||||||
|
Gdx.app.postRunnable { game.loadGame(latestGame) }
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (ex: Exception) {
|
||||||
|
val couldntDownloadLatestGame = Popup(this)
|
||||||
|
couldntDownloadLatestGame.addGoodSizedLabel("Couldn't download the latest game state!").row()
|
||||||
|
couldntDownloadLatestGame.addCloseButton()
|
||||||
|
couldntDownloadLatestGame.addAction(Actions.delay(5f, Actions.run { couldntDownloadLatestGame.close() }))
|
||||||
|
|
||||||
|
Gdx.app.postRunnable {
|
||||||
|
loadingGamePopup.close()
|
||||||
|
couldntDownloadLatestGame.open()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user