Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 15 additions & 5 deletions platforms/common/src/main/java/dynamic_fps/impl/DynamicFPSMod.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import dynamic_fps.impl.util.Logging;
import dynamic_fps.impl.feature.state.OptionHolder;
import dynamic_fps.impl.util.ResourceLocations;
import dynamic_fps.impl.util.Threads;
import dynamic_fps.impl.util.Version;
import dynamic_fps.impl.feature.volume.SmoothVolumeHandler;
import dynamic_fps.impl.util.duck.DuckLoadingOverlay;
Expand Down Expand Up @@ -198,11 +199,20 @@ public static void onBatteryStatusChanged(State before, State after) {
// Internal logic

private static void doInit() {
// NOTE: Init battery tracker first here
// Since the idle handler queries it for info
BatteryTracker.init();
IdleHandler.init();
SmoothVolumeHandler.init();

if (!BatteryTracker.isFeatureEnabled()) {
IdleHandler.init();
} else {
// Run battery tracker init on its own thread to ensure
// The initial library download doesn't block rendering
Threads.create("init", () -> {
BatteryTracker.init();
// The idle handler must be initialized later,
// Since it queries whether there are batteries available
Threads.runOnMainThread(IdleHandler::init);
});
}
}

private static void showNotification(String titleTranslationKey, String iconPath) {
Expand Down Expand Up @@ -263,7 +273,7 @@ private static void checkForStateChanges() {
checkForStateChanges0();
} else {
// Schedule check for the beginning of the next frame
minecraft.schedule(DynamicFPSMod::checkForStateChanges0);
Threads.runOnMainThread(DynamicFPSMod::checkForStateChanges0);
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package dynamic_fps.impl.compat;

import dynamic_fps.impl.DynamicFPSMod;
import dynamic_fps.impl.util.Threads;
import dynamic_fps.impl.util.Version;
import net.minecraft.client.Minecraft;

Expand Down Expand Up @@ -32,7 +33,7 @@ public static void applyWorkaround() {
// Agrees that the window is focused. The mod is
// A little too fast for this, so we schedule it
// For the next client tick (before next frame).
minecraft.schedule(minecraft.mouseHandler::grabMouse);
Threads.runOnMainThread(minecraft.mouseHandler::grabMouse);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@
import dynamic_fps.impl.config.DynamicFPSConfig;
import dynamic_fps.impl.service.Platform;
import dynamic_fps.impl.util.Logging;
import dynamic_fps.impl.util.Threads;
import net.lostluma.battery.api.Battery;
import net.lostluma.battery.api.Manager;
import net.lostluma.battery.api.State;
import net.lostluma.battery.api.exception.LibraryLoadError;
import net.lostluma.battery.api.util.LibraryUtil;
import net.minecraft.client.Minecraft;
import org.jetbrains.annotations.Nullable;

import java.io.IOException;
Expand All @@ -29,7 +29,6 @@ public class BatteryTracker {
private static @Nullable Manager manager = null;
private static Collection<Battery> batteries = Collections.emptyList();

private static final Minecraft minecraft = Minecraft.getInstance();
private static final Duration updateInterval = Duration.of(15, ChronoUnit.SECONDS);

public static int charge() {
Expand Down Expand Up @@ -57,7 +56,7 @@ public static boolean hasBatteries() {
}

public static void init() {
if (manager != null || !DynamicFPSConfig.INSTANCE.batteryTracker().enabled()) {
if (manager != null || !isFeatureEnabled()) {
return;
}

Expand All @@ -72,10 +71,14 @@ public static void init() {
}
} else {
manager = temp; // Keep around to allow updating batteries
Thread.ofVirtual().name("refresh-battery").start(BatteryTracker::updateBatteries);
Threads.create("refresh-battery", BatteryTracker::updateBatteries);
}
}

public static boolean isFeatureEnabled() {
return DynamicFPSConfig.INSTANCE.batteryTracker().enabled();
}

private static State mergeStates(State a, State b) {
if (a == b) {
return a;
Expand Down Expand Up @@ -105,15 +108,15 @@ private static void updateState() {
changed = true;

int current = charge;
minecraft.schedule(() -> DynamicFPSMod.onBatteryChargeChanged(current, newCharge));
Threads.runOnMainThread(() -> DynamicFPSMod.onBatteryChargeChanged(current, newCharge));
}

if (readInitialData && status != newStatus) {
changed = true;

State current = status;
State updated = newStatus;
minecraft.schedule(() -> DynamicFPSMod.onBatteryStatusChanged(current, updated));
Threads.runOnMainThread(() -> DynamicFPSMod.onBatteryStatusChanged(current, updated));
}

charge = newCharge;
Expand Down Expand Up @@ -177,7 +180,7 @@ private static Manager createManager() {
path = "no_library";
}

ErrorToast.queueToast(localized("toast", path));
Threads.runOnMainThread(() -> ErrorToast.queueToast(localized("toast", path)));
}

return result;
Expand Down
21 changes: 21 additions & 0 deletions platforms/common/src/main/java/dynamic_fps/impl/util/Threads.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package dynamic_fps.impl.util;

import net.minecraft.client.Minecraft;

public class Threads {
/**
* Schedule a task on the main thread.
*/
public static void runOnMainThread(Runnable runnable) {
Minecraft.getInstance().schedule(runnable);
}

/**
* Create a thread and immediately start it.
*/
public static Thread create(String name, Runnable runnable) {
Thread thread = new Thread(runnable, "dynamic-fps-" + name);
thread.start();
return thread;
}
}