perf(sprites): Optimized numbers

Now numbers are lazy loaded
This commit is contained in:
Jakub Žitník 2025-03-25 12:58:14 +01:00
parent 1c1230a1d0
commit ca98fe7fae
Signed by: jzitnik
GPG Key ID: C577A802A6AF4EF3
11 changed files with 45 additions and 31 deletions

View File

@ -1,6 +1,7 @@
package cz.jzitnik.game; package cz.jzitnik.game;
import cz.jzitnik.game.sprites.*; import cz.jzitnik.game.sprites.*;
import cz.jzitnik.game.sprites.ui.Number;
import cz.jzitnik.tui.Sprite; import cz.jzitnik.tui.Sprite;
import cz.jzitnik.tui.SpriteList; import cz.jzitnik.tui.SpriteList;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -78,6 +79,7 @@ public class SpriteLoader {
BREAKING, BREAKING,
HEART, HEART,
HUNGER, HUNGER,
NUMBER,
// Seeds // Seeds
WHEAT, WHEAT,
@ -263,6 +265,7 @@ public class SpriteLoader {
SPRITES_MAP.put(SPRITES.BREAKING, new Breaking()); SPRITES_MAP.put(SPRITES.BREAKING, new Breaking());
SPRITES_MAP.put(SPRITES.HEART, new Heart()); SPRITES_MAP.put(SPRITES.HEART, new Heart());
SPRITES_MAP.put(SPRITES.HUNGER, new Hunger()); SPRITES_MAP.put(SPRITES.HUNGER, new Hunger());
SPRITES_MAP.put(SPRITES.NUMBER, new Number());
// SEEDS // SEEDS
SPRITES_MAP.put(SPRITES.WHEAT, new Farmable("dirt.ans", "grass.ans", "sand.ans")); SPRITES_MAP.put(SPRITES.WHEAT, new Farmable("dirt.ans", "grass.ans", "sand.ans"));

View File

@ -50,7 +50,7 @@ public class Furnace implements RightClickHandler, Serializable {
? spriteList.getSprite(outputItem.getItem().getFirst().getSprite()) ? spriteList.getSprite(outputItem.getItem().getFirst().getSprite())
.getSprite(outputItem.getItem().getFirst().getSpriteState().get()) .getSprite(outputItem.getItem().getFirst().getSpriteState().get())
: spriteList.getSprite(outputItem.getItem().getFirst().getSprite()).getSprite(), : spriteList.getSprite(outputItem.getItem().getFirst().getSprite()).getSprite(),
Numbers.getNumberSprite(outputItem.getAmount())).split("\n"); Numbers.getNumberSprite(outputItem.getAmount(), spriteList)).split("\n");
for (int j = 0; j < CELL_HEIGHT; j++) { for (int j = 0; j < CELL_HEIGHT; j++) {
buffer.append("\033[0m").append(" ".repeat(moveLeft)); buffer.append("\033[0m").append(" ".repeat(moveLeft));

View File

@ -173,7 +173,6 @@ public class CustomAnnotationHandler implements CustomPlaceHandler {
private boolean placeFarmable(Game game, int x, int y) { private boolean placeFarmable(Game game, int x, int y) {
var blocksBottom = game.getWorld()[y + 1][x]; var blocksBottom = game.getWorld()[y + 1][x];
System.out.println("lol");
if (blocksBottom.stream().noneMatch(block -> block.getBlockId().equals("farmland"))) { if (blocksBottom.stream().noneMatch(block -> block.getBlockId().equals("farmland"))) {
return false; return false;

View File

@ -2,18 +2,23 @@ package cz.jzitnik.game.handlers.place;
import cz.jzitnik.game.Game; import cz.jzitnik.game.Game;
import cz.jzitnik.game.entities.Block; import cz.jzitnik.game.entities.Block;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class DefaultPlaceHandler implements CustomPlaceHandler { public class DefaultPlaceHandler implements CustomPlaceHandler {
@Override @Override
public boolean place(Game game, int x, int y) { public boolean place(Game game, int x, int y) {
var blocks = game.getWorld()[y][x]; var blocks = game.getWorld()[y][x];
var inventory = game.getInventory(); var inventory = game.getInventory();
var block = inventory.getItemInHand().get().getBlock().get();
blocks.add(inventory.getItemInHand().get().getBlock().get()); blocks.add(block);
blocks.removeAll(blocks.stream().filter(Block::isFlowing).toList()); blocks.removeAll(blocks.stream().filter(Block::isFlowing).toList());
inventory.decreaseItemInHand(); inventory.decreaseItemInHand();
log.info("Block {} was placed at coordinates x:{},y:{}", block.getBlockId(), x, y);
return true; return true;
} }

View File

@ -1,10 +1,8 @@
package cz.jzitnik.game.sprites; package cz.jzitnik.game.sprites;
import cz.jzitnik.tui.ResourceLoader;
import cz.jzitnik.tui.Sprite; import cz.jzitnik.tui.Sprite;
import java.util.HashMap; import java.util.HashMap;
import java.util.Optional;
public class Sheep extends Sprite<Sheep.SheepState> { public class Sheep extends Sprite<Sheep.SheepState> {
public enum SheepState { public enum SheepState {

View File

@ -1,16 +1,34 @@
package cz.jzitnik.game.sprites.ui; package cz.jzitnik.game.sprites.ui;
import cz.jzitnik.tui.ResourceLoader;
import cz.jzitnik.tui.Sprite; import cz.jzitnik.tui.Sprite;
import lombok.extern.slf4j.Slf4j;
import java.util.Objects; import java.util.HashMap;
import java.util.Optional; import java.util.Optional;
public class Number extends Sprite { @Slf4j
public class Number extends Sprite<Number.NumberState> {
public enum NumberState { public enum NumberState {
ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE,
} }
public Number() {
loadResources(new HashMap<>() {
{
put(NumberState.ZERO, "numbers/0.ans");
put(NumberState.ONE, "numbers/1.ans");
put(NumberState.TWO, "numbers/2.ans");
put(NumberState.THREE, "numbers/3.ans");
put(NumberState.FOUR, "numbers/4.ans");
put(NumberState.FIVE, "numbers/5.ans");
put(NumberState.SIX, "numbers/6.ans");
put(NumberState.SEVEN, "numbers/7.ans");
put(NumberState.EIGHT, "numbers/8.ans");
put(NumberState.NINE, "numbers/9.ans");
}
}, NumberState.class);
}
public static String fixForHotbar(String str, int place) { public static String fixForHotbar(String str, int place) {
var parts = str.split("\n"); var parts = str.split("\n");
// Make it 50x25 // Make it 50x25
@ -30,27 +48,16 @@ public class Number extends Sprite {
private String fix(String x) { private String fix(String x) {
return x; return x;
// return x.replaceAll("\033\\[38;5;1;48;5;16m", "\033[0m").replaceAll("\033\\[38;5;16;48;5;16m▓", "\033[0m "); // return x.replaceAll("\033\\[38;5;1;48;5;16m", "\033[0m").replaceAll("\033\\[38;5;16;48;5;16m▓", "\033[0m ");
// // TODO: Fix issue with sprite size decreasing // TODO: Fix issue with sprite size decreasing
} }
public String getSprite() { public String getSprite() {
return fix(Objects.requireNonNull(ResourceLoader.loadResource("breaking/1.ans"))); return getSprite(NumberState.ZERO);
} }
public String getSprite(Enum key) { public String getSprite(NumberState key) {
return fix(Objects.requireNonNull(ResourceLoader.loadResource(switch (key) { log.debug("{}", key);
case NumberState.ZERO -> "numbers/0.ans"; return fix(getResource(key));
case NumberState.ONE -> "numbers/1.ans";
case NumberState.TWO -> "numbers/2.ans";
case NumberState.THREE -> "numbers/3.ans";
case NumberState.FOUR -> "numbers/4.ans";
case NumberState.FIVE -> "numbers/5.ans";
case NumberState.SIX -> "numbers/6.ans";
case NumberState.SEVEN -> "numbers/7.ans";
case NumberState.EIGHT -> "numbers/8.ans";
case NumberState.NINE -> "numbers/9.ans";
default -> throw new IllegalStateException("Unexpected value: " + key);
})));
} }
@Override @Override

View File

@ -71,7 +71,7 @@ public class CraftingTable {
? spriteList.getSprite(inventoryItem.getItem().getFirst().getSprite()) ? spriteList.getSprite(inventoryItem.getItem().getFirst().getSprite())
.getSprite(inventoryItem.getItem().getFirst().getSpriteState().get()) .getSprite(inventoryItem.getItem().getFirst().getSpriteState().get())
: spriteList.getSprite(inventoryItem.getItem().getFirst().getSprite()).getSprite(), : spriteList.getSprite(inventoryItem.getItem().getFirst().getSprite()).getSprite(),
Numbers.getNumberSprite(inventoryItem.getAmount())).split("\n")).orElse(null); Numbers.getNumberSprite(inventoryItem.getAmount(), spriteList)).split("\n")).orElse(null);
for (int i = 0; i < ROW_AMOUNT; i++) { for (int i = 0; i < ROW_AMOUNT; i++) {
for (int j = 0; j < CELL_HEIGHT; j++) { for (int j = 0; j < CELL_HEIGHT; j++) {

View File

@ -261,14 +261,14 @@ public class Inventory extends AutoTransientSupport {
.get()) .get())
: spriteList.getSprite(item.getItem().getFirst().getSprite()) : spriteList.getSprite(item.getItem().getFirst().getSprite())
.getSprite(), .getSprite(),
Numbers.getNumberSprite(item.getAmount()))); Numbers.getNumberSprite(item.getAmount(), spriteList)));
} else { } else {
sprite = SpriteCombiner.combineTwoSprites( sprite = SpriteCombiner.combineTwoSprites(
item.getItem().getFirst().getSpriteState().isPresent() item.getItem().getFirst().getSpriteState().isPresent()
? spriteList.getSprite(item.getItem().getFirst().getSprite()) ? spriteList.getSprite(item.getItem().getFirst().getSprite())
.getSprite(item.getItem().getFirst().getSpriteState().get()) .getSprite(item.getItem().getFirst().getSpriteState().get())
: spriteList.getSprite(item.getItem().getFirst().getSprite()).getSprite(), : spriteList.getSprite(item.getItem().getFirst().getSprite()).getSprite(),
Numbers.getNumberSprite(item.getAmount())); Numbers.getNumberSprite(item.getAmount(), spriteList));
} }
if (item.getItem().getFirst().getDurability() == 0 if (item.getItem().getFirst().getDurability() == 0

View File

@ -58,7 +58,7 @@ public class SmallCraftingTable {
? spriteList.getSprite(inventoryItem.getItem().getFirst().getSprite()) ? spriteList.getSprite(inventoryItem.getItem().getFirst().getSprite())
.getSprite(inventoryItem.getItem().getFirst().getSpriteState().get()) .getSprite(inventoryItem.getItem().getFirst().getSpriteState().get())
: spriteList.getSprite(inventoryItem.getItem().getFirst().getSprite()).getSprite(), : spriteList.getSprite(inventoryItem.getItem().getFirst().getSprite()).getSprite(),
Numbers.getNumberSprite(inventoryItem.getAmount())).split("\n")).orElse(null); Numbers.getNumberSprite(inventoryItem.getAmount(), spriteList)).split("\n")).orElse(null);
int counter = 0; int counter = 0;
for (int i = 0; i < ROW_AMOUNT; i++) { for (int i = 0; i < ROW_AMOUNT; i++) {

View File

@ -9,7 +9,7 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j @Slf4j
public class ResourceLoader { public class ResourceLoader {
public static String loadResource(String fileName) { public static String loadResource(String fileName) {
log.debug("Loading resource: {}", "textures/" + fileName); log.info("Loading resource: {}", "textures/" + fileName);
try (InputStream inputStream = ResourceLoader.class.getClassLoader() try (InputStream inputStream = ResourceLoader.class.getClassLoader()
.getResourceAsStream("textures/" + fileName)) { .getResourceAsStream("textures/" + fileName)) {
if (inputStream == null) { if (inputStream == null) {

View File

@ -1,6 +1,8 @@
package cz.jzitnik.tui.utils; package cz.jzitnik.tui.utils;
import cz.jzitnik.game.SpriteLoader;
import cz.jzitnik.game.sprites.ui.Number; import cz.jzitnik.game.sprites.ui.Number;
import cz.jzitnik.tui.SpriteList;
public class Numbers { public class Numbers {
private static Number.NumberState getNumberState(int digit) { private static Number.NumberState getNumberState(int digit) {
@ -19,7 +21,7 @@ public class Numbers {
}; };
} }
public static String getNumberSprite(int number) { public static String getNumberSprite(int number, SpriteList spriteList) {
if (number == 1) { if (number == 1) {
StringBuilder sprite = new StringBuilder(); StringBuilder sprite = new StringBuilder();
for (int i = 0; i < 25; i++) { for (int i = 0; i < 25; i++) {
@ -29,7 +31,7 @@ public class Numbers {
return sprite.toString(); return sprite.toString();
} }
Number nm = new Number(); var nm = spriteList.getSprite(SpriteLoader.SPRITES.NUMBER);
if (number <= 9) { if (number <= 9) {
Number.NumberState numberState = getNumberState(number); Number.NumberState numberState = getNumberState(number);