Minimap no longer adds city indicator on every update, leading to lower framerate over time

This commit is contained in:
Yair Morgenstern 2020-10-05 11:45:55 +03:00
parent 523ed10e68
commit 5553be0d67
3 changed files with 21 additions and 14 deletions

View File

@ -286,7 +286,6 @@ object TranslationFileWriter {
return when (name) { return when (name) {
"Buildings" -> emptyArray<Building>().javaClass "Buildings" -> emptyArray<Building>().javaClass
"Difficulties" -> emptyArray<Difficulty>().javaClass "Difficulties" -> emptyArray<Difficulty>().javaClass
"GreatPeopleNames" -> this.javaClass // dummy value
"Nations" -> emptyArray<Nation>().javaClass "Nations" -> emptyArray<Nation>().javaClass
"Policies" -> emptyArray<PolicyBranch>().javaClass "Policies" -> emptyArray<PolicyBranch>().javaClass
"Quests" -> emptyArray<Quest>().javaClass "Quests" -> emptyArray<Quest>().javaClass

View File

@ -10,6 +10,7 @@ import com.unciv.UncivGame
import com.unciv.logic.HexMath import com.unciv.logic.HexMath
import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.logic.map.TileInfo import com.unciv.logic.map.TileInfo
import com.unciv.ui.utils.IconCircleGroup
import com.unciv.ui.utils.ImageGetter import com.unciv.ui.utils.ImageGetter
import com.unciv.ui.utils.onClick import com.unciv.ui.utils.onClick
import com.unciv.ui.utils.surroundWithCircle import com.unciv.ui.utils.surroundWithCircle
@ -21,6 +22,8 @@ class Minimap(val mapHolder: WorldMapHolder) : Table(){
private val tileImages = HashMap<TileInfo, Image>() private val tileImages = HashMap<TileInfo, Image>()
init { init {
isTransform = false // don't try to resize rotate etc - this table has a LOT of children so that's valuable render time!
var topX = 0f var topX = 0f
var topY = 0f var topY = 0f
var bottomX = 0f var bottomX = 0f
@ -65,23 +68,28 @@ class Minimap(val mapHolder: WorldMapHolder) : Table(){
layout() layout()
} }
private class CivAndImage(val civInfo: CivilizationInfo, val image: IconCircleGroup)
private val cityIcons = HashMap<TileInfo, CivAndImage>()
fun update(cloneCivilization: CivilizationInfo) { fun update(cloneCivilization: CivilizationInfo) {
for(tileInfo in mapHolder.tileMap.values) { for((tileInfo, hex) in tileImages) {
val hex = tileImages[tileInfo]!! hex.color = when {
if (!(UncivGame.Current.viewEntireMapForDebug || cloneCivilization.exploredTiles.contains(tileInfo.position))) !(UncivGame.Current.viewEntireMapForDebug || cloneCivilization.exploredTiles.contains(tileInfo.position)) -> Color.DARK_GRAY
hex.color = Color.DARK_GRAY tileInfo.isCityCenter() && !tileInfo.isWater -> tileInfo.getOwner()!!.nation.getInnerColor()
else if (tileInfo.isCityCenter() && !tileInfo.isWater) tileInfo.getCity() != null && !tileInfo.isWater -> tileInfo.getOwner()!!.nation.getOuterColor()
hex.color = tileInfo.getOwner()!!.nation.getInnerColor() else -> tileInfo.getBaseTerrain().getColor().lerp(Color.GRAY, 0.5f)
else if (tileInfo.getCity() != null && !tileInfo.isWater) }
hex.color = tileInfo.getOwner()!!.nation.getOuterColor()
else hex.color = tileInfo.getBaseTerrain().getColor().lerp(Color.GRAY, 0.5f) if (tileInfo.isCityCenter() && cloneCivilization.exploredTiles.contains(tileInfo.position)
if (tileInfo.isCityCenter() && cloneCivilization.exploredTiles.contains(tileInfo.getCity()!!.getCenterTile().position)) { && (!cityIcons.containsKey(tileInfo) || cityIcons[tileInfo]!!.civInfo != tileInfo.getOwner())) {
val nationIcon= ImageGetter.getNationIndicator(tileInfo.owningCity!!.civInfo.nation,hex.width * 3) if (cityIcons.containsKey(tileInfo)) cityIcons[tileInfo]!!.image.remove() // city changed hands - remove old icon
val nationIcon= ImageGetter.getNationIndicator(tileInfo.getOwner()!!.nation,hex.width * 3)
nationIcon.setPosition(hex.x - nationIcon.width/3,hex.y - nationIcon.height/3) nationIcon.setPosition(hex.x - nationIcon.width/3,hex.y - nationIcon.height/3)
nationIcon.onClick { nationIcon.onClick {
mapHolder.setCenterPosition(tileInfo.position) mapHolder.setCenterPosition(tileInfo.position)
} }
allTiles.addActor(nationIcon) allTiles.addActor(nationIcon)
cityIcons[tileInfo] = CivAndImage(tileInfo.getOwner()!!, nationIcon)
} }
} }
} }