One high-stakes, no-holds-barred, to-the-death profiling later, and we're left with a much less laggy main screen and a much more profile-able citybutton/

This commit is contained in:
Yair Morgenstern 2020-10-16 00:39:58 +03:00
parent ae9a026201
commit 3bf045d354
10 changed files with 2462 additions and 2417 deletions

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 899 KiB

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 501 KiB

View File

@ -1,5 +1,6 @@
package com.unciv.ui.map
import com.badlogic.gdx.graphics.g2d.Batch
import com.badlogic.gdx.math.Vector2
import com.badlogic.gdx.scenes.scene2d.Group
import com.unciv.logic.HexMath
@ -71,4 +72,10 @@ class TileGroupMap<T: TileGroup>(val tileGroups: Collection<T>, val padding: Flo
.sub(groupSize.toFloat() / 2f, groupSize.toFloat() / 2f)
.scl(1f / trueGroupSize)
}
// For debugging purposes
override fun draw(batch: Batch?, parentAlpha: Float) {
super.draw(batch, parentAlpha)
}
}

View File

@ -1,6 +1,7 @@
package com.unciv.ui.tilegroups
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.g2d.Batch
import com.badlogic.gdx.math.Interpolation
import com.badlogic.gdx.scenes.scene2d.Actor
import com.badlogic.gdx.scenes.scene2d.Group
@ -178,7 +179,10 @@ class CityButton(val city: CityInfo, private val tileGroup: WorldTileGroup): Tab
private fun getIconTable(): Table {
val secondaryColor = city.civInfo.nation.getInnerColor()
val iconTable = Table()
class IconTable:Table(){
override fun draw(batch: Batch?, parentAlpha: Float) { super.draw(batch, parentAlpha) }
}
val iconTable = IconTable()
iconTable.touchable=Touchable.enabled
iconTable.background = ImageGetter.getRoundedEdgeTableBackground(city.civInfo.nation.getOuterColor())
@ -256,9 +260,13 @@ class CityButton(val city: CityInfo, private val tileGroup: WorldTileGroup): Tab
private fun getPopulationGroup(showGrowth: Boolean): Group {
val growthGreen = Color(0.0f, 0.5f, 0.0f, 1.0f)
val group = Group()
val populationLabel = city.population.population.toString().toLabel()
class PopulationGroup:Group() { // for recognition in the profiler
override fun draw(batch: Batch?, parentAlpha: Float) { super.draw(batch, parentAlpha) }
}
val group = PopulationGroup().apply { isTransform=false }
val populationLabel = city.population.population.toLabel()
populationLabel.color = city.civInfo.nation.getInnerColor()
group.addActor(populationLabel)
@ -288,31 +296,13 @@ class CityButton(val city: CityInfo, private val tileGroup: WorldTileGroup): Tab
when {
city.isGrowing() -> {
val turnsToGrowth = city.getNumTurnsToNewPopulation()
turnLabel = if (turnsToGrowth != null) {
if (turnsToGrowth < 100) {
turnsToGrowth.toString().toLabel()
} else {
"".toLabel()
}
} else {
"".toLabel()
}
turnLabel = if (turnsToGrowth != null && turnsToGrowth < 100) turnsToGrowth.toString().toLabel() else "".toLabel()
}
city.isStarving() -> {
val turnsToStarvation = city.getNumTurnsToStarvation()
turnLabel = if (turnsToStarvation != null) {
if (turnsToStarvation < 100) {
turnsToStarvation.toString().toLabel()
} else {
"".toLabel()
}
} else {
"".toLabel()
}
}
else -> {
turnLabel = "".toLabel()
turnLabel = if (turnsToStarvation != null && turnsToStarvation < 100) turnsToStarvation.toString().toLabel() else "".toLabel()
}
else -> turnLabel = "".toLabel()
}
turnLabel.color = city.civInfo.nation.getInnerColor()
turnLabel.setFontSize(14)
@ -329,7 +319,14 @@ class CityButton(val city: CityInfo, private val tileGroup: WorldTileGroup): Tab
private fun getConstructionGroup(cityConstructions: CityConstructions): Group {
val cityCurrentConstruction = cityConstructions.getCurrentConstruction()
val group= Group()
class ConstructionGroup : Group() { // for recognition in the profiler
override fun draw(batch: Batch?, parentAlpha: Float) {
super.draw(batch, parentAlpha)
}
}
val group = ConstructionGroup().apply { isTransform = false }
val groupHeight = 25f
val groupWidth = if (cityCurrentConstruction is PerpetualConstruction) 15f else 40f
group.setSize(groupWidth, groupHeight)
@ -412,7 +409,10 @@ class CityButton(val city: CityInfo, private val tileGroup: WorldTileGroup): Tab
return barPiece
}
val influenceBar = Table().apply {
class InfluenceTable:Table() { // for recognition in the profiler
override fun draw(batch: Batch?, parentAlpha: Float) { super.draw(batch, parentAlpha) }
}
val influenceBar = InfluenceTable().apply {
defaults().pad(1f)
setSize(width, height)
background = ImageGetter.getBackground(Color.BLACK)
@ -425,4 +425,9 @@ class CityButton(val city: CityInfo, private val tileGroup: WorldTileGroup): Tab
}
}
// For debugging purposes
override fun draw(batch: Batch?, parentAlpha: Float) {
super.draw(batch, parentAlpha)
}
}

View File

@ -1,6 +1,7 @@
package com.unciv.ui.tilegroups
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.g2d.Batch
import com.badlogic.gdx.scenes.scene2d.Actor
import com.badlogic.gdx.scenes.scene2d.Group
import com.badlogic.gdx.scenes.scene2d.Touchable
@ -31,7 +32,11 @@ open class TileGroup(var tileInfo: TileInfo, var tileSetStrings:TileSetStrings)
Circle, Crosshair, Fog layer
City name
*/
val baseLayerGroup = Group().apply { isTransform = false; setSize(groupSize, groupSize) }
// For recognizing the group in the profiler
class BaseLayerGroupClass:Group()
val baseLayerGroup = BaseLayerGroupClass().apply { isTransform = false; setSize(groupSize, groupSize) }
protected var tileBaseImages: ArrayList<Image> = ArrayList()
/** List of ;-delimited image locations comprising the layers -
* for instance, "desert+flood plains" might have an improvment for which there is a certain image eg "desert+flood plains+farm"
@ -43,8 +48,9 @@ open class TileGroup(var tileInfo: TileInfo, var tileSetStrings:TileSetStrings)
protected var baseTerrainOverlayImage: Image? = null
protected var baseTerrain: String = ""
val terrainFeatureLayerGroup = Group().apply { isTransform = false; setSize(groupSize, groupSize) }
class TerrainFeatureLayerGroupClass:Group()
val terrainFeatureLayerGroup = TerrainFeatureLayerGroupClass()
.apply { isTransform = false; setSize(groupSize, groupSize) }
// These are for OLD tiles - for instance the "forest" symbol on the forest
protected var terrainFeatureOverlayImage: Image? = null
@ -57,7 +63,9 @@ open class TileGroup(var tileInfo: TileInfo, var tileSetStrings:TileSetStrings)
protected var pixelCivilianUnitImageLocation = ""
protected var pixelCivilianUnitGroup = Group().apply { isTransform = false; setSize(groupSize, groupSize) }
val miscLayerGroup = Group().apply { isTransform = false; setSize(groupSize, groupSize) }
class MiscLayerGroupClass:Group()
val miscLayerGroup = MiscLayerGroupClass().apply { isTransform = false; setSize(groupSize, groupSize) }
var resourceImage: Actor? = null
var resource: String? = null
private val roadImages = HashMap<TileInfo, RoadImage>()
@ -65,7 +73,8 @@ open class TileGroup(var tileInfo: TileInfo, var tileSetStrings:TileSetStrings)
val icons = TileGroupIcons(this)
val unitLayerGroup = Group().apply { isTransform = false; setSize(groupSize, groupSize);touchable = Touchable.disabled }
class UnitLayerGroupClass:Group()
val unitLayerGroup = UnitLayerGroupClass().apply { isTransform = false; setSize(groupSize, groupSize);touchable = Touchable.disabled }
val cityButtonLayerGroup = Group().apply { isTransform = true; setSize(groupSize, groupSize);
touchable = Touchable.childrenOnly; setOrigin(Align.center) }
@ -162,7 +171,6 @@ open class TileGroup(var tileInfo: TileInfo, var tileSetStrings:TileSetStrings)
if (ImageGetter.imageExists(terrainAndCity))
return listOf(terrainAndCity)
// val cityWithEra = tileSetStrings.getCityTile()
if (ImageGetter.imageExists(tileSetStrings.cityTile))
return listOf(tileSetStrings.cityTile)
}
@ -677,4 +685,9 @@ open class TileGroup(var tileInfo: TileInfo, var tileSetStrings:TileSetStrings)
fun hideCircle() {
circleImage.isVisible = false
}
/** This exists so we can easily find the TileGroup draw method in the android profiling, otherwise it's just a mass of Group.draw->drawChildren->Group.draw etc. */
override fun draw(batch: Batch?, parentAlpha: Float) {
super.draw(batch, parentAlpha)
}
}

View File

@ -1,5 +1,6 @@
package com.unciv.ui.tilegroups
import com.badlogic.gdx.graphics.g2d.Batch
import com.unciv.UncivGame
import com.unciv.logic.city.CityInfo
import com.unciv.logic.civilization.CivilizationInfo
@ -61,4 +62,5 @@ class WorldTileGroup(internal val worldScreen: WorldScreen, tileInfo: TileInfo,
if (city == null) return false
return worldScreen.bottomUnitTable.citySelected(city)
}
}

View File

@ -1,6 +1,7 @@
package com.unciv.ui.worldscreen
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.g2d.Batch
import com.badlogic.gdx.math.Vector2
import com.badlogic.gdx.scenes.scene2d.Group
import com.badlogic.gdx.scenes.scene2d.ui.Image
@ -161,4 +162,10 @@ class MinimapHolder(mapHolder: WorldMapHolder): Table(){
isVisible = UncivGame.Current.settings.showMinimap
minimap.update(civInfo)
}
// For debugging purposes
override fun draw(batch: Batch?, parentAlpha: Float) {
super.draw(batch, parentAlpha)
}
}

View File

@ -3,6 +3,7 @@ package com.unciv.ui.worldscreen
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.Input
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.g2d.Batch
import com.badlogic.gdx.math.Interpolation
import com.badlogic.gdx.math.Vector2
import com.badlogic.gdx.scenes.scene2d.*
@ -445,4 +446,9 @@ class WorldMapHolder(internal val worldScreen: WorldScreen, internal val tileMap
for(tileGroup in tileGroups.values)
tileGroup.cityButtonLayerGroup.setScale(scale)
}
// For debugging purposes
override fun draw(batch: Batch?, parentAlpha: Float) {
super.draw(batch, parentAlpha)
}
}

View File

@ -118,8 +118,19 @@ internal object DesktopLauncher {
// Apparently some chipsets, like NVIDIA Tegra 3 graphics chipset (used in Asus TF700T tablet),
// don't support non-power-of-two texture sizes - kudos @yuroller!
// https://github.com/yairm210/UnCiv/issues/1340
settings.maxWidth = 2048
settings.maxHeight = 2048
/**
* These should be as big as possible in order to accommodate ALL the images together in one bug file.
* Why? Because the rendering function of the main screen renders all the images consecutively, and every time it needs to switch between textures,
* this causes a delay, leading to horrible lag if there are enough switches.
* The cost of this specific solution is that the entire game.png needs be be kept in-memory constantly.
* It's currently only 1.5MB so it should be okay, but it' an important point to remember for the future.
* Sidenode: Modded tilesets don't have this problem, since all the images are included in the mod's single PNG.
* Probably. Unless they have some truly huge images.
*/
settings.maxWidth = 4096
settings.maxHeight = 4096
settings.combineSubdirectories = true
settings.pot = true
settings.fast = true