Better performace by changing ExploredTiles to a hashset and ading a temporary TilesToCities hashmap

This commit is contained in:
Yair Morgenstern 2018-05-02 08:33:54 +03:00
parent 6cd78ca926
commit cb381ec82e
6 changed files with 54 additions and 34 deletions

View File

@ -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<CivilizationInfo>()
var tileMap: TileMap = TileMap()
var turns = 1
@Transient var tilesToCities = HashMap<TileInfo,CityInfo>()
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)
}
}
}

View File

@ -142,6 +142,7 @@ class Battle(val gameInfo:GameInfo) {
}
}
(attacker as MapUnitCombatant).unit.moveToTile(city.getCenterTile())
city.civInfo.gameInfo.updateTilesToCities()
}
}

View File

@ -33,7 +33,7 @@ class CivilizationInfo {
var scienceVictory = ScienceVictoryManager()
var cities = ArrayList<CityInfo>()
var exploredTiles = ArrayList<Vector2>()
var exploredTiles = HashSet<Vector2>()
fun getCivilization(): Civilization {return GameBasics.Civilizations[civName]!!}

View File

@ -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()!!

View File

@ -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
}
}

View File

@ -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() })