mirror of
https://github.com/HMCL-dev/HMCL.git
synced 2026-10-17 05:31:22 +08:00
修复自动分配内存逻辑异常的问题 (#6356)
This commit is contained in:
@@ -382,8 +382,9 @@ public final class HMCLGameRepository extends DefaultGameRepository {
|
||||
+ file + ", Actual: " + schemaResult.actual());
|
||||
case UNEXPECTED_ID -> LOG.warning("Unexpected instance game settings schema. Expected: "
|
||||
+ GameSettings.Instance.CURRENT_SCHEMA + ", Actual: " + schemaResult.actual());
|
||||
case UNSUPPORTED_MAJOR, READ_ONLY_PRESERVE_SCHEMA -> LOG.warning("Unsupported instance game settings schema. Expected: "
|
||||
+ GameSettings.Instance.CURRENT_SCHEMA + ", Actual: " + schemaResult.actual());
|
||||
case UNSUPPORTED_MAJOR, READ_ONLY_PRESERVE_SCHEMA ->
|
||||
LOG.warning("Unsupported instance game settings schema. Expected: "
|
||||
+ GameSettings.Instance.CURRENT_SCHEMA + ", Actual: " + schemaResult.actual());
|
||||
case READ_WRITE, READ_WRITE_PRESERVE_SCHEMA -> {
|
||||
}
|
||||
}
|
||||
@@ -684,7 +685,7 @@ public final class HMCLGameRepository extends DefaultGameRepository {
|
||||
|
||||
/// Result of loading an instance-specific game settings file.
|
||||
///
|
||||
/// @param setting the loaded instance settings, or `null` when unavailable
|
||||
/// @param setting the loaded instance settings, or `null` when unavailable
|
||||
/// @param allowSave whether the file may be overwritten
|
||||
private record InstanceGameSettingsLoadResult(
|
||||
@Nullable GameSettings.Instance setting,
|
||||
@@ -694,26 +695,31 @@ public final class HMCLGameRepository extends DefaultGameRepository {
|
||||
public LaunchOptions.Builder getLaunchOptions(String version, JavaRuntime javaVersion, Path gameDir, List<String> javaAgents, List<String> javaArguments, boolean makeLaunchScript) {
|
||||
GameSettings.Effective vs = getEffectiveGameSettings(version);
|
||||
boolean noJVMOptions = vs.getInheritable(GameSettings::noJVMOptionsProperty);
|
||||
boolean autoMemory = vs.get(GameSettings::autoMemoryProperty);
|
||||
boolean autoMemory = vs.getInheritable(GameSettings::autoMemoryProperty);
|
||||
GameVersionNumber gameVersionNumber = GameVersionNumber.asGameVersion(getGameVersion(version));
|
||||
|
||||
@Nullable Integer maxMemory;
|
||||
if (autoMemory) {
|
||||
maxMemory = noJVMOptions
|
||||
? null
|
||||
: Math.toIntExact(getAutoAllocatedMemory(SystemInfo.getPhysicalMemoryStatus().available()) / 1024L / 1024L);
|
||||
} else {
|
||||
maxMemory = vs.getMaxMemory();
|
||||
}
|
||||
|
||||
LaunchOptions.Builder builder = new LaunchOptions.Builder()
|
||||
.setGameDir(gameDir)
|
||||
.setJava(javaVersion)
|
||||
.setVersionType(Metadata.TITLE)
|
||||
.setVersionName(version)
|
||||
.setProfileName(Metadata.TITLE)
|
||||
.setGameArguments(StringUtils.tokenize(vs.get(GameSettings::gameArgumentsProperty)))
|
||||
.setOverrideJavaArguments(StringUtils.tokenize(vs.get(GameSettings::jvmOptionsProperty)))
|
||||
.setMaxMemory(noJVMOptions && autoMemory ? null : (int) (getAllocatedMemory(
|
||||
vs.getMaxMemory() * 1024L * 1024L,
|
||||
SystemInfo.getPhysicalMemoryStatus().available(),
|
||||
autoMemory
|
||||
) / 1024 / 1024))
|
||||
.setMinMemory(vs.get(GameSettings::minMemoryProperty))
|
||||
.setMetaspace(Lang.toIntOrNull(vs.get(GameSettings::permSizeProperty)))
|
||||
.setGameArguments(StringUtils.tokenize(vs.getInheritable(GameSettings::gameArgumentsProperty)))
|
||||
.setOverrideJavaArguments(StringUtils.tokenize(vs.getInheritable(GameSettings::jvmOptionsProperty)))
|
||||
.setMaxMemory(maxMemory)
|
||||
.setMinMemory(vs.getInheritable(GameSettings::minMemoryProperty))
|
||||
.setMetaspace(Lang.toIntOrNull(vs.getInheritable(GameSettings::permSizeProperty)))
|
||||
.setEnvironmentVariables(
|
||||
Lang.mapOf(StringUtils.tokenize(vs.get(GameSettings::environmentVariablesProperty))
|
||||
Lang.mapOf(StringUtils.tokenize(vs.getInheritable(GameSettings::environmentVariablesProperty))
|
||||
.stream()
|
||||
.map(it -> {
|
||||
int idx = it.indexOf('=');
|
||||
@@ -731,16 +737,16 @@ public final class HMCLGameRepository extends DefaultGameRepository {
|
||||
.setPostExitCommand(vs.getInheritable(GameSettings::postExitCommandProperty))
|
||||
.setNoGeneratedJVMArgs(noJVMOptions)
|
||||
.setNoGeneratedOptimizingJVMArgs(vs.getInheritable(GameSettings::noOptimizingJVMOptionsProperty))
|
||||
.setUseCustomNatives(vs.get(GameSettings::useCustomNativesProperty))
|
||||
.setNativesDir(vs.get(GameSettings::nativesDirectoryProperty))
|
||||
.setUseCustomNatives(vs.getInheritable(GameSettings::useCustomNativesProperty))
|
||||
.setNativesDir(vs.getInheritable(GameSettings::nativesDirectoryProperty))
|
||||
.setProcessPriority(vs.getInheritable(GameSettings::processPriorityProperty))
|
||||
.setGraphicsBackend(vs.getInheritable(GameSettings::graphicsBackendProperty))
|
||||
.setRenderer(vs.getRenderer(gameVersionNumber))
|
||||
.setEnableDebugLogOutput(vs.getInheritable(GameSettings::enableDebugLogOutputProperty))
|
||||
.setAllowAutoAgent(vs.getInheritable(GameSettings::allowAutoAgentProperty))
|
||||
.setDisableAutoGameOptions(vs.getInheritable(GameSettings::disableAutoGameOptionsProperty))
|
||||
.setUseNativeGLFW(vs.get(GameSettings::useNativeGLFWProperty))
|
||||
.setUseNativeOpenAL(vs.get(GameSettings::useNativeOpenALProperty))
|
||||
.setUseNativeGLFW(vs.getInheritable(GameSettings::useNativeGLFWProperty))
|
||||
.setUseNativeOpenAL(vs.getInheritable(GameSettings::useNativeOpenALProperty))
|
||||
.setDaemon(!makeLaunchScript && vs.getInheritable(GameSettings::launcherVisibilityProperty).isDaemon())
|
||||
.setJavaAgents(javaAgents)
|
||||
.setJavaArguments(javaArguments);
|
||||
@@ -838,22 +844,21 @@ public final class HMCLGameRepository extends DefaultGameRepository {
|
||||
}
|
||||
}
|
||||
|
||||
public static long getAllocatedMemory(long minimum, long available, boolean auto) {
|
||||
if (auto) {
|
||||
available -= 512 * 1024 * 1024; // Reserve 512 MiB memory for off-heap memory and HMCL itself
|
||||
if (available <= 0) {
|
||||
return minimum;
|
||||
}
|
||||
|
||||
final long threshold = 8L * 1024 * 1024 * 1024; // 8 GiB
|
||||
final long suggested = Math.min(available <= threshold
|
||||
? (long) (available * 0.8)
|
||||
: (long) (threshold * 0.8 + (available - threshold) * 0.2),
|
||||
16L * 1024 * 1024 * 1024);
|
||||
return Math.max(minimum, suggested);
|
||||
} else {
|
||||
return minimum;
|
||||
public static long getAutoAllocatedMemory(long available) {
|
||||
long usable = available - 512 * 1024 * 1024; // Reserve 512 MiB memory for off-heap memory and HMCL itself
|
||||
if (usable <= 0) {
|
||||
return available;
|
||||
}
|
||||
|
||||
final long threshold = 8L * 1024 * 1024 * 1024; // 8 GiB
|
||||
final long suggested;
|
||||
if (usable <= threshold)
|
||||
suggested = (long) (usable * 0.8);
|
||||
else
|
||||
suggested = Math.min(
|
||||
(long) (threshold * 0.8 + (usable - threshold) * 0.2),
|
||||
16L * 1024 * 1024 * 1024);
|
||||
return suggested;
|
||||
}
|
||||
|
||||
public static ProxyOption getProxyOption() {
|
||||
|
||||
@@ -544,7 +544,7 @@ public final class LauncherHelper {
|
||||
}
|
||||
|
||||
if (violatedMandatoryConstraints.contains(JavaVersionConstraint.VANILLA_LINUX_JAVA_8)) {
|
||||
if (!setting.get(GameSettings::useCustomNativesProperty)) {
|
||||
if (!setting.getInheritable(GameSettings::useCustomNativesProperty)) {
|
||||
FXUtils.runInFX(() -> Controllers.dialog(i18n("launch.advice.vanilla_linux_java_8"), i18n("message.error"), MessageType.ERROR, breakAction));
|
||||
return result;
|
||||
} else {
|
||||
@@ -581,7 +581,7 @@ public final class LauncherHelper {
|
||||
}
|
||||
|
||||
// 32-bit JVM cannot make use of too much memory.
|
||||
if (java.getBits() == Bits.BIT_32 && setting.getMaxMemory() > 1.5 * 1024) {
|
||||
if (java.getBits() == Bits.BIT_32 && !setting.getInheritable(GameSettings::autoMemoryProperty) && setting.getMaxMemory() > 1.5 * 1024) {
|
||||
// 1.5 * 1024 is an inaccurate number.
|
||||
// Actual memory limit depends on operating system and memory.
|
||||
suggestions.add(i18n("launch.advice.too_large_memory_for_32bit"));
|
||||
@@ -628,7 +628,7 @@ public final class LauncherHelper {
|
||||
suggestions.add(i18n("launch.advice.modlauncher8"));
|
||||
break;
|
||||
case VANILLA_X86:
|
||||
if (!setting.get(GameSettings::useCustomNativesProperty)
|
||||
if (!setting.getInheritable(GameSettings::useCustomNativesProperty)
|
||||
&& Platform.isSupportedTranslationX86_64()) {
|
||||
suggestions.add(i18n("launch.advice.vanilla_x86.translation"));
|
||||
}
|
||||
@@ -640,7 +640,7 @@ public final class LauncherHelper {
|
||||
|
||||
// Cannot allocate too much memory exceeding free space.
|
||||
long totalMemorySizeMB = (long) MEGABYTES.convertFromBytes(SystemInfo.getTotalMemorySize());
|
||||
if (totalMemorySizeMB > 0 && totalMemorySizeMB < setting.getMaxMemory()) {
|
||||
if (totalMemorySizeMB > 0 && !setting.getInheritable(GameSettings::autoMemoryProperty) && totalMemorySizeMB < setting.getMaxMemory()) {
|
||||
suggestions.add(i18n("launch.advice.not_enough_space", totalMemorySizeMB));
|
||||
}
|
||||
|
||||
|
||||
@@ -358,10 +358,10 @@ public final class ModpackHelper {
|
||||
GameSettings.PROPERTY_MAX_MEMORY,
|
||||
GameSettings.PROPERTY_PERM_SIZE
|
||||
));
|
||||
setting.autoMemoryProperty().setValue(effective.get(GameSettings::autoMemoryProperty));
|
||||
setting.minMemoryProperty().setValue(effective.get(GameSettings::minMemoryProperty));
|
||||
setting.autoMemoryProperty().setValue(effective.getInheritable(GameSettings::autoMemoryProperty));
|
||||
setting.minMemoryProperty().setValue(effective.getInheritable(GameSettings::minMemoryProperty));
|
||||
setting.maxMemoryProperty().setValue(manifest.getLaunchInfo().getMinMemory());
|
||||
setting.permSizeProperty().setValue(effective.get(GameSettings::permSizeProperty));
|
||||
setting.permSizeProperty().setValue(effective.getInheritable(GameSettings::permSizeProperty));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -67,7 +67,7 @@ import static org.jackhuang.hmcl.util.logging.Logger.LOG;
|
||||
@NotNullByDefault
|
||||
public sealed abstract class GameSettings extends ObservableSetting {
|
||||
/// Suggested maximum heap memory in MiB.
|
||||
static final int SUGGESTED_MEMORY;
|
||||
public static final int SUGGESTED_MEMORY;
|
||||
|
||||
static {
|
||||
double totalMemoryMB = MEGABYTES.convertFromBytes(SystemInfo.getTotalMemorySize());
|
||||
@@ -331,6 +331,11 @@ public sealed abstract class GameSettings extends ObservableSetting {
|
||||
}
|
||||
|
||||
/// Creates a new inheritable property.
|
||||
protected final <T extends @Nullable Object> InheritableProperty<@Nullable T> newInheritableProperty(String name) {
|
||||
return new SimpleInheritableProperty<>(this, name, null);
|
||||
}
|
||||
|
||||
/// Creates a new inheritable property with the given default value.
|
||||
protected final <T extends @UnknownNullability Object> InheritableProperty<T> newInheritableProperty(String name, T defaultValue) {
|
||||
return new SimpleInheritableProperty<>(this, name, defaultValue);
|
||||
}
|
||||
@@ -388,10 +393,10 @@ public sealed abstract class GameSettings extends ObservableSetting {
|
||||
|
||||
/// User customized JVM options.
|
||||
@SerializedName(PROPERTY_JVM_OPTIONS)
|
||||
private final SettingProperty<String> jvmOptions = newSettingProperty(PROPERTY_JVM_OPTIONS, "");
|
||||
private final InheritableProperty<String> jvmOptions = newInheritableProperty(PROPERTY_JVM_OPTIONS, "");
|
||||
|
||||
/// Returns the user customized JVM options property.
|
||||
public SettingProperty<String> jvmOptionsProperty() {
|
||||
public InheritableProperty<String> jvmOptionsProperty() {
|
||||
return jvmOptions;
|
||||
}
|
||||
|
||||
@@ -448,10 +453,10 @@ public sealed abstract class GameSettings extends ObservableSetting {
|
||||
|
||||
/// If `true`, HMCL will automatically adjust memory allocation.
|
||||
@SerializedName(PROPERTY_AUTO_MEMORY)
|
||||
private final SettingProperty<Boolean> autoMemory = newSettingProperty(PROPERTY_AUTO_MEMORY, true);
|
||||
private final InheritableProperty<Boolean> autoMemory = newInheritableProperty(PROPERTY_AUTO_MEMORY, true);
|
||||
|
||||
/// Returns the automatic memory allocation property.
|
||||
public SettingProperty<Boolean> autoMemoryProperty() {
|
||||
public InheritableProperty<Boolean> autoMemoryProperty() {
|
||||
return autoMemory;
|
||||
}
|
||||
|
||||
@@ -460,10 +465,10 @@ public sealed abstract class GameSettings extends ObservableSetting {
|
||||
|
||||
/// The minimum heap memory in MiB.
|
||||
@SerializedName(PROPERTY_MIN_MEMORY)
|
||||
private final SettingProperty<@Nullable Integer> minMemory = newSettingProperty(PROPERTY_MIN_MEMORY);
|
||||
private final InheritableProperty<@Nullable Integer> minMemory = newInheritableProperty(PROPERTY_MIN_MEMORY);
|
||||
|
||||
/// Returns the minimum heap memory property.
|
||||
public SettingProperty<@Nullable Integer> minMemoryProperty() {
|
||||
public InheritableProperty<@Nullable Integer> minMemoryProperty() {
|
||||
return minMemory;
|
||||
}
|
||||
|
||||
@@ -472,10 +477,10 @@ public sealed abstract class GameSettings extends ObservableSetting {
|
||||
|
||||
/// The maximum heap memory in MiB.
|
||||
@SerializedName(PROPERTY_MAX_MEMORY)
|
||||
private final SettingProperty<@Nullable Integer> maxMemory = newSettingProperty(PROPERTY_MAX_MEMORY, SUGGESTED_MEMORY);
|
||||
private final InheritableProperty<@Nullable Integer> maxMemory = newInheritableProperty(PROPERTY_MAX_MEMORY, SUGGESTED_MEMORY);
|
||||
|
||||
/// Returns the maximum heap memory property.
|
||||
public SettingProperty<@Nullable Integer> maxMemoryProperty() {
|
||||
public InheritableProperty<@Nullable Integer> maxMemoryProperty() {
|
||||
return maxMemory;
|
||||
}
|
||||
|
||||
@@ -484,10 +489,10 @@ public sealed abstract class GameSettings extends ObservableSetting {
|
||||
|
||||
/// The permanent generation or metaspace size in MiB.
|
||||
@SerializedName(PROPERTY_PERM_SIZE)
|
||||
private final SettingProperty<String> permSize = newSettingProperty(PROPERTY_PERM_SIZE, "");
|
||||
private final InheritableProperty<String> permSize = newInheritableProperty(PROPERTY_PERM_SIZE, "");
|
||||
|
||||
/// Returns the permanent generation or metaspace size property.
|
||||
public SettingProperty<String> permSizeProperty() {
|
||||
public InheritableProperty<String> permSizeProperty() {
|
||||
return permSize;
|
||||
}
|
||||
|
||||
@@ -593,10 +598,10 @@ public sealed abstract class GameSettings extends ObservableSetting {
|
||||
|
||||
/// User customized arguments passed to the game.
|
||||
@SerializedName(PROPERTY_GAME_ARGS)
|
||||
private final SettingProperty<String> gameArguments = newSettingProperty(PROPERTY_GAME_ARGS, "");
|
||||
private final InheritableProperty<String> gameArguments = newInheritableProperty(PROPERTY_GAME_ARGS, "");
|
||||
|
||||
/// Returns the customized game arguments property.
|
||||
public SettingProperty<String> gameArgumentsProperty() {
|
||||
public InheritableProperty<String> gameArgumentsProperty() {
|
||||
return gameArguments;
|
||||
}
|
||||
|
||||
@@ -643,10 +648,10 @@ public sealed abstract class GameSettings extends ObservableSetting {
|
||||
|
||||
/// User customized environment variables passed to the game.
|
||||
@SerializedName(PROPERTY_ENVIRONMENT_VARIABLES)
|
||||
private final SettingProperty<String> environmentVariables = newSettingProperty(PROPERTY_ENVIRONMENT_VARIABLES, "");
|
||||
private final InheritableProperty<String> environmentVariables = newInheritableProperty(PROPERTY_ENVIRONMENT_VARIABLES, "");
|
||||
|
||||
/// Returns the customized environment variables property.
|
||||
public SettingProperty<String> environmentVariablesProperty() {
|
||||
public InheritableProperty<String> environmentVariablesProperty() {
|
||||
return environmentVariables;
|
||||
}
|
||||
|
||||
@@ -763,10 +768,10 @@ public sealed abstract class GameSettings extends ObservableSetting {
|
||||
|
||||
/// If `true`, HMCL does not patch native libraries.
|
||||
@SerializedName(PROPERTY_NOT_PATCH_NATIVES)
|
||||
private final SettingProperty<Boolean> notPatchNatives = newSettingProperty(PROPERTY_NOT_PATCH_NATIVES, false);
|
||||
private final InheritableProperty<Boolean> notPatchNatives = newInheritableProperty(PROPERTY_NOT_PATCH_NATIVES, false);
|
||||
|
||||
/// Returns the native library patching property.
|
||||
public SettingProperty<Boolean> notPatchNativesProperty() {
|
||||
public InheritableProperty<Boolean> notPatchNativesProperty() {
|
||||
return notPatchNatives;
|
||||
}
|
||||
|
||||
@@ -775,10 +780,10 @@ public sealed abstract class GameSettings extends ObservableSetting {
|
||||
|
||||
/// If `true`, HMCL leaves native library management to the user.
|
||||
@SerializedName(PROPERTY_USE_CUSTOM_NATIVES)
|
||||
private final SettingProperty<Boolean> useCustomNatives = newSettingProperty(PROPERTY_USE_CUSTOM_NATIVES, false);
|
||||
private final InheritableProperty<Boolean> useCustomNatives = newInheritableProperty(PROPERTY_USE_CUSTOM_NATIVES, false);
|
||||
|
||||
/// Returns the custom native libraries property.
|
||||
public SettingProperty<Boolean> useCustomNativesProperty() {
|
||||
public InheritableProperty<Boolean> useCustomNativesProperty() {
|
||||
return useCustomNatives;
|
||||
}
|
||||
|
||||
@@ -787,10 +792,10 @@ public sealed abstract class GameSettings extends ObservableSetting {
|
||||
|
||||
/// The path to the native library directory, or an empty string for the default path.
|
||||
@SerializedName(PROPERTY_NATIVES_DIRECTORY)
|
||||
private final SettingProperty<String> nativesDirectory = newSettingProperty(PROPERTY_NATIVES_DIRECTORY, "");
|
||||
private final InheritableProperty<String> nativesDirectory = newInheritableProperty(PROPERTY_NATIVES_DIRECTORY, "");
|
||||
|
||||
/// Returns the native library directory property.
|
||||
public SettingProperty<String> nativesDirectoryProperty() {
|
||||
public InheritableProperty<String> nativesDirectoryProperty() {
|
||||
return nativesDirectory;
|
||||
}
|
||||
|
||||
@@ -799,10 +804,10 @@ public sealed abstract class GameSettings extends ObservableSetting {
|
||||
|
||||
/// If `true`, HMCL will use native GLFW.
|
||||
@SerializedName(PROPERTY_USE_NATIVE_GLFW)
|
||||
private final SettingProperty<Boolean> useNativeGLFW = newSettingProperty(PROPERTY_USE_NATIVE_GLFW, false);
|
||||
private final InheritableProperty<Boolean> useNativeGLFW = newInheritableProperty(PROPERTY_USE_NATIVE_GLFW, false);
|
||||
|
||||
/// Returns the native GLFW property.
|
||||
public SettingProperty<Boolean> useNativeGLFWProperty() {
|
||||
public InheritableProperty<Boolean> useNativeGLFWProperty() {
|
||||
return useNativeGLFW;
|
||||
}
|
||||
|
||||
@@ -811,10 +816,10 @@ public sealed abstract class GameSettings extends ObservableSetting {
|
||||
|
||||
/// If `true`, HMCL will use native OpenAL.
|
||||
@SerializedName(PROPERTY_USE_NATIVE_OPENAL)
|
||||
private final SettingProperty<Boolean> useNativeOpenAL = newSettingProperty(PROPERTY_USE_NATIVE_OPENAL, false);
|
||||
private final InheritableProperty<Boolean> useNativeOpenAL = newInheritableProperty(PROPERTY_USE_NATIVE_OPENAL, false);
|
||||
|
||||
/// Returns the native OpenAL property.
|
||||
public SettingProperty<Boolean> useNativeOpenALProperty() {
|
||||
public InheritableProperty<Boolean> useNativeOpenALProperty() {
|
||||
return useNativeOpenAL;
|
||||
}
|
||||
|
||||
@@ -898,11 +903,6 @@ public sealed abstract class GameSettings extends ObservableSetting {
|
||||
return instance;
|
||||
}
|
||||
|
||||
/// Returns the effective value for a property whose override state is tracked by the property itself.
|
||||
public <T extends @UnknownNullability Object> T get(Function<GameSettings, SettingProperty<T>> propertyGetter) {
|
||||
return inherited(preset, instance, propertyGetter);
|
||||
}
|
||||
|
||||
/// Returns the effective value for an inheritable property.
|
||||
public <T extends @UnknownNullability Object> T getInheritable(
|
||||
Function<GameSettings, InheritableProperty<T>> propertyGetter) {
|
||||
@@ -981,7 +981,7 @@ public sealed abstract class GameSettings extends ObservableSetting {
|
||||
|
||||
/// Returns the effective maximum heap memory in MiB.
|
||||
public int getMaxMemory() {
|
||||
Integer value = get(GameSettings::maxMemoryProperty);
|
||||
Integer value = getInheritable(GameSettings::maxMemoryProperty);
|
||||
return value != null && value > 0 ? value : SUGGESTED_MEMORY;
|
||||
}
|
||||
|
||||
|
||||
@@ -190,7 +190,7 @@ public final class ExportWizardProvider implements WizardProvider {
|
||||
"OneSix",
|
||||
exportInfo.getName() + "-" + exportInfo.getVersion(),
|
||||
null,
|
||||
Lang.toIntOrNull(setting.get(GameSettings::permSizeProperty)),
|
||||
Lang.toIntOrNull(setting.getInheritable(GameSettings::permSizeProperty)),
|
||||
setting.getInheritable(GameSettings::commandWrapperProperty),
|
||||
setting.getInheritable(GameSettings::preLaunchCommandProperty),
|
||||
null,
|
||||
|
||||
@@ -101,9 +101,9 @@ public final class ModpackInfoPage extends Control implements WizardPage {
|
||||
author.set(Optional.ofNullable(Accounts.getSelectedAccount()).map(Account::getProfileName).orElse(""));
|
||||
|
||||
GameSettings.Effective versionSetting = gameRepository.getEffectiveGameSettings(versionName);
|
||||
minMemory.set(Optional.ofNullable(versionSetting.get(GameSettings::minMemoryProperty)).orElse(0));
|
||||
launchArguments.set(versionSetting.get(GameSettings::gameArgumentsProperty));
|
||||
javaArguments.set(versionSetting.get(GameSettings::jvmOptionsProperty));
|
||||
minMemory.set(Optional.ofNullable(versionSetting.getInheritable(GameSettings::minMemoryProperty)).orElse(0));
|
||||
launchArguments.set(versionSetting.getInheritable(GameSettings::gameArgumentsProperty));
|
||||
javaArguments.set(versionSetting.getInheritable(GameSettings::jvmOptionsProperty));
|
||||
|
||||
canIncludeLauncher = JarUtils.thisJarPath() != null;
|
||||
}
|
||||
|
||||
@@ -1923,7 +1923,7 @@ public final class GameSettingsPage<S extends GameSettings> extends StackPane
|
||||
}
|
||||
|
||||
memorySelectedValue.set(resolveEffectiveSetting(setting)
|
||||
.get(GameSettings::autoMemoryProperty));
|
||||
.getInheritable(GameSettings::autoMemoryProperty));
|
||||
};
|
||||
InvalidationListener weakRefresh = holder.weak(refresh);
|
||||
refreshHolder.value = weakRefresh;
|
||||
|
||||
@@ -617,47 +617,26 @@ final class IndependentSettingBinder {
|
||||
Label allocatedMemoryLabel,
|
||||
@Nullable Boolean autoMemory,
|
||||
@Nullable Integer maxMemory) {
|
||||
memoryStatusBar.memoryAllocatedProperty().set(calculateAllocatedMemory(memoryStatusBar, autoMemory, maxMemory));
|
||||
updateMemoryLabels(memoryStatusBar, physicalMemoryLabel, allocatedMemoryLabel, autoMemory, maxMemory);
|
||||
}
|
||||
|
||||
private static double calculateAllocatedMemory(
|
||||
MemoryStatusBar memoryStatusBar,
|
||||
@Nullable Boolean autoMemory,
|
||||
@Nullable Integer maxMemory) {
|
||||
long maxMemoryBytes = Math.max(0, maxMemory != null ? maxMemory : 0) * 1024L * 1024L;
|
||||
return HMCLGameRepository.getAllocatedMemory(
|
||||
maxMemoryBytes,
|
||||
memoryStatusBar.getMemoryStatus().available(),
|
||||
Boolean.TRUE.equals(autoMemory));
|
||||
}
|
||||
|
||||
private static void updateMemoryLabels(
|
||||
MemoryStatusBar memoryStatusBar,
|
||||
Label physicalMemoryLabel,
|
||||
Label allocatedMemoryLabel,
|
||||
@Nullable Boolean autoMemory,
|
||||
@Nullable Integer maxMemory) {
|
||||
PhysicalMemoryStatus memoryStatus = memoryStatusBar.getMemoryStatus();
|
||||
long maxMemoryBytes = Math.max(0, maxMemory != null ? maxMemory : 0) * 1024L * 1024L;
|
||||
boolean autoMemoryEnabled = Boolean.TRUE.equals(autoMemory);
|
||||
|
||||
long memoryAllocated;
|
||||
if (Boolean.TRUE.equals(autoMemory)) {
|
||||
memoryAllocated = HMCLGameRepository.getAutoAllocatedMemory(memoryStatus.available());
|
||||
} else if (maxMemory != null && maxMemory > 0) {
|
||||
memoryAllocated = maxMemory * 1024L * 1024L;
|
||||
} else {
|
||||
memoryAllocated = GameSettings.SUGGESTED_MEMORY * 1024L * 1024L;
|
||||
}
|
||||
|
||||
memoryStatusBar.memoryAllocatedProperty().set(memoryAllocated);
|
||||
|
||||
physicalMemoryLabel.setText(i18n("settings.memory.used_per_total",
|
||||
GIGABYTES.convertFromBytes(memoryStatus.getUsed()),
|
||||
GIGABYTES.convertFromBytes(memoryStatus.total())));
|
||||
allocatedMemoryLabel.setText(i18n(
|
||||
memoryStatus.hasAvailable() && maxMemoryBytes > memoryStatus.available()
|
||||
? (autoMemoryEnabled
|
||||
? "settings.memory.allocate.auto.exceeded"
|
||||
: "settings.memory.allocate.manual.exceeded")
|
||||
: (autoMemoryEnabled
|
||||
? "settings.memory.allocate.auto"
|
||||
: "settings.memory.allocate.manual"),
|
||||
GIGABYTES.convertFromBytes(maxMemoryBytes),
|
||||
GIGABYTES.convertFromBytes(HMCLGameRepository.getAllocatedMemory(
|
||||
maxMemoryBytes,
|
||||
memoryStatus.available(),
|
||||
autoMemoryEnabled)),
|
||||
GIGABYTES.convertFromBytes(memoryStatus.available())));
|
||||
allocatedMemoryLabel.setText(
|
||||
memoryStatus.hasAvailable() && memoryAllocated > memoryStatus.available()
|
||||
? i18n("settings.memory.allocate.exceeded", GIGABYTES.convertFromBytes(memoryAllocated), GIGABYTES.convertFromBytes(memoryStatus.available()))
|
||||
: i18n("settings.memory.allocate", GIGABYTES.convertFromBytes(memoryAllocated)));
|
||||
}
|
||||
|
||||
private static <T> void toggleOverride(
|
||||
|
||||
@@ -78,7 +78,7 @@ public final class NativePatcher {
|
||||
JavaRuntime javaVersion,
|
||||
GameSettings.Effective settings,
|
||||
List<String> javaArguments) {
|
||||
if (settings.get(GameSettings::useCustomNativesProperty)) {
|
||||
if (settings.getInheritable(GameSettings::useCustomNativesProperty)) {
|
||||
if (gameVersion != null && GameVersionNumber.compare(gameVersion, "1.19") < 0)
|
||||
return version;
|
||||
|
||||
@@ -96,8 +96,8 @@ public final class NativePatcher {
|
||||
return version.setLibraries(newLibraries);
|
||||
}
|
||||
|
||||
final boolean useNativeGLFW = settings.get(GameSettings::useNativeGLFWProperty);
|
||||
final boolean useNativeOpenAL = settings.get(GameSettings::useNativeOpenALProperty);
|
||||
final boolean useNativeGLFW = settings.getInheritable(GameSettings::useNativeGLFWProperty);
|
||||
final boolean useNativeOpenAL = settings.getInheritable(GameSettings::useNativeOpenALProperty);
|
||||
|
||||
if (OperatingSystem.CURRENT_OS.isLinuxOrBSD() && (useNativeGLFW || useNativeOpenAL)
|
||||
&& gameVersion != null && GameVersionNumber.compare(gameVersion, "1.19") >= 0) {
|
||||
@@ -124,7 +124,7 @@ public final class NativePatcher {
|
||||
Architecture arch = javaVersion.getArchitecture();
|
||||
GameVersionNumber gameVersionNumber = gameVersion != null ? GameVersionNumber.asGameVersion(gameVersion) : null;
|
||||
|
||||
if (settings.get(GameSettings::notPatchNativesProperty))
|
||||
if (settings.getInheritable(GameSettings::notPatchNativesProperty))
|
||||
return version;
|
||||
|
||||
if (arch.isX86() && (os == OperatingSystem.WINDOWS || os == OperatingSystem.LINUX || os == OperatingSystem.MACOS))
|
||||
|
||||
@@ -1610,10 +1610,8 @@ settings.launcher.version_list_source=Version List
|
||||
settings.launcher.background.settings.opacity=Opacity
|
||||
|
||||
settings.memory=Memory
|
||||
settings.memory.allocate.auto=%1$.1f GiB Minimum / %2$.1f GiB Allocated
|
||||
settings.memory.allocate.auto.exceeded=%1$.1f GiB Minimum / %2$.1f GiB Allocated (%3$.1f GiB Available)
|
||||
settings.memory.allocate.manual=%1$.1f GiB Allocated
|
||||
settings.memory.allocate.manual.exceeded=%1$.1f GiB Allocated (%3$.1f GiB Available)
|
||||
settings.memory.allocate=%1$.1f GiB Allocated
|
||||
settings.memory.allocate.exceeded=%1$.1f GiB Allocated (%2$.1f GiB Available)
|
||||
settings.memory.auto_allocate=Automatically Allocate
|
||||
settings.memory.lower_bound=Minimum Memory
|
||||
settings.memory.manual_allocate=Manually Allocate Memory
|
||||
|
||||
@@ -1428,10 +1428,8 @@ settings.launcher.version_list_source=قائمة الإصدارات
|
||||
settings.launcher.background.settings.opacity=الشفافية
|
||||
|
||||
settings.memory=الذاكرة
|
||||
settings.memory.allocate.auto=%1$.1f جيجابايت كحد أدنى / %2$.1f جيجابايت مخصص
|
||||
settings.memory.allocate.auto.exceeded=%1$.1f جيجابايت كحد أدنى / %2$.1f جيجابايت مخصص (%3$.1f جيجابايت متاح)
|
||||
settings.memory.allocate.manual=%1$.1f جيجابايت مخصص
|
||||
settings.memory.allocate.manual.exceeded=%1$.1f جيجابايت مخصص (%3$.1f جيجابايت متاح)
|
||||
settings.memory.allocate=%1$.1f جيجابايت مخصص
|
||||
settings.memory.allocate.exceeded=%1$.1f جيجابايت مخصص (%2$.1f جيجابايت متاح)
|
||||
settings.memory.auto_allocate=تخصيص تلقائي
|
||||
settings.memory.lower_bound=الحد الأدنى للذاكرة
|
||||
settings.memory.unit.mib=ميجابايت
|
||||
|
||||
@@ -1329,10 +1329,8 @@ settings.launcher.version_list_source=Lista de versiones
|
||||
settings.launcher.background.settings.opacity=Opacidad
|
||||
|
||||
settings.memory=Memoria
|
||||
settings.memory.allocate.auto=%1$.1f GiB Mínimo / %2$.1f GiB Asignado
|
||||
settings.memory.allocate.auto.exceeded=%1$.1f GiB Mínimo / %2$.1f GiB Asignado (%3$.1f GiB Disponible)
|
||||
settings.memory.allocate.manual=%1$.1f GiB Asignados
|
||||
settings.memory.allocate.manual.exceeded=%1$.1f GiB Asignados (%3$.1f GiB Disponibles)
|
||||
settings.memory.allocate=%1$.1f GiB Asignados
|
||||
settings.memory.allocate.exceeded=%1$.1f GiB Asignados (%2$.1f GiB Disponibles)
|
||||
settings.memory.auto_allocate=Asignar automáticamente
|
||||
settings.memory.lower_bound=Memoria mínima
|
||||
settings.memory.unit.mib=MiB
|
||||
|
||||
@@ -856,10 +856,8 @@ settings.launcher.title_transparent=タイトルの透明性
|
||||
settings.launcher.version_list_source=バージョンリストソース
|
||||
|
||||
settings.memory=ゲームメモリ
|
||||
settings.memory.allocate.auto=最小 %1$.1f GiB /実際の %2$.1f GiB
|
||||
settings.memory.allocate.auto.exceeded=最小 %1$.1f GiB /実際の %2$.1f GiB(%3$.1f GiB使用可能)
|
||||
settings.memory.allocate.manual=割り当て %1$.1f GiB
|
||||
settings.memory.allocate.manual.exceeded=割り当て %1$.1f GiB(%3$.1f GiB使用可能)
|
||||
settings.memory.allocate=割り当て %1$.1f GiB
|
||||
settings.memory.allocate.exceeded=割り当て %1$.1f GiB(%2$.1f GiB使用可能)
|
||||
settings.memory.auto_allocate=メモリサイズの自動割り当て
|
||||
settings.memory.lower_bound=最小メモリ
|
||||
settings.memory.unit.mib=MiB
|
||||
|
||||
@@ -1152,10 +1152,8 @@ settings.launcher.version_list_source=版列供者
|
||||
settings.launcher.background.settings.opacity=陰翳
|
||||
|
||||
settings.memory=戲憶
|
||||
settings.memory.allocate.auto=至低分之 %1$.1f GiB / 實分之 %2$.1f GiB
|
||||
settings.memory.allocate.auto.exceeded=至低分之 %1$.1f GiB / 實分之 %2$.1f GiB (械祇 %3$.1f GiB)
|
||||
settings.memory.allocate.manual=戲分之 %1$.1f GiB
|
||||
settings.memory.allocate.manual.exceeded=戲分之 %1$.1f GiB (械祇 %3$.1f GiB)
|
||||
settings.memory.allocate=戲分之 %1$.1f GiB
|
||||
settings.memory.allocate.exceeded=戲分之 %1$.1f GiB (械祇 %2$.1f GiB)
|
||||
settings.memory.auto_allocate=自調其憶
|
||||
settings.memory.lower_bound=至低憶界
|
||||
settings.memory.unit.mib=兆二進字節
|
||||
|
||||
@@ -1318,10 +1318,8 @@ settings.launcher.version_list_source=Список версий
|
||||
settings.launcher.background.settings.opacity=Непрозрачность
|
||||
|
||||
settings.memory=Оперативная память
|
||||
settings.memory.allocate.auto=Минимум %1$.1f ГиБ / Выделено %2$.1f ГиБ
|
||||
settings.memory.allocate.auto.exceeded=Минимум %1$.1f ГиБ / Выделено %2$.1f ГиБ (Доступно %3$.1f ГиБ)
|
||||
settings.memory.allocate.manual=Выделено %1$.1f ГиБ
|
||||
settings.memory.allocate.manual.exceeded=Выделено %1$.1f ГиБ (Доступно %3$.1f ГиБ)
|
||||
settings.memory.allocate=Выделено %1$.1f ГиБ
|
||||
settings.memory.allocate.exceeded=Выделено %1$.1f ГиБ (Доступно %2$.1f ГиБ)
|
||||
settings.memory.auto_allocate=Автовыделение
|
||||
settings.memory.lower_bound=Мин. объём памяти
|
||||
settings.memory.unit.mib=МиБ
|
||||
|
||||
@@ -1267,10 +1267,8 @@ settings.launcher.version_list_source=Список версій
|
||||
settings.launcher.background.settings.opacity=Непрозорість
|
||||
|
||||
settings.memory=Пам'ять
|
||||
settings.memory.allocate.auto=%1$.1f ГіБ Мінімум / %2$.1f ГіБ Виділено
|
||||
settings.memory.allocate.auto.exceeded=%1$.1f ГіБ Мінімум / %2$.1f ГіБ Виділено (%3$.1f ГіБ Доступно)
|
||||
settings.memory.allocate.manual=%1$.1f ГіБ Виділено
|
||||
settings.memory.allocate.manual.exceeded=%1$.1f ГіБ Виділено (%3$.1f ГіБ Доступно)
|
||||
settings.memory.allocate=%1$.1f ГіБ Виділено
|
||||
settings.memory.allocate.exceeded=%1$.1f ГіБ Виділено (%2$.1f ГіБ Доступно)
|
||||
settings.memory.auto_allocate=Автоматично виділяти
|
||||
settings.memory.lower_bound=Мінімальна пам'ять
|
||||
settings.memory.unit.mib=МіБ
|
||||
|
||||
@@ -1401,10 +1401,8 @@ settings.launcher.version_list_source=版本清單來源
|
||||
settings.launcher.background.settings.opacity=不透明度
|
||||
|
||||
settings.memory=遊戲記憶體
|
||||
settings.memory.allocate.auto=最低分配 %1$.1f GiB / 實際分配 %2$.1f GiB
|
||||
settings.memory.allocate.auto.exceeded=最低分配 %1$.1f GiB / 實際分配 %2$.1f GiB (%3$.1f GiB 可用)
|
||||
settings.memory.allocate.manual=遊戲分配 %1$.1f GiB
|
||||
settings.memory.allocate.manual.exceeded=遊戲分配 %1$.1f GiB (%3$.1f GiB 可用)
|
||||
settings.memory.allocate=遊戲分配 %1$.1f GiB
|
||||
settings.memory.allocate.exceeded=遊戲分配 %1$.1f GiB (%2$.1f GiB 可用)
|
||||
settings.memory.auto_allocate=自動分配
|
||||
settings.memory.lower_bound=最低分配
|
||||
settings.memory.manual_allocate=手動選取記憶體
|
||||
|
||||
@@ -1406,10 +1406,8 @@ settings.launcher.version_list_source=版本列表源
|
||||
settings.launcher.background.settings.opacity=不透明度
|
||||
|
||||
settings.memory=游戏内存
|
||||
settings.memory.allocate.auto=最低分配 %1$.1f GiB / 实际分配 %2$.1f GiB
|
||||
settings.memory.allocate.auto.exceeded=最低分配 %1$.1f GiB / 实际分配 %2$.1f GiB (%3$.1f GiB 可用)
|
||||
settings.memory.allocate.manual=游戏分配 %1$.1f GiB
|
||||
settings.memory.allocate.manual.exceeded=游戏分配 %1$.1f GiB (设备仅 %3$.1f GiB 可用)
|
||||
settings.memory.allocate=游戏分配 %1$.1f GiB
|
||||
settings.memory.allocate.exceeded=游戏分配 %1$.1f GiB (设备仅 %2$.1f GiB 可用)
|
||||
settings.memory.auto_allocate=自动分配内存
|
||||
settings.memory.lower_bound=最低内存分配
|
||||
settings.memory.manual_allocate=手动选择内存
|
||||
|
||||
Reference in New Issue
Block a user