From b319012cbb1ba08ade40059bec609e0fe022f84f Mon Sep 17 00:00:00 2001 From: al3x-huang Date: Mon, 18 Nov 2019 05:41:27 -0500 Subject: [PATCH] fpsplugin: Add multiple FPS targets for multiple modes (#10239) Players can now set a global FPS target as well as one for when the window is unfocused --- .../client/plugins/fps/FpsConfig.java | 39 +++++++++++++++---- .../client/plugins/fps/FpsDrawListener.java | 16 +++++--- .../client/plugins/fps/FpsLimitMode.java | 32 --------------- .../client/plugins/fps/FpsOverlay.java | 4 +- 4 files changed, 44 insertions(+), 47 deletions(-) delete mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsLimitMode.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsConfig.java index 73e7f3f8c5..e47449ee71 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsConfig.java @@ -32,20 +32,21 @@ import net.runelite.client.config.ConfigItem; public interface FpsConfig extends Config { @ConfigItem( - keyName = "limitMode", - name = "Limit Mode", - description = "Stay at or under the target frames per second even when in this mode", + keyName = "limitFps", + name = "Limit Global FPS", + description = "Global FPS limit in effect regardless of
" + + "whether window is in focus or not", position = 1 ) - default FpsLimitMode limitMode() + default boolean limitFps() { - return FpsLimitMode.NEVER; + return false; } @ConfigItem( keyName = "maxFps", - name = "FPS target", - description = "Desired max frames per second", + name = "Global FPS target", + description = "Desired max global frames per second", position = 2 ) default int maxFps() @@ -53,11 +54,33 @@ public interface FpsConfig extends Config return 50; } + @ConfigItem( + keyName = "limitFpsUnfocused", + name = "Limit FPS unfocused", + description = "FPS limit while window is out of focus", + position = 3 + ) + default boolean limitFpsUnfocused() + { + return false; + } + + @ConfigItem( + keyName = "maxFpsUnfocused", + name = "Unfocused FPS target", + description = "Desired max frames per second for unfocused", + position = 4 + ) + default int maxFpsUnfocused() + { + return 50; + } + @ConfigItem( keyName = "drawFps", name = "Draw FPS indicator", description = "Show a number in the corner for the current FPS", - position = 3 + position = 5 ) default boolean drawFps() { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsDrawListener.java b/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsDrawListener.java index 3be17f5577..ca521b6b1c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsDrawListener.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsDrawListener.java @@ -36,7 +36,7 @@ import net.runelite.api.events.FocusChanged; * For low powered computers, the RS client is often throttled by the hardware or OS and draws at 25-30 fps. * The nano timer is not used in this scenario. * Instead to catch up the RS client runs several cycles before drawing, thus maintaining 50 cycles / second. - * + *

* Enforcing FPS in the draw code does not impact the client engine's ability to run including its audio, * even when forced to 1 FPS with this plugin. */ @@ -67,7 +67,13 @@ public class FpsDrawListener implements Runnable void reloadConfig() { lastMillis = System.currentTimeMillis(); - targetDelay = 1000 / Math.max(1, config.maxFps()); + + int fps = config.limitFpsUnfocused() && !isFocused + ? config.maxFpsUnfocused() + : config.maxFps(); + + targetDelay = 1000 / Math.max(1, fps); + sleepDelay = targetDelay; for (int i = 0; i < SAMPLE_SIZE; i++) @@ -79,18 +85,18 @@ public class FpsDrawListener implements Runnable void onFocusChanged(FocusChanged event) { this.isFocused = event.isFocused(); + reloadConfig(); // load new delay } private boolean isEnforced() { - return FpsLimitMode.ALWAYS == config.limitMode() - || (FpsLimitMode.UNFOCUSED == config.limitMode() && !isFocused); + return config.limitFps() + || (config.limitFpsUnfocused() && !isFocused); } @Override public void run() { - if (!isEnforced()) { return; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsLimitMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsLimitMode.java deleted file mode 100644 index 25f855f1c5..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsLimitMode.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2017, Levi - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.fps; - -public enum FpsLimitMode -{ - NEVER, - UNFOCUSED, - ALWAYS -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsOverlay.java index 22bf76373b..76b8d18908 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsOverlay.java @@ -77,8 +77,8 @@ public class FpsOverlay extends Overlay private boolean isEnforced() { - return FpsLimitMode.ALWAYS == config.limitMode() - || (FpsLimitMode.UNFOCUSED == config.limitMode() && !isFocused); + return config.limitFps() + || (config.limitFpsUnfocused() && !isFocused); } private Color getFpsValueColor()