From f21435856bb7029abb6a8f1732f547b61a0fb644 Mon Sep 17 00:00:00 2001 From: burgerguy Date: Fri, 28 Aug 2020 12:28:41 -0400 Subject: [PATCH] Refactor usage widget to not create a new thread --- .../main/viewer/PerViewerFacadeInjector.java | 3 +- .../gui/main/viewer/widget/CpuUsageTimer.java | 46 +++++++++++++++++++ .../gui/main/viewer/widget/FpsWidget.java | 25 ++-------- .../main/viewer/widget/FramerateTimer.java | 2 +- 4 files changed, 54 insertions(+), 22 deletions(-) create mode 100644 src/main/java/amidst/gui/main/viewer/widget/CpuUsageTimer.java diff --git a/src/main/java/amidst/gui/main/viewer/PerViewerFacadeInjector.java b/src/main/java/amidst/gui/main/viewer/PerViewerFacadeInjector.java index fb3c53f8f..98b8db844 100644 --- a/src/main/java/amidst/gui/main/viewer/PerViewerFacadeInjector.java +++ b/src/main/java/amidst/gui/main/viewer/PerViewerFacadeInjector.java @@ -21,6 +21,7 @@ import amidst.gui.main.viewer.widget.BiomeExporterProgressWidget; import amidst.gui.main.viewer.widget.BiomeToggleWidget; import amidst.gui.main.viewer.widget.BiomeWidget; +import amidst.gui.main.viewer.widget.CpuUsageTimer; import amidst.gui.main.viewer.widget.CursorInformationWidget; import amidst.gui.main.viewer.widget.DebugWidget; import amidst.gui.main.viewer.widget.FpsWidget; @@ -57,7 +58,7 @@ private static List createWidgets( BiomeToggleWidget biomeToggleWidget = new BiomeToggleWidget(CornerAnchorPoint.BOTTOM_RIGHT, biomeWidget, biomeSelection); WorldOptions worldOptions = world.getWorldOptions(); return Arrays.asList( - new FpsWidget( CornerAnchorPoint.BOTTOM_LEFT, new FramerateTimer(2), settings.showFPS), + new FpsWidget( CornerAnchorPoint.BOTTOM_LEFT, new FramerateTimer(2), new CpuUsageTimer(1), settings.showFPS), new ScaleWidget( CornerAnchorPoint.BOTTOM_CENTER, zoom, settings.showScale), new SeedAndWorldTypeWidget( CornerAnchorPoint.TOP_LEFT, worldOptions.getWorldSeed(), worldOptions.getWorldType()), new SelectedIconWidget( CornerAnchorPoint.TOP_LEFT, worldIconSelection), diff --git a/src/main/java/amidst/gui/main/viewer/widget/CpuUsageTimer.java b/src/main/java/amidst/gui/main/viewer/widget/CpuUsageTimer.java new file mode 100644 index 000000000..9f04fa92d --- /dev/null +++ b/src/main/java/amidst/gui/main/viewer/widget/CpuUsageTimer.java @@ -0,0 +1,46 @@ +package amidst.gui.main.viewer.widget; + +import java.lang.management.ManagementFactory; + +import com.sun.management.OperatingSystemMXBean; + +import amidst.documentation.AmidstThread; +import amidst.documentation.CalledOnlyBy; +import amidst.documentation.NotThreadSafe; + +@SuppressWarnings("restriction") +@NotThreadSafe +public class CpuUsageTimer { + private final OperatingSystemMXBean operatingSystemMXBean; + + private long lastTime; + private long msPerUpdate; + + private float currentUsage = 0.0f; + + @CalledOnlyBy(AmidstThread.EDT) + public CpuUsageTimer(int updatesPerSecond) { + this.operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); + msPerUpdate = (long) (1000d / updatesPerSecond); + reset(); + } + + @CalledOnlyBy(AmidstThread.EDT) + public void reset() { + lastTime = System.currentTimeMillis(); + } + + @CalledOnlyBy(AmidstThread.EDT) + public void tick() { + long currentTime = System.currentTimeMillis(); + if (currentTime - lastTime > msPerUpdate) { + currentUsage = (float) (operatingSystemMXBean.getProcessCpuLoad() * 100); + lastTime = currentTime; + } + } + + @CalledOnlyBy(AmidstThread.EDT) + public float getCurrentUsage() { + return currentUsage; + } +} diff --git a/src/main/java/amidst/gui/main/viewer/widget/FpsWidget.java b/src/main/java/amidst/gui/main/viewer/widget/FpsWidget.java index f46b6a705..174711902 100644 --- a/src/main/java/amidst/gui/main/viewer/widget/FpsWidget.java +++ b/src/main/java/amidst/gui/main/viewer/widget/FpsWidget.java @@ -1,49 +1,34 @@ package amidst.gui.main.viewer.widget; -import java.lang.management.ManagementFactory; import java.util.Arrays; import java.util.List; -import java.util.Timer; -import java.util.TimerTask; - -import com.sun.management.OperatingSystemMXBean; - import amidst.documentation.AmidstThread; import amidst.documentation.CalledOnlyBy; import amidst.documentation.NotThreadSafe; import amidst.settings.Setting; -@SuppressWarnings("restriction") @NotThreadSafe public class FpsWidget extends TextWidget { private final FramerateTimer fpsTimer; + private final CpuUsageTimer usageTimer; private final Setting isVisibleSetting; - private final OperatingSystemMXBean operatingSystemMXBean; - private final Timer usageTimer = new Timer("UsageTimer", true); - private volatile double cpuLoad; @CalledOnlyBy(AmidstThread.EDT) - public FpsWidget(CornerAnchorPoint anchor, FramerateTimer fpsTimer, Setting isVisibleSetting) { + public FpsWidget(CornerAnchorPoint anchor, FramerateTimer fpsTimer, CpuUsageTimer usageTimer, Setting isVisibleSetting) { super(anchor); this.fpsTimer = fpsTimer; + this.usageTimer = usageTimer; this.isVisibleSetting = isVisibleSetting; - this.operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); - - usageTimer.scheduleAtFixedRate(new TimerTask() { - @Override - public void run() { - cpuLoad = operatingSystemMXBean.getProcessCpuLoad() * 100; - } - }, 0, 500); } @CalledOnlyBy(AmidstThread.EDT) @Override protected List updateTextLines() { fpsTimer.tick(); + usageTimer.tick(); if (isVisibleSetting.get()) { return Arrays.asList( - "CPU: " + String.format("%.1f", cpuLoad) + "%", + "CPU: " + String.format("%.1f", usageTimer.getCurrentUsage()) + "%", "FPS: " + String.format("%.1f", fpsTimer.getCurrentFPS())); } else { return null; diff --git a/src/main/java/amidst/gui/main/viewer/widget/FramerateTimer.java b/src/main/java/amidst/gui/main/viewer/widget/FramerateTimer.java index a2fe964c0..61e957af4 100644 --- a/src/main/java/amidst/gui/main/viewer/widget/FramerateTimer.java +++ b/src/main/java/amidst/gui/main/viewer/widget/FramerateTimer.java @@ -14,7 +14,7 @@ public class FramerateTimer { @CalledOnlyBy(AmidstThread.EDT) public FramerateTimer(int updatesPerSecond) { - msPerUpdate = (long) (1000f * (1f / updatesPerSecond)); + msPerUpdate = (long) (1000d / updatesPerSecond); reset(); }