Procházet zdrojové kódy

新增显示设置功能,通过写入注册表将MC设置为“高性能”

nanhuajiaren před 1 rokem
rodič
revize
2e9ca1345c

+ 46 - 0
Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb

@@ -128,6 +128,10 @@ Public Module ModLaunch
                     Loaders.Insert(3, New LoaderTask(Of Integer, Integer)("内存优化", AddressOf McLaunchMemoryOptimize) With {.ProgressWeight = 30})
                 Case 2 '关闭
             End Select
+            '显示设置
+            If Setup.Get("LaunchGraphicSetup") Then
+                Loaders.Insert(3, New LoaderTask(Of Integer, Integer)("检查显示设置", AddressOf McLaunchCheckGraphicSettings) With {.ProgressWeight = 2})
+            End If
             Dim LaunchLoader As New LoaderCombo(Of Object)("Minecraft 启动", Loaders) With {.Show = False}
             If McLoginLoader.State = LoadState.Finished Then McLoginLoader.State = LoadState.Waiting '要求重启登录主加载器,它会自行决定是否启动副加载器
             '等待加载器执行并更新 UI
@@ -203,6 +207,48 @@ NextInner:
 
 #End Region
 
+#Region "显示设置"
+
+    Private Sub McLaunchCheckGraphicSettings(Loader As LoaderTask(Of Integer, Integer))
+        Const GPU_KEY As String = "Software\Microsoft\DirectX\UserGpuPreferences"
+        Const TARGET_SETUP As String = "GpuPreference=2;"
+        Dim javaPath As String = McLaunchJavaSelected.PathJavaw
+
+        McLaunchLog("显示设置开始")
+        '读取现行设置
+        Try
+            Dim parentKey As Microsoft.Win32.RegistryKey = My.Computer.Registry.CurrentUser
+            Dim regKey As Microsoft.Win32.RegistryKey = parentKey.OpenSubKey(GPU_KEY, False)
+            If regKey IsNot Nothing Then
+                Dim currentSetting As Object = regKey.GetValue(javaPath)
+                If currentSetting IsNot Nothing And TARGET_SETUP.Equals(currentSetting.ToString()) Then
+                    McLaunchLog("不需要调整显示设置")
+                    Exit Sub
+                End If
+                regKey.Close()
+            End If
+        Catch ex As Exception
+            McLaunchLog("无法读取注册表,跳过显示设置")
+            Exit Sub
+        End Try
+        '更新设置
+        Try
+            If Not IsAdmin() Then RunAsAdmin("")
+            Dim parentKey As Microsoft.Win32.RegistryKey = My.Computer.Registry.CurrentUser
+            Dim regKey As Microsoft.Win32.RegistryKey = parentKey.OpenSubKey(GPU_KEY, True)
+            If regKey Is Nothing Then
+                regKey = parentKey.CreateSubKey(GPU_KEY)
+            End If
+            regKey.SetValue(javaPath, TARGET_SETUP)
+        Catch ex As Exception
+            McLaunchLog("无法写入显示设置")
+            Exit Sub
+        End Try
+        McLaunchLog("已修改显示设置")
+    End Sub
+
+#End Region
+
 #Region "预检测"
 
     Private Sub McLaunchPrecheck()

+ 1 - 0
Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb

@@ -103,6 +103,7 @@
         {"LaunchAdvanceRunWait", New SetupEntry(True)},
         {"LaunchAdvanceAssets", New SetupEntry(False)},
         {"LaunchAdvanceJava", New SetupEntry(False)},
+        {"LaunchGraphicSetup", New SetupEntry(False)},
         {"LaunchRamType", New SetupEntry(0)},
         {"LaunchRamCustom", New SetupEntry(15)},
         {"LinkEula", New SetupEntry(False, Source:=SetupSource.Registry)},

+ 7 - 0
Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml

@@ -170,6 +170,13 @@
                     </Grid>
                 </StackPanel>
             </local:MyCard>
+			<local:MyCard Margin="0,0,0,15" Title="显示卡" CanSwap="True" IsSwaped="True">
+				<StackPanel Margin="25,40,25,15">
+					<local:MyHint Text="此选项对应 Windows 设置中的“系统 > 屏幕 > 显示卡”页面,只在部分设备上有实际效果。" IsWarn="False" Margin="0,0,0,10" />
+					<local:MyCheckBox Text="启动前调整图形设置" x:Name="CheckAdvanceGraphicSetup" Tag="LaunchGraphicSetup"
+                                      ToolTip="启动前将 Java 的显示卡设置调整为“高性能”。若游戏运行时 GPU 占用过低,或在使用 OBS 捕捉时遇到黑屏问题,可尝试此功能。" />
+				</StackPanel>
+			</local:MyCard>
             <local:MyCard x:Name="CardSkin" Margin="0,0,0,15" Title="离线皮肤" CanSwap="True" IsSwaped="True">
                 <StackPanel Margin="25,40,25,15">
                     <local:MyHint Text="由于技术问题,此功能只保证对 1.19.2 以前的版本有效!" IsWarn="True" Margin="0,0,0,10" />

+ 5 - 1
Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb

@@ -45,6 +45,9 @@
             CType(FindName("RadioRamType" & Setup.Load("LaunchRamType")), MyRadioBox).Checked = True
             SliderRamCustom.Value = Setup.Get("LaunchRamCustom")
 
+            '显示卡
+            CheckAdvanceGraphicSetup.Checked = Setup.Get("LaunchGraphicSetup")
+
             '高级设置
             TextAdvanceJvm.Text = Setup.Get("LaunchAdvanceJvm")
             TextAdvanceGame.Text = Setup.Get("LaunchAdvanceGame")
@@ -83,6 +86,7 @@
             Setup.Reset("LaunchAdvanceAssets")
             Setup.Reset("LaunchAdvanceRun")
             Setup.Reset("LaunchAdvanceRunWait")
+            Setup.Reset("LaunchGraphicSetup")
 
             Setup.Reset("LaunchArgumentJavaAll")
             Setup.Reset("LaunchArgumentJavaSelect")
@@ -110,7 +114,7 @@
     Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboArgumentIndie.SelectionChanged, ComboArgumentVisibie.SelectionChanged, ComboArgumentWindowType.SelectionChanged, ComboArgumentPriority.SelectionChanged
         If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.SelectedIndex)
     End Sub
-    Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckAdvanceAssets.Change, CheckAdvanceJava.Change, CheckAdvanceRunWait.Change, CheckArgumentRam.Change
+    Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckAdvanceAssets.Change, CheckAdvanceJava.Change, CheckAdvanceRunWait.Change, CheckArgumentRam.Change, CheckAdvanceGraphicSetup.Change
         If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Checked)
     End Sub