From 22d0971ce700ccc2a6c12484d43ef7f790841bbc Mon Sep 17 00:00:00 2001 From: Glavo Date: Wed, 12 Aug 2026 21:21:54 +0800 Subject: [PATCH] update --- .../hmcl/game/HMCLGameRepository.java | 2 ++ .../hmcl/ui/game/GameSettingsPage.java | 1 - .../jackhuang/hmcl/game/LaunchOptions.java | 10 ++++++++ .../hmcl/launch/DefaultLauncher.java | 24 +++++++++++++++++++ .../util/platform/hardware/GraphicsCard.java | 4 ++++ 5 files changed, 40 insertions(+), 1 deletion(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java index 58d8efd4be5..abc972cc372 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java @@ -738,6 +738,7 @@ public LaunchOptions.Builder getLaunchOptions(GameInstanceID instanceId, JavaRun GameSettings.Effective vs = getEffectiveGameSettings(instanceId); boolean noJVMOptions = vs.getInheritable(GameSettings::noJVMOptionsProperty); boolean autoMemory = vs.getInheritable(GameSettings::autoMemoryProperty); + boolean highPerformanceGPU = vs.getInheritable(GameSettings::highPerformanceProperty); GameVersionNumber gameVersionNumber = GameVersionNumber.asGameVersion(getGameVersion(instanceId)); @Nullable Integer maxMemory; @@ -793,6 +794,7 @@ public LaunchOptions.Builder getLaunchOptions(GameInstanceID instanceId, JavaRun .setDisableAutoGameOptions(vs.getInheritable(GameSettings::disableAutoGameOptionsProperty)) .setUseNativeGLFW(vs.getInheritable(GameSettings::useNativeGLFWProperty)) .setUseNativeOpenAL(vs.getInheritable(GameSettings::useNativeOpenALProperty)) + .setUseHighPerformanceGPU(vs.getInheritable(GameSettings::highPerformanceProperty)) .setDaemon(!makeLaunchScript && vs.getInheritable(GameSettings::launcherVisibilityProperty).isDaemon()) .setJavaAgents(javaAgents) .setJavaArguments(javaArguments); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/game/GameSettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/game/GameSettingsPage.java index 7685584beaa..1fc2429b04d 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/game/GameSettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/game/GameSettingsPage.java @@ -790,7 +790,6 @@ public GameSettingsPage(Class settingType) { var highPerformancePane = createInheritableBooleanButton(GameSettings::highPerformanceProperty); graphicsSettings.getContent().add(highPerformancePane); highPerformancePane.setTitle(i18n("settings.advanced.renderer.gpu_preferences")); - highPerformancePane.setSubtitle(i18n("settings.advanced.windows_only")); this.currentGameVersionNumber.addListener((o, oldValue, newValue) -> { boolean showBackendChoose = isPresetSetting || newValue.compareTo("26.2-snapshot-2") >= 0; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LaunchOptions.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LaunchOptions.java index c0866116813..cb1ea514e89 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LaunchOptions.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LaunchOptions.java @@ -61,6 +61,7 @@ public class LaunchOptions implements Serializable { private Renderer renderer = Renderer.DEFAULT; private boolean useNativeGLFW; private boolean useNativeOpenAL; + private boolean useHighPerformanceGPU; private boolean enableDebugLogOutput; private boolean allowAutoAgent; private boolean disableAutoGameOptions; @@ -263,6 +264,10 @@ public boolean isUseNativeOpenAL() { return useNativeOpenAL; } + public boolean isUseHighPerformanceGPU() { + return useHighPerformanceGPU; + } + public boolean isEnableDebugLogOutput() { return enableDebugLogOutput; } @@ -476,6 +481,11 @@ public Builder setUseNativeOpenAL(boolean useNativeOpenAL) { return this; } + public Builder setUseHighPerformanceGPU(boolean useHighPerformanceGPU) { + options.useHighPerformanceGPU = useHighPerformanceGPU; + return this; + } + public Builder setDaemon(boolean daemon) { options.daemon = daemon; return this; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java index 4ef8e3af8bd..319cef85c4f 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java @@ -27,6 +27,8 @@ import org.jackhuang.hmcl.util.io.FileUtils; import org.jackhuang.hmcl.util.io.Unzipper; import org.jackhuang.hmcl.util.platform.*; +import org.jackhuang.hmcl.util.platform.hardware.GraphicsCard; +import org.jackhuang.hmcl.util.platform.hardware.HardwareVendor; import org.jackhuang.hmcl.util.platform.macos.HomebrewUtils; import org.jackhuang.hmcl.util.versioning.GameVersionNumber; import org.jetbrains.annotations.Nullable; @@ -681,6 +683,28 @@ else if (driver instanceof Renderer.Vulkan vulkanDriver) { } } + if (options.getRenderer() == Renderer.DEFAULT) { + List graphicsCards = SystemInfo.getGraphicsCards(); + if (graphicsCards != null && graphicsCards.size() == 2) { + GraphicsCard card0 = graphicsCards.get(0); + GraphicsCard card1 = graphicsCards.get(1); + + if (card0.getType() != null && card1.getType() != null + && card0.getType() != card1.getType()) { + GraphicsCard discreteGraphicsCard = card0.getType() == GraphicsCard.Type.Discrete ? card0 : card1; + + if (OperatingSystem.CURRENT_OS == OperatingSystem.LINUX) { + if (HardwareVendor.NVIDIA.equals(discreteGraphicsCard.getVendor())) { + // https://askubuntu.com/a/1350825 + env.put("__NV_PRIME_RENDER_OFFLOAD", "1"); + env.put("__GLX_VENDOR_LIBRARY_NAME", "nvidia"); + env.put("__VK_LAYER_NV_optimus", "NVIDIA_only"); + } + } + } + } + } + if (analyzer.has(LibraryAnalyzer.LibraryType.FORGE)) { env.put("INST_FORGE", "1"); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/hardware/GraphicsCard.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/hardware/GraphicsCard.java index 1eca3357182..3c1f3fa317c 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/hardware/GraphicsCard.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/hardware/GraphicsCard.java @@ -85,6 +85,10 @@ public String getName() { return driverVersion; } + public @Nullable Type getType() { + return type; + } + public List getVulkanDriverFiles() { return vulkanDriverFiles; }