From 46baed4335cbe56f8c7cc8083204e05524575eb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Wed, 3 Feb 2021 20:56:49 +0100 Subject: [PATCH] Create FPS monitor --- .../base/core/stat/FPSMonitor.java | 7 +++ .../base/core/stat/LogFPSMonitor.java | 63 +++++++++++++++++++ .../bartlomiejpluta/base/core/ui/Window.java | 7 ++- .../base/core/util/math/MathUtil.java | 15 +++++ .../base/core/world/map/GameMap.java | 4 ++ .../base/core/world/map/TileLayer.java | 10 +-- 6 files changed, 101 insertions(+), 5 deletions(-) create mode 100755 engine/src/main/java/com/bartlomiejpluta/base/core/stat/FPSMonitor.java create mode 100755 engine/src/main/java/com/bartlomiejpluta/base/core/stat/LogFPSMonitor.java diff --git a/engine/src/main/java/com/bartlomiejpluta/base/core/stat/FPSMonitor.java b/engine/src/main/java/com/bartlomiejpluta/base/core/stat/FPSMonitor.java new file mode 100755 index 00000000..4b401a08 --- /dev/null +++ b/engine/src/main/java/com/bartlomiejpluta/base/core/stat/FPSMonitor.java @@ -0,0 +1,7 @@ +package com.bartlomiejpluta.base.core.stat; + +import com.bartlomiejpluta.base.core.gc.Cleanable; +import com.bartlomiejpluta.base.core.logic.Updatable; + +public interface FPSMonitor extends Updatable, Cleanable { +} diff --git a/engine/src/main/java/com/bartlomiejpluta/base/core/stat/LogFPSMonitor.java b/engine/src/main/java/com/bartlomiejpluta/base/core/stat/LogFPSMonitor.java new file mode 100755 index 00000000..628a6a6a --- /dev/null +++ b/engine/src/main/java/com/bartlomiejpluta/base/core/stat/LogFPSMonitor.java @@ -0,0 +1,63 @@ +package com.bartlomiejpluta.base.core.stat; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import static java.util.Comparator.comparingInt; +import static java.util.function.Function.identity; +import static java.util.stream.Collectors.counting; +import static java.util.stream.Collectors.groupingBy; + +@Slf4j +@Component +public class LogFPSMonitor implements FPSMonitor { + private static final int MOD = 30; + private final List values = new LinkedList<>(); + private float fpsAccumulator = 0; + private int pointer = 0; + private double fps = 0; + + @Override + public void update(float dt) { + fpsAccumulator += dt; + + if (++pointer % MOD == 0) { + fps = pointer / fpsAccumulator; + fpsAccumulator = 0; + pointer = 0; + + values.add(fps); + } + } + + @Override + public void cleanUp() { + log.info("Min FPS: {}, max FPS: {}, avg FPS: {}", + values.stream().min(Double::compareTo).orElse(-1.0), + values.stream().max(Double::compareTo).orElse(-1.0), + totalAverage() + ); + + printHistogram(); + } + + private double totalAverage() { + return values.stream().reduce(0.0, Double::sum) / values.size(); + } + + private void printHistogram() { + values + .stream() + .mapToInt(Double::intValue) + .boxed() + .collect(groupingBy(identity(), counting())) + .entrySet() + .stream() + .sorted(comparingInt(Map.Entry::getKey)) + .forEach(e -> log.info("{} FPS: {}% ({} occurrences)", e.getKey(), e.getValue() * 100.0f / values.size(), e.getValue())); + } +} diff --git a/engine/src/main/java/com/bartlomiejpluta/base/core/ui/Window.java b/engine/src/main/java/com/bartlomiejpluta/base/core/ui/Window.java index 19fa6785..8dce66e6 100755 --- a/engine/src/main/java/com/bartlomiejpluta/base/core/ui/Window.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/core/ui/Window.java @@ -5,6 +5,7 @@ import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; +import org.joml.Vector2f; import org.lwjgl.glfw.GLFWErrorCallback; import org.lwjgl.glfw.GLFWVidMode; import org.lwjgl.opengl.GL; @@ -76,7 +77,7 @@ public class Window { glfwMakeContextCurrent(windowHandle); // Enable V-Sync - glfwSwapInterval(1); +// glfwSwapInterval(1); // Make the window visible glfwShowWindow(windowHandle); @@ -108,6 +109,10 @@ public class Window { return glfwWindowShouldClose(windowHandle); } + public Vector2f getSize() { + return new Vector2f(width, height); + } + public static Window create(String title, int width, int height) { return new Window(title, -1, width, height, false); } diff --git a/engine/src/main/java/com/bartlomiejpluta/base/core/util/math/MathUtil.java b/engine/src/main/java/com/bartlomiejpluta/base/core/util/math/MathUtil.java index 56a42847..d2690bcd 100755 --- a/engine/src/main/java/com/bartlomiejpluta/base/core/util/math/MathUtil.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/core/util/math/MathUtil.java @@ -1,5 +1,8 @@ package com.bartlomiejpluta.base.core.util.math; +import static java.lang.Math.max; +import static java.lang.Math.min; + public class MathUtil { public static int gcdEuclidean(int a, int b) { int x = a; @@ -14,4 +17,16 @@ public class MathUtil { return x; } + + public static int clamp(int value, int min, int max) { + return min(max, max(value, min)); + } + + public static float clamp(float value, float min, float max) { + return min(max, max(value, min)); + } + + public static double clamp(double value, double min, double max) { + return min(max, max(value, min)); + } } diff --git a/engine/src/main/java/com/bartlomiejpluta/base/core/world/map/GameMap.java b/engine/src/main/java/com/bartlomiejpluta/base/core/world/map/GameMap.java index 348c6762..91eff8aa 100755 --- a/engine/src/main/java/com/bartlomiejpluta/base/core/world/map/GameMap.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/core/world/map/GameMap.java @@ -64,6 +64,10 @@ public class GameMap implements Renderable, Updatable { } } + public Vector2f getSize() { + return new Vector2f(columns * stepSize.x, rows * stepSize.y); + } + public GameMap createObjectLayer() { var passageMap = new PassageAbility[rows][columns]; for (int i = 0; i < rows; ++i) { diff --git a/engine/src/main/java/com/bartlomiejpluta/base/core/world/map/TileLayer.java b/engine/src/main/java/com/bartlomiejpluta/base/core/world/map/TileLayer.java index 1ee051c4..4445f6c4 100755 --- a/engine/src/main/java/com/bartlomiejpluta/base/core/world/map/TileLayer.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/core/world/map/TileLayer.java @@ -29,10 +29,12 @@ public class TileLayer implements Layer { @Override public void render(Window window, ShaderManager shaderManager) { - for(var row : layer) { - for(var tile : row) { - shaderManager.setUniform(UniformName.UNI_MODEL_MATRIX, tile.getModelMatrix()); - tile.render(window, shaderManager); + for (var row : layer) { + for (var tile : row) { + if (tile != null) { + shaderManager.setUniform(UniformName.UNI_MODEL_MATRIX, tile.getModelMatrix()); + tile.render(window, shaderManager); + } } } }