From 739e636a2c78762f610dc796e2e486845c60c358 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 17 Apr 2018 17:07:04 -0400 Subject: [PATCH] Added 'sleeping entity' optimization --- core/assets/version.properties | 2 +- core/src/io/anuke/mindustry/Vars.java | 1 - core/src/io/anuke/mindustry/core/Logic.java | 2 ++ .../anuke/mindustry/entities/TileEntity.java | 15 ++++++++---- core/src/io/anuke/mindustry/io/MapIO.java | 3 +++ .../mindustry/ui/fragments/DebugFragment.java | 2 ++ core/src/io/anuke/mindustry/world/Block.java | 23 +++++++++++-------- .../io/anuke/mindustry/world/ColorMapper.java | 3 ++- .../blocks/types/distribution/Conveyor.java | 11 +++++++++ .../blocks/types/distribution/Router.java | 8 +++++++ 10 files changed, 53 insertions(+), 17 deletions(-) diff --git a/core/assets/version.properties b/core/assets/version.properties index 8bd5053905..2957275834 100644 --- a/core/assets/version.properties +++ b/core/assets/version.properties @@ -1,5 +1,5 @@ #Autogenerated file. Do not modify. -#Tue Apr 17 09:04:30 EDT 2018 +#Tue Apr 17 17:05:43 EDT 2018 version=release androidBuildCode=933 name=Mindustry diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index 556b7bde6c..b392e0acb2 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -141,7 +141,6 @@ public class Vars{ public static final EntityGroup playerGroup = Entities.addGroup(Player.class).enableMapping(); public static final EntityGroup tileGroup = Entities.addGroup(TileEntity.class, false); - public static final EntityGroup disabledTileGroup = Entities.addGroup(TileEntity.class, false); public static final EntityGroup bulletGroup = Entities.addGroup(Bullet.class); public static final EntityGroup shieldGroup = Entities.addGroup(Shield.class, false); public static final EntityGroup effectGroup = Entities.addGroup(EffectEntity.class, false); diff --git a/core/src/io/anuke/mindustry/core/Logic.java b/core/src/io/anuke/mindustry/core/Logic.java index f3a0049181..e2a7e8f13f 100644 --- a/core/src/io/anuke/mindustry/core/Logic.java +++ b/core/src/io/anuke/mindustry/core/Logic.java @@ -1,6 +1,7 @@ package io.anuke.mindustry.core; import io.anuke.mindustry.core.GameState.State; +import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.game.EventType.GameOverEvent; import io.anuke.mindustry.game.EventType.PlayEvent; import io.anuke.mindustry.game.EventType.ResetEvent; @@ -61,6 +62,7 @@ public class Logic extends Module { Timers.clear(); Entities.clear(); + TileEntity.sleepingEntities = 0; Events.fire(ResetEvent.class); } diff --git a/core/src/io/anuke/mindustry/entities/TileEntity.java b/core/src/io/anuke/mindustry/entities/TileEntity.java index d0771f8c98..914da6a635 100644 --- a/core/src/io/anuke/mindustry/entities/TileEntity.java +++ b/core/src/io/anuke/mindustry/entities/TileEntity.java @@ -19,12 +19,12 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -import static io.anuke.mindustry.Vars.disabledTileGroup; import static io.anuke.mindustry.Vars.tileGroup; import static io.anuke.mindustry.Vars.world; public class TileEntity extends Entity{ - public static final float timeToSleep = 60f*3; //3 seconds to fall asleep + public static final float timeToSleep = 60f*4; //4 seconds to fall asleep + public static int sleepingEntities = 0; public Tile tile; public Timer timer; @@ -51,7 +51,12 @@ public class TileEntity extends Entity{ timer = new Timer(tile.block().timers); if(added){ - add(); + if(!tile.block().autoSleep) { + add(); + }else{ + sleeping = true; + sleepingEntities ++; + } } return this; @@ -63,8 +68,8 @@ public class TileEntity extends Entity{ sleepTime += Timers.delta(); if(!sleeping && sleepTime >= timeToSleep){ remove(); - add(disabledTileGroup); sleeping = true; + sleepingEntities ++; } } @@ -73,9 +78,9 @@ public class TileEntity extends Entity{ public void wakeUp(){ sleepTime = 0f; if(sleeping){ - remove(); add(tileGroup); sleeping = false; + sleepingEntities --; } } diff --git a/core/src/io/anuke/mindustry/io/MapIO.java b/core/src/io/anuke/mindustry/io/MapIO.java index f6e42849ef..4c20759198 100644 --- a/core/src/io/anuke/mindustry/io/MapIO.java +++ b/core/src/io/anuke/mindustry/io/MapIO.java @@ -2,12 +2,14 @@ package io.anuke.mindustry.io; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.graphics.Pixmap.Format; import com.badlogic.gdx.utils.IntIntMap; import com.badlogic.gdx.utils.ObjectMap; import com.badlogic.gdx.utils.ObjectMap.Entry; import io.anuke.mindustry.content.blocks.Blocks; +import io.anuke.mindustry.game.Team; import io.anuke.mindustry.io.MapTileData.TileDataMarker; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.ColorMapper; @@ -45,6 +47,7 @@ public class MapIO { Block floor = Block.getByID(marker.floor); Block wall = Block.getByID(marker.wall); int wallc = ColorMapper.getColor(wall); + if(wallc == 0 && (wall.update || wall.solid || wall.breakable)) wallc = Color.rgba8888(Team.values()[marker.team].color); pixmap.drawPixel(x, pixmap.getHeight() - 1 - y, wallc == 0 ? ColorMapper.getColor(floor) : wallc); } } diff --git a/core/src/io/anuke/mindustry/ui/fragments/DebugFragment.java b/core/src/io/anuke/mindustry/ui/fragments/DebugFragment.java index 09235ce8e3..1b55ce1e73 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/DebugFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/DebugFragment.java @@ -4,6 +4,7 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; import io.anuke.mindustry.content.UnitTypes; import io.anuke.mindustry.entities.Player; +import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.effect.Fireball; import io.anuke.mindustry.entities.units.BaseUnit; import io.anuke.mindustry.game.Team; @@ -131,6 +132,7 @@ public class DebugFragment implements Fragment { "client.connecting: " + netClient.isConnecting() + "\n" : "", "players: " + playerGroup.size(), "tiles: " + tileGroup.size(), + "tiles.sleeping: " + TileEntity.sleepingEntities, "time: " + Timers.time(), "state.gameover: " + state.gameOver, "state: " + state.getState(), diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index 21a6459de4..078a040ddc 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -106,6 +106,8 @@ public class Block extends BaseBlock { public BlockBars bars = new BlockBars(); /**List of block stats.*/ public BlockStats stats = new BlockStats(); + /**Whether to automatically set the entity to 'sleeping' when created.*/ + public boolean autoSleep; public Block(String name) { this.name = name; @@ -243,16 +245,19 @@ public class Block extends BaseBlock { tempColor.mul(1f/units); - Liquid liquid = tile.entity.liquids.liquid; - float splash = Mathf.clamp(tile.entity.liquids.amount/4f, 0f, 10f); + if(hasLiquids) { - for(int i = 0; i < Mathf.clamp(tile.entity.liquids.amount / 5, 0, 30); i ++){ - Timers.run(i/2, () -> { - Tile other = world.tile(tile.x + Mathf.range(size/2), tile.y + Mathf.range(size/2)); - if(other != null){ - Puddle.deposit(other, liquid, splash); - } - }); + Liquid liquid = tile.entity.liquids.liquid; + float splash = Mathf.clamp(tile.entity.liquids.amount / 4f, 0f, 10f); + + for (int i = 0; i < Mathf.clamp(tile.entity.liquids.amount / 5, 0, 30); i++) { + Timers.run(i / 2, () -> { + Tile other = world.tile(tile.x + Mathf.range(size / 2), tile.y + Mathf.range(size / 2)); + if (other != null) { + Puddle.deposit(other, liquid, splash); + } + }); + } } DamageArea.dynamicExplosion(x, y, flammability, explosiveness, power, tilesize * size/2f, tempColor); diff --git a/core/src/io/anuke/mindustry/world/ColorMapper.java b/core/src/io/anuke/mindustry/world/ColorMapper.java index 01b1195679..cffa220765 100644 --- a/core/src/io/anuke/mindustry/world/ColorMapper.java +++ b/core/src/io/anuke/mindustry/world/ColorMapper.java @@ -36,7 +36,8 @@ public class ColorMapper{ "c3a490", pair(Blocks.iron), "161616", pair(Blocks.coal), "6277bc", pair(Blocks.titanium), - "83bc58", pair(Blocks.thorium) + "83bc58", pair(Blocks.thorium), + "000000", pair(Blocks.space) ); public static BlockPair get(int color){ diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Conveyor.java b/core/src/io/anuke/mindustry/world/blocks/types/distribution/Conveyor.java index 490e16f925..ef4cf0e743 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Conveyor.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/distribution/Conveyor.java @@ -42,6 +42,7 @@ public class Conveyor extends Block{ layer = Layer.overlay; group = BlockGroup.transportation; hasItems = true; + autoSleep = true; } @Override @@ -126,6 +127,7 @@ public class Conveyor extends Block{ int minremove = Integer.MAX_VALUE; float speed = Math.max(this.speed - (1f - (carryCapacity - entity.carrying) / carryCapacity), 0f); + float totalMoved = 0f; for (int i = entity.convey.size - 1; i >= 0; i--) { long value = entity.convey.get(i); @@ -146,6 +148,7 @@ public class Conveyor extends Block{ if (maxmove > minmove) { pos.y += maxmove; pos.x = Mathf.lerpDelta(pos.x, 0, 0.06f); + totalMoved += maxmove; } else { pos.x = Mathf.lerpDelta(pos.x, pos.seed / offsetScl, 0.1f); } @@ -154,6 +157,7 @@ public class Conveyor extends Block{ if (pos.y >= 0.9999f && offloadDir(tile, pos.item)) { minremove = Math.min(i, minremove); + totalMoved = 1f; tile.entity.items.removeItem(pos.item, 1); } else { value = pos.pack(); @@ -167,6 +171,10 @@ public class Conveyor extends Block{ entity.carrying = 0f; entity.minCarry = 2f; + if(totalMoved <= 0.0001f){ + entity.sleep(); + } + if (minremove != Integer.MAX_VALUE) entity.convey.truncate(minremove); } @@ -179,6 +187,7 @@ public class Conveyor extends Block{ @Override public synchronized int removeStack(Tile tile, Item item, int amount) { ConveyorEntity entity = tile.entity(); + entity.wakeUp(); int removed = 0; for(int j = 0; j < amount; j ++) { @@ -214,6 +223,7 @@ public class Conveyor extends Block{ long result = ItemPos.packItem(item, 0f, 0f, (byte)Mathf.random(255)); entity.convey.insert(0, result); entity.items.addItem(item, 1); + entity.wakeUp(); } @Override @@ -235,6 +245,7 @@ public class Conveyor extends Block{ float y = (ang == -1 || ang == 3) ? 1 : (ang == 1 || ang == -3) ? -1 : 0; ConveyorEntity entity = tile.entity(); + entity.wakeUp(); long result = ItemPos.packItem(item, y*0.9f, pos, (byte)Mathf.random(255)); boolean inserted = false; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Router.java b/core/src/io/anuke/mindustry/world/blocks/types/distribution/Router.java index 35222f9ec5..0086e40c12 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Router.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/distribution/Router.java @@ -14,17 +14,24 @@ public class Router extends Block{ solid = true; itemCapacity = 20; group = BlockGroup.transportation; + autoSleep = true; } @Override public void update(Tile tile){ int iterations = Math.max(1, (int) (Timers.delta() + 0.4f)); + boolean moved = false; for(int i = 0; i < iterations; i ++) { if (tile.entity.items.totalItems() > 0) { tryDump(tile); + moved = true; } } + + if(!moved){ + tile.entity.sleep(); + } } @Override @@ -40,6 +47,7 @@ public class Router extends Block{ @Override public void handleItem(Item item, Tile tile, Tile source){ super.handleItem(item, tile, source); + tile.entity.wakeUp(); tile.setExtra(tile.relativeTo(source.x, source.y)); }