From cb381ec82e485a39de61f275a1db5161af7c339b Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Wed, 2 May 2018 08:33:54 +0300 Subject: [PATCH] Better performace by changing ExploredTiles to a hashset and ading a temporary TilesToCities hashmap --- core/src/com/unciv/logic/GameInfo.kt | 13 +++- core/src/com/unciv/logic/battle/Battle.kt | 1 + .../logic/civilization/CivilizationInfo.kt | 2 +- core/src/com/unciv/logic/map/TileInfo.kt | 5 +- .../com/unciv/ui/tilegroups/WorldTileGroup.kt | 66 ++++++++++--------- .../unciv/ui/worldscreen/unit/UnitActions.kt | 1 + 6 files changed, 54 insertions(+), 34 deletions(-) diff --git a/core/src/com/unciv/logic/GameInfo.kt b/core/src/com/unciv/logic/GameInfo.kt index 118818ca50..8cc294792c 100644 --- a/core/src/com/unciv/logic/GameInfo.kt +++ b/core/src/com/unciv/logic/GameInfo.kt @@ -1,5 +1,6 @@ package com.unciv.logic +import com.unciv.logic.city.CityInfo import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.Notification import com.unciv.logic.map.TileInfo @@ -15,6 +16,7 @@ class GameInfo { var civilizations = mutableListOf() var tileMap: TileMap = TileMap() var turns = 1 + @Transient var tilesToCities = HashMap() fun getPlayerCivilization(): CivilizationInfo = civilizations[0] @@ -53,6 +55,7 @@ class GameInfo { } turns++ + updateTilesToCities() } fun placeBarbarianUnit(tileToPlace: TileInfo?) { @@ -81,9 +84,15 @@ class GameInfo { for (civInfo in civilizations) for (cityInfo in civInfo.cities) cityInfo.cityStats.update() + + updateTilesToCities() } - - + fun updateTilesToCities(){ + tilesToCities.clear() + for (city in civilizations.flatMap { it.cities }){ + for (tile in city.getTiles()) tilesToCities.put(tile,city) + } + } } diff --git a/core/src/com/unciv/logic/battle/Battle.kt b/core/src/com/unciv/logic/battle/Battle.kt index 225b358827..f97da67511 100644 --- a/core/src/com/unciv/logic/battle/Battle.kt +++ b/core/src/com/unciv/logic/battle/Battle.kt @@ -142,6 +142,7 @@ class Battle(val gameInfo:GameInfo) { } } (attacker as MapUnitCombatant).unit.moveToTile(city.getCenterTile()) + city.civInfo.gameInfo.updateTilesToCities() } } \ No newline at end of file diff --git a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt index 2c24e575fd..83f255d453 100644 --- a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt +++ b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt @@ -33,7 +33,7 @@ class CivilizationInfo { var scienceVictory = ScienceVictoryManager() var cities = ArrayList() - var exploredTiles = ArrayList() + var exploredTiles = HashSet() fun getCivilization(): Civilization {return GameBasics.Civilizations[civName]!!} diff --git a/core/src/com/unciv/logic/map/TileInfo.kt b/core/src/com/unciv/logic/map/TileInfo.kt index 5da1a45caa..c22dd821ab 100644 --- a/core/src/com/unciv/logic/map/TileInfo.kt +++ b/core/src/com/unciv/logic/map/TileInfo.kt @@ -24,7 +24,10 @@ class TileInfo { var roadStatus = RoadStatus.None var turnsToImprovement: Int = 0 - fun getCity(): CityInfo? = tileMap.gameInfo.civilizations.flatMap { it.cities }.firstOrNull{it.tiles.contains(position)} + fun getCity(): CityInfo? { + return tileMap.gameInfo.tilesToCities.get(this) + //return tileMap.gameInfo.civilizations.flatMap { it.cities }.firstOrNull{it.tiles.contains(position)} + } val lastTerrain: Terrain get() = if (terrainFeature == null) getBaseTerrain() else getTerrainFeature()!! diff --git a/core/src/com/unciv/ui/tilegroups/WorldTileGroup.kt b/core/src/com/unciv/ui/tilegroups/WorldTileGroup.kt index c6ecb51277..d7acda15d7 100644 --- a/core/src/com/unciv/ui/tilegroups/WorldTileGroup.kt +++ b/core/src/com/unciv/ui/tilegroups/WorldTileGroup.kt @@ -6,6 +6,7 @@ import com.badlogic.gdx.scenes.scene2d.ui.Label import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.utils.Align import com.unciv.UnCivGame +import com.unciv.logic.city.CityInfo import com.unciv.logic.map.TileInfo import com.unciv.ui.cityscreen.CityScreen import com.unciv.ui.cityscreen.addClickListener @@ -55,11 +56,40 @@ class WorldTileGroup(tileInfo: TileInfo) : TileGroup(tileInfo) { if (tileInfo.isWorked() && city!!.civInfo.isPlayerCivilization() && populationImage == null) addPopulationIcon() + updateCityButton(city) + updateUnitImage(isViewable) + } + + private fun updateUnitImage(isViewable: Boolean) { + if (unitImage != null) { // The unit can change within one update - for instance, when attacking, the attacker replaces the defender! + unitImage!!.remove() + unitImage = null + } + + if (tileInfo.unit != null && isViewable) { // Tile is visible + val unit = tileInfo.unit!! + unitImage = getUnitImage(unit.name, unit.civInfo.getCivilization().getColor()) + addActor(unitImage!!) + unitImage!!.setSize(20f, 20f) + unitImage!!.setPosition(width / 2 - unitImage!!.width / 2, + height / 2 - unitImage!!.height / 2 + 20) // top + } + + + if (unitImage != null) { + if (!tileInfo.hasIdleUnit()) + unitImage!!.color = Color(1f, 1f, 1f, 0.5f) + else + unitImage!!.color = Color.WHITE + } + } + + private fun updateCityButton(city: CityInfo?) { if (city != null && tileInfo.isCityCenter()) { if (cityButton == null) { cityButton = Table() cityButton!!.background = ImageGetter.getDrawable("skin/civTableBackground.png") - cityButton!!.isTransform=true + cityButton!!.isTransform = true addActor(cityButton) zIndex = parent.children.size // so this tile is rendered over neighboring tiles @@ -68,9 +98,9 @@ class WorldTileGroup(tileInfo: TileInfo) : TileGroup(tileInfo) { val cityButtonText = city.name + " (" + city.population.population + ")" val label = Label(cityButtonText, CameraStageBaseScreen.skin) val labelStyle = Label.LabelStyle(label.style) - labelStyle.fontColor= city.civInfo.getCivilization().getColor() - label.style=labelStyle - if(city.civInfo.isPlayerCivilization()) + labelStyle.fontColor = city.civInfo.getCivilization().getColor() + label.style = labelStyle + if (city.civInfo.isPlayerCivilization()) label.addClickListener { UnCivGame.Current.screen = CityScreen(city) } @@ -83,34 +113,10 @@ class WorldTileGroup(tileInfo: TileInfo) : TileGroup(tileInfo) { toFront() } - cityButton!!.setPosition(width/2 - cityButton!!.width / 2, - height/2 - cityButton!!.height/2) + cityButton!!.setPosition(width / 2 - cityButton!!.width / 2, + height / 2 - cityButton!!.height / 2) } - - - if (unitImage != null) { // The unit can change within one update - for instance, when attacking, the attacker replaces the defender! - unitImage!!.remove() - unitImage = null - } - - if (tileInfo.unit != null && isViewable) { // Tile is visible - val unit = tileInfo.unit!! - unitImage = getUnitImage(unit.name, unit.civInfo.getCivilization().getColor()) - addActor(unitImage!!) - unitImage!!.setSize(20f, 20f) - unitImage!!.setPosition(width/2 - unitImage!!.width/2, - height/2 - unitImage!!.height/2 +20) // top - } - - - if (unitImage != null) { - if (!tileInfo.hasIdleUnit()) - unitImage!!.color = Color(1f,1f,1f,0.5f) - else - unitImage!!.color = Color.WHITE - } - } diff --git a/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt b/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt index d2bc91d515..fbe31b1c99 100644 --- a/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt +++ b/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt @@ -62,6 +62,7 @@ class UnitActions { unit.civInfo.addCity(tile.position) unitTable.currentlyExecutingAction = null // In case the settler was in the middle of doing something and we then founded a city with it tile.unit = null // Remove settler! + unit.civInfo.gameInfo.updateTilesToCities() }, unit.currentMovement != 0f && !tile.getTilesInDistance(2).any { it.isCityCenter() })