PageSetupLaunch.xaml.vb 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598
  1. Public Class PageSetupLaunch
  2. Private IsLoad As Boolean = False
  3. Private Sub PageSetupLaunch_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
  4. '重复加载部分
  5. PanBack.ScrollToHome()
  6. RefreshRam(False)
  7. If McInstanceSelected Is Nothing Then
  8. BtnSwitch.Visibility = Visibility.Collapsed
  9. Else
  10. BtnSwitch.Visibility = Visibility.Visible
  11. End If
  12. '非重复加载部分
  13. If IsLoad Then Return
  14. IsLoad = True
  15. AniControlEnabled += 1
  16. Reload()
  17. AniControlEnabled -= 1
  18. '内存自动刷新
  19. Dim timer As New Threading.DispatcherTimer With {.Interval = New TimeSpan(0, 0, 0, 1)}
  20. AddHandler timer.Tick, AddressOf RefreshRam
  21. timer.Start()
  22. End Sub
  23. Public Sub Reload()
  24. Try
  25. '离线皮肤
  26. CType(FindName("RadioSkinType" & Setup.Load("LaunchSkinType")), MyRadioBox).Checked = True
  27. TextSkinID.Text = Setup.Get("LaunchSkinID")
  28. '启动参数
  29. TextArgumentTitle.Text = Setup.Get("LaunchArgumentTitle")
  30. TextArgumentInfo.Text = Setup.Get("LaunchArgumentInfo")
  31. ComboArgumentIndieV2.SelectedIndex = Setup.Get("LaunchArgumentIndieV2")
  32. ComboArgumentVisibie.SelectedIndex = Setup.Get("LaunchArgumentVisible")
  33. ComboArgumentPriority.SelectedIndex = Setup.Get("LaunchArgumentPriority")
  34. ComboArgumentWindowType.SelectedIndex = Setup.Get("LaunchArgumentWindowType")
  35. TextArgumentWindowWidth.Text = Setup.Get("LaunchArgumentWindowWidth")
  36. TextArgumentWindowHeight.Text = Setup.Get("LaunchArgumentWindowHeight")
  37. CheckArgumentRam.Checked = Setup.Get("LaunchArgumentRam")
  38. RefreshJavaComboBox()
  39. '游戏内存
  40. CType(FindName("RadioRamType" & Setup.Load("LaunchRamType")), MyRadioBox).Checked = True
  41. SliderRamCustom.Value = Setup.Get("LaunchRamCustom")
  42. '高级设置
  43. TextAdvanceJvm.Text = Setup.Get("LaunchAdvanceJvm")
  44. TextAdvanceGame.Text = Setup.Get("LaunchAdvanceGame")
  45. TextAdvanceRun.Text = Setup.Get("LaunchAdvanceRun")
  46. ComboAdvanceGC.SelectedIndex = Setup.Get("LaunchAdvanceGC")
  47. CheckAdvanceRunWait.Checked = Setup.Get("LaunchAdvanceRunWait")
  48. CheckAdvanceDisableJLW.Checked = Setup.Get("LaunchAdvanceDisableJLW")
  49. CheckAdvanceGraphicCard.Checked = Setup.Get("LaunchAdvanceGraphicCard")
  50. Catch ex As NullReferenceException
  51. Log(ex, "启动设置项存在异常,已被自动重置", LogLevel.Msgbox)
  52. Reset()
  53. Catch ex As Exception
  54. Log(ex, "重载启动设置时出错", LogLevel.Feedback)
  55. End Try
  56. End Sub
  57. '初始化
  58. Public Sub Reset()
  59. Try
  60. Setup.Reset("LaunchArgumentTitle")
  61. Setup.Reset("LaunchArgumentInfo")
  62. Setup.Set("LaunchArgumentIndieV2", Setup.GetDefault("LaunchArgumentIndieV2"))
  63. Setup.Reset("LaunchArgumentVisible")
  64. Setup.Reset("LaunchArgumentWindowType")
  65. Setup.Reset("LaunchArgumentWindowWidth")
  66. Setup.Reset("LaunchArgumentWindowHeight")
  67. Setup.Reset("LaunchArgumentPriority")
  68. Setup.Reset("LaunchArgumentRam")
  69. Setup.Reset("LaunchRamType")
  70. Setup.Reset("LaunchRamCustom")
  71. Setup.Reset("LaunchSkinType")
  72. Setup.Reset("LaunchSkinID")
  73. Setup.Reset("LaunchAdvanceJvm")
  74. Setup.Reset("LaunchAdvanceGame")
  75. Setup.Reset("LaunchAdvanceRun")
  76. Setup.Reset("LaunchAdvanceGC")
  77. Setup.Reset("LaunchAdvanceRunWait")
  78. Setup.Reset("LaunchAdvanceDisableJLW")
  79. Setup.Reset("LaunchAdvanceGraphicCard")
  80. Setup.Reset("LaunchArgumentJavaAll")
  81. Setup.Reset("LaunchArgumentJavaSelect")
  82. JavaSearchLoader.Start(IsForceRestart:=True)
  83. Log("[Setup] 已初始化启动设置")
  84. Hint("已初始化启动设置!", HintType.Green, False)
  85. Catch ex As Exception
  86. Log(ex, "初始化启动设置失败", LogLevel.Msgbox)
  87. End Try
  88. Reload()
  89. End Sub
  90. '将控件改变路由到设置改变
  91. Private Shared Sub RadioBoxChange(sender As MyRadioBox, e As Object) Handles RadioSkinType0.Check, RadioSkinType1.Check, RadioSkinType2.Check, RadioSkinType3.Check, RadioSkinType4.Check, RadioRamType0.Check, RadioRamType1.Check
  92. If AniControlEnabled = 0 Then Setup.Set(sender.Tag.ToString.Split("/")(0), Val(sender.Tag.ToString.Split("/")(1)))
  93. End Sub
  94. Private Shared Sub TextBoxChange(sender As MyTextBox, e As Object) Handles TextSkinID.ValidatedTextChanged, TextArgumentWindowHeight.ValidatedTextChanged, TextArgumentWindowWidth.ValidatedTextChanged, TextArgumentInfo.ValidatedTextChanged, TextAdvanceGame.ValidatedTextChanged, TextAdvanceJvm.ValidatedTextChanged, TextArgumentTitle.ValidatedTextChanged, TextAdvanceRun.ValidatedTextChanged
  95. If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Text)
  96. End Sub
  97. Private Shared Sub SliderChange(sender As MySlider, e As Object) Handles SliderRamCustom.Change
  98. If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Value)
  99. End Sub
  100. Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboArgumentIndieV2.SelectionChanged, ComboArgumentVisibie.SelectionChanged, ComboArgumentWindowType.SelectionChanged, ComboArgumentPriority.SelectionChanged, ComboAdvanceGC.SelectionChanged
  101. If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.SelectedIndex)
  102. End Sub
  103. Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckAdvanceRunWait.Change, CheckArgumentRam.Change, CheckAdvanceDisableJLW.Change, CheckAdvanceGraphicCard.Change
  104. If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Checked)
  105. End Sub
  106. #Region "离线皮肤"
  107. Private Sub BtnSkinChange_Click(sender As Object, e As EventArgs) Handles BtnSkinChange.Click
  108. Dim SkinInfo As McSkinInfo = McSkinSelect()
  109. If Not SkinInfo.IsVaild Then Return
  110. ChangeSkin(SkinInfo)
  111. End Sub
  112. Private Sub RadioSkinType3_Check(sender As Object, e As RouteEventArgs) Handles RadioSkinType4.PreviewCheck
  113. If Not (AniControlEnabled = 0 AndAlso e.RaiseByMouse) Then Return
  114. '已有图片则不再选择
  115. If File.Exists(PathAppdata & "CustomSkin.png") Then Return
  116. '没有图片则要求选择
  117. Dim SkinInfo As McSkinInfo = McSkinSelect()
  118. If Not SkinInfo.IsVaild Then
  119. e.Handled = True
  120. Return
  121. End If
  122. '正式改变
  123. If Not ChangeSkin(SkinInfo) Then e.Handled = True
  124. End Sub
  125. '返回是否成功改变
  126. Private Function ChangeSkin(SkinInfo As McSkinInfo) As Boolean
  127. Try
  128. '拷贝文件
  129. File.Delete(PathAppdata & "CustomSkin.png")
  130. CopyFile(SkinInfo.LocalFile, PathAppdata & "CustomSkin.png")
  131. '将单层皮肤扩展到双层
  132. Dim Bitmap As New MyBitmap(PathAppdata & "CustomSkin.png")
  133. If Bitmap.Pic.Width = 64 AndAlso Bitmap.Pic.Height = 32 Then
  134. Dim Img As System.Drawing.Image = Bitmap
  135. Dim NewBitmap As New System.Drawing.Bitmap(64, 64)
  136. Using g As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(NewBitmap)
  137. g.DrawImageUnscaled(Img, New System.Drawing.Point(0, 0))
  138. End Using
  139. File.Delete(PathAppdata & "CustomSkin.png")
  140. NewBitmap.Save(PathAppdata & "CustomSkin.png")
  141. End If
  142. '更新设置
  143. Setup.Set("LaunchSkinSlim", SkinInfo.IsSlim)
  144. ChangeSkin = True
  145. Catch ex As Exception
  146. Log(ex, "改变离线皮肤失败", LogLevel.Msgbox)
  147. ChangeSkin = False
  148. Finally
  149. '设置当前显示
  150. PageLaunchLeft.SkinLegacy.Start(IsForceRestart:=True)
  151. End Try
  152. End Function
  153. Private Sub BtnSkinDelete_Click(sender As Object, e As EventArgs) Handles BtnSkinDelete.Click
  154. Try
  155. File.Delete(PathAppdata & "CustomSkin.png")
  156. RadioSkinType0.SetChecked(True, True)
  157. Hint("离线皮肤已清空!", HintType.Green)
  158. Catch ex As Exception
  159. Log(ex, "清空离线皮肤失败", LogLevel.Msgbox)
  160. End Try
  161. End Sub
  162. Private Sub BtnSkinSave_Click(sender As Object, e As EventArgs) Handles BtnSkinSave.Click
  163. MySkin.Save(PageLaunchLeft.SkinLegacy)
  164. End Sub
  165. Private Sub BtnSkinCache_Click(sender As Object, e As EventArgs) Handles BtnSkinCache.Click
  166. MySkin.RefreshCache(Nothing)
  167. End Sub
  168. #End Region
  169. #Region "游戏内存"
  170. Public Sub RamType(Type As Integer)
  171. If SliderRamCustom Is Nothing Then Return
  172. SliderRamCustom.IsEnabled = (Type = 1)
  173. End Sub
  174. ''' <summary>
  175. ''' 刷新 UI 上的 RAM 显示。
  176. ''' </summary>
  177. Public Sub RefreshRam(ShowAnim As Boolean)
  178. If LabRamGame Is Nothing OrElse LabRamUsed Is Nothing OrElse FrmMain.PageCurrent <> FormMain.PageType.Setup OrElse FrmSetupLeft.PageID <> FormMain.PageSubType.SetupLaunch Then Return
  179. '获取内存情况
  180. Dim RamGame As Double = Math.Round(GetRam(McInstanceSelected, False), 5)
  181. Dim RamTotal As Double = Math.Round(My.Computer.Info.TotalPhysicalMemory / 1024 / 1024 / 1024, 1)
  182. Dim RamAvailable As Double = Math.Round(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024 / 1024, 1)
  183. Dim RamGameActual As Double = Math.Round(Math.Min(RamGame, RamAvailable), 5)
  184. Dim RamUsed As Double = Math.Round(RamTotal - RamAvailable, 5)
  185. Dim RamEmpty As Double = Math.Round(MathClamp(RamTotal - RamUsed - RamGame, 0, 1000), 1)
  186. '设置最大可用内存
  187. If RamTotal <= 1.5 Then
  188. SliderRamCustom.MaxValue = Math.Max(Math.Floor((RamTotal - 0.3) / 0.1), 1)
  189. ElseIf RamTotal <= 8 Then
  190. SliderRamCustom.MaxValue = Math.Floor((RamTotal - 1.5) / 0.5) + 12
  191. ElseIf RamTotal <= 16 Then
  192. SliderRamCustom.MaxValue = Math.Floor((RamTotal - 8) / 1) + 25
  193. Else
  194. SliderRamCustom.MaxValue = Math.Floor((RamTotal - 16) / 2) + 33
  195. End If
  196. '设置文本
  197. LabRamGame.Text = If(RamGame = Math.Floor(RamGame), RamGame & ".0", RamGame) & " GB" &
  198. If(RamGame <> RamGameActual, " (可用 " & If(RamGameActual = Math.Floor(RamGameActual), RamGameActual & ".0", RamGameActual) & " GB)", "")
  199. LabRamUsed.Text = If(RamUsed = Math.Floor(RamUsed), RamUsed & ".0", RamUsed) & " GB"
  200. LabRamTotal.Text = " / " & If(RamTotal = Math.Floor(RamTotal), RamTotal & ".0", RamTotal) & " GB"
  201. LabRamWarn.Visibility = If(RamGame = 1 AndAlso Not JavaIs64Bit() AndAlso Not Is32BitSystem AndAlso JavaList.Any, Visibility.Visible, Visibility.Collapsed)
  202. If ShowAnim Then
  203. '宽度动画
  204. AniStart({
  205. AaGridLengthWidth(ColumnRamUsed, RamUsed - ColumnRamUsed.Width.Value, 800,, New AniEaseOutFluent(AniEasePower.Strong)),
  206. AaGridLengthWidth(ColumnRamGame, RamGameActual - ColumnRamGame.Width.Value, 800,, New AniEaseOutFluent(AniEasePower.Strong)),
  207. AaGridLengthWidth(ColumnRamEmpty, RamEmpty - ColumnRamEmpty.Width.Value, 800,, New AniEaseOutFluent(AniEasePower.Strong))
  208. }, "SetupLaunch Ram Grid")
  209. Else
  210. '宽度设置
  211. ColumnRamUsed.Width = New GridLength(RamUsed, GridUnitType.Star)
  212. ColumnRamGame.Width = New GridLength(RamGameActual, GridUnitType.Star)
  213. ColumnRamEmpty.Width = New GridLength(RamEmpty, GridUnitType.Star)
  214. End If
  215. End Sub
  216. Private Sub RefreshRam() Handles SliderRamCustom.Change, RadioRamType0.Check, RadioRamType1.Check
  217. RefreshRam(True)
  218. End Sub
  219. Private RamTextLeft As Integer = 2, RamTextRight As Integer = 1
  220. ''' <summary>
  221. ''' 刷新 UI 上的文本位置。
  222. ''' </summary>
  223. Private Sub RefreshRamText() Handles RectRamGame.SizeChanged, RectRamEmpty.SizeChanged, LabRamGame.SizeChanged
  224. '获取宽度信息
  225. Dim RectUsedWidth = RectRamUsed.ActualWidth
  226. Dim TotalWidth = PanRamDisplay.ActualWidth
  227. Dim LabGameWidth = LabRamGame.ActualWidth, LabUsedWidth = LabRamUsed.ActualWidth, LabTotalWidth = LabRamTotal.ActualWidth
  228. Dim LabGameTitleWidth = LabRamGameTitle.ActualWidth, LabUsedTitleWidth = LabRamUsedTitle.ActualWidth
  229. '左侧
  230. Dim Left As Integer
  231. If RectUsedWidth - 30 < LabUsedWidth OrElse RectUsedWidth - 30 < LabUsedTitleWidth Then
  232. '全写不下了
  233. Left = 0
  234. ElseIf RectUsedWidth - 25 < (LabUsedWidth + LabTotalWidth) Then
  235. '显示不下完整数据
  236. Left = 1
  237. Else
  238. '正常
  239. Left = 2
  240. End If
  241. If RamTextLeft <> Left Then
  242. RamTextLeft = Left
  243. Select Case Left
  244. Case 0
  245. AniStart({
  246. AaOpacity(LabRamUsed, -LabRamUsed.Opacity, 100),
  247. AaOpacity(LabRamTotal, -LabRamTotal.Opacity, 100),
  248. AaOpacity(LabRamUsedTitle, -LabRamUsedTitle.Opacity, 100)
  249. }, "SetupLaunch Ram TextLeft")
  250. Case 1
  251. AniStart({
  252. AaOpacity(LabRamUsed, 1 - LabRamUsed.Opacity, 100),
  253. AaOpacity(LabRamTotal, -LabRamTotal.Opacity, 100),
  254. AaOpacity(LabRamUsedTitle, 0.7 - LabRamUsedTitle.Opacity, 100)
  255. }, "SetupLaunch Ram TextLeft")
  256. Case 2
  257. AniStart({
  258. AaOpacity(LabRamUsed, 1 - LabRamUsed.Opacity, 100),
  259. AaOpacity(LabRamTotal, 1 - LabRamTotal.Opacity, 100),
  260. AaOpacity(LabRamUsedTitle, 0.7 - LabRamUsedTitle.Opacity, 100)
  261. }, "SetupLaunch Ram TextLeft")
  262. End Select
  263. End If
  264. '右侧
  265. Dim Right As Integer
  266. If TotalWidth < LabGameWidth + 2 + RectUsedWidth OrElse TotalWidth < LabGameTitleWidth + 2 + RectUsedWidth Then
  267. '挤到最右边
  268. Right = 0
  269. Else
  270. '正常情况
  271. Right = 1
  272. End If
  273. If Right = 0 Then
  274. If AniControlEnabled = 0 AndAlso (RamTextRight <> Right OrElse AniIsRun("SetupLaunch Ram TextRight")) Then
  275. '需要动画
  276. AniStart({
  277. AaX(LabRamGame, TotalWidth - LabGameWidth - LabRamGame.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak)),
  278. AaX(LabRamGameTitle, TotalWidth - LabGameTitleWidth - LabRamGameTitle.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak))
  279. }, "SetupLaunch Ram TextRight")
  280. Else
  281. '不需要动画
  282. AniStop("SetupLaunch Ram TextRight")
  283. LabRamGame.Margin = New Thickness(TotalWidth - LabGameWidth, 3, 0, 0)
  284. LabRamGameTitle.Margin = New Thickness(TotalWidth - LabGameTitleWidth, 0, 0, 5)
  285. End If
  286. Else
  287. If AniControlEnabled = 0 AndAlso (RamTextRight <> Right OrElse AniIsRun("SetupLaunch Ram TextRight")) Then
  288. '需要动画
  289. AniStart({
  290. AaX(LabRamGame, 2 + RectUsedWidth - LabRamGame.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak)),
  291. AaX(LabRamGameTitle, 2 + RectUsedWidth - LabRamGameTitle.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak))
  292. }, "SetupLaunch Ram TextRight")
  293. Else
  294. '不需要动画
  295. AniStop("SetupLaunch Ram TextRight")
  296. LabRamGame.Margin = New Thickness(2 + RectUsedWidth, 3, 0, 0)
  297. LabRamGameTitle.Margin = New Thickness(2 + RectUsedWidth, 0, 0, 5)
  298. End If
  299. End If
  300. RamTextRight = Right
  301. End Sub
  302. ''' <summary>
  303. ''' 获取当前设置的 RAM 值。单位为 GB。
  304. ''' </summary>
  305. Public Shared Function GetRam(Instance As McInstance, UseVersionJavaSetup As Boolean, Optional Is32BitJava As Boolean? = Nothing) As Double
  306. '------------------------------------------
  307. ' 修改下方代码时需要一并修改 PageInstanceSetup
  308. '------------------------------------------
  309. Dim RamGive As Double
  310. If Setup.Get("LaunchRamType") = 0 Then
  311. '自动配置
  312. Dim RamAvailable As Double = Math.Round(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024 / 1024 * 10) / 10
  313. '确定需求的内存值
  314. Dim RamMininum As Double '无论如何也需要保证的最低限度内存
  315. Dim RamTarget1 As Double '估计能勉强带动了的内存
  316. Dim RamTarget2 As Double '估计没啥问题了的内存
  317. Dim RamTarget3 As Double '放一百万个材质和 Mod 和光影需要的内存
  318. If Instance IsNot Nothing AndAlso Not Instance.IsLoaded Then Instance.Load()
  319. If Instance IsNot Nothing AndAlso Instance.Modable Then
  320. '可安装 Mod 的版本
  321. Dim ModDir As New DirectoryInfo(Instance.PathIndie & "mods\")
  322. Dim ModCount As Integer = If(ModDir.Exists, ModDir.GetFiles.Length, 0)
  323. RamMininum = 0.5 + ModCount / 150
  324. RamTarget1 = 1.5 + ModCount / 90
  325. RamTarget2 = 2.7 + ModCount / 50
  326. RamTarget3 = 4.5 + ModCount / 25
  327. ElseIf Instance IsNot Nothing AndAlso Instance.Version.HasOptiFine Then
  328. 'OptiFine 版本
  329. RamMininum = 0.5
  330. RamTarget1 = 1.5
  331. RamTarget2 = 3
  332. RamTarget3 = 5
  333. Else
  334. '普通版本
  335. RamMininum = 0.5
  336. RamTarget1 = 1.5
  337. RamTarget2 = 2.5
  338. RamTarget3 = 4
  339. End If
  340. Dim RamDelta As Double
  341. '预分配内存,阶段一,0 ~ T1,100%
  342. RamDelta = RamTarget1
  343. RamGive += Math.Min(RamAvailable, RamDelta)
  344. RamAvailable -= RamDelta
  345. If RamAvailable < 0.1 Then GoTo PreFin
  346. '预分配内存,阶段二,T1 ~ T2,70%
  347. RamDelta = RamTarget2 - RamTarget1
  348. RamGive += Math.Min(RamAvailable * 0.7, RamDelta)
  349. RamAvailable -= RamDelta / 0.7
  350. If RamAvailable < 0.1 Then GoTo PreFin
  351. '预分配内存,阶段三,T2 ~ T3,40%
  352. RamDelta = RamTarget3 - RamTarget2
  353. RamGive += Math.Min(RamAvailable * 0.4, RamDelta)
  354. RamAvailable -= RamDelta / 0.4
  355. If RamAvailable < 0.1 Then GoTo PreFin
  356. '预分配内存,阶段四,T3 ~ T3 * 2,15%
  357. RamDelta = RamTarget3
  358. RamGive += Math.Min(RamAvailable * 0.15, RamDelta)
  359. RamAvailable -= RamDelta / 0.15
  360. If RamAvailable < 0.1 Then GoTo PreFin
  361. PreFin:
  362. '不低于最低值
  363. RamGive = Math.Round(Math.Max(RamGive, RamMininum), 1)
  364. Else
  365. '手动配置
  366. Dim Value As Integer = Setup.Get("LaunchRamCustom")
  367. If Value <= 12 Then
  368. RamGive = Value * 0.1 + 0.3
  369. ElseIf Value <= 25 Then
  370. RamGive = (Value - 12) * 0.5 + 1.5
  371. ElseIf Value <= 33 Then
  372. RamGive = (Value - 25) * 1 + 8
  373. Else
  374. RamGive = (Value - 33) * 2 + 16
  375. End If
  376. End If
  377. '若使用 32 位 Java,则限制为 1G
  378. If If(Is32BitJava, Not JavaIs64Bit(If(UseVersionJavaSetup, Instance, Nothing))) Then RamGive = Math.Min(1, RamGive)
  379. Return RamGive
  380. End Function
  381. #End Region
  382. #Region "Java 选择"
  383. '刷新 Java 下拉框显示
  384. Public Sub RefreshJavaComboBox()
  385. If ComboArgumentJava Is Nothing Then Return
  386. '初始化列表
  387. ComboArgumentJava.Items.Clear()
  388. ComboArgumentJava.Items.Add(New MyComboBoxItem With {.Content = "自动选择合适的 Java", .Tag = "自动选择"})
  389. '更新列表
  390. Dim SelectedItem As MyComboBoxItem = Nothing
  391. Dim SelectedBySetup As String = Setup.Get("LaunchArgumentJavaSelect")
  392. Try
  393. For Each Java In JavaList.Clone().OrderByDescending(Function(v) v.MajorVersion)
  394. Dim ListItem = New MyComboBoxItem With {.Content = Java.ToString, .ToolTip = Java.PathFolder, .Tag = Java}
  395. ToolTipService.SetHorizontalOffset(ListItem, 400)
  396. ComboArgumentJava.Items.Add(ListItem)
  397. '判断人为选中
  398. If SelectedBySetup = "" Then Continue For
  399. If JavaEntry.FromJson(GetJson(SelectedBySetup)).PathFolder = Java.PathFolder Then SelectedItem = ListItem
  400. Next
  401. Catch ex As Exception
  402. Setup.Set("LaunchArgumentJavaSelect", "")
  403. Log(ex, "更新设置 Java 下拉框失败", LogLevel.Feedback)
  404. End Try
  405. '更新选择项
  406. If SelectedItem Is Nothing AndAlso JavaList.Any Then SelectedItem = ComboArgumentJava.Items(0) '选中 “自动选择”
  407. ComboArgumentJava.SelectedItem = SelectedItem
  408. '结束处理
  409. If SelectedItem Is Nothing Then
  410. ComboArgumentJava.Items.Clear()
  411. ComboArgumentJava.Items.Add(New ComboBoxItem With {.Content = "未找到可用的 Java", .IsSelected = True})
  412. End If
  413. RefreshRam(True)
  414. End Sub
  415. '阻止在特定情况下展开下拉框
  416. Private Sub ComboArgumentJava_DropDownOpened(sender As Object, e As EventArgs) Handles ComboArgumentJava.DropDownOpened
  417. If ComboArgumentJava.SelectedItem Is Nothing OrElse ComboArgumentJava.Items(0).Content = "未找到可用的 Java" OrElse ComboArgumentJava.Items(0).Content = "加载中……" Then
  418. ComboArgumentJava.IsDropDownOpen = False
  419. End If
  420. End Sub
  421. '下拉框选择更改
  422. Private Sub JavaSelectionUpdate() Handles ComboArgumentJava.SelectionChanged
  423. If AniControlEnabled <> 0 Then Return
  424. 'Java 不可用时也不清空,会导致刷新时找不到对象
  425. If ComboArgumentJava.SelectedItem Is Nothing OrElse ComboArgumentJava.SelectedItem.Tag Is Nothing Then Return
  426. '设置新的 Java
  427. Dim SelectedJava = ComboArgumentJava.SelectedItem.Tag
  428. If "自动选择".Equals(SelectedJava) Then
  429. '选择 “自动”
  430. Setup.Set("LaunchArgumentJavaSelect", "")
  431. Log("[Java] 修改 Java 选择设置:自动选择")
  432. Else
  433. '选择指定项
  434. Setup.Set("LaunchArgumentJavaSelect", CType(SelectedJava.ToJson(), JObject).ToString(Newtonsoft.Json.Formatting.None))
  435. Log("[Java] 修改 Java 选择设置:" & SelectedJava.ToString)
  436. End If
  437. RefreshRam(True)
  438. End Sub
  439. '手动选择
  440. Private Sub BtnArgumentJavaSelect_Click(sender As Object, e As EventArgs) Handles BtnArgumentJavaSelect.Click
  441. If JavaSearchLoader.State = LoadState.Loading Then
  442. Hint("正在搜索 Java,请稍候!", HintType.Red)
  443. Return
  444. End If
  445. '选择 Java
  446. Dim JavaSelected As String = SelectFile("javaw.exe|javaw.exe", "选择 bin 文件夹中的 javaw.exe 文件")
  447. If JavaSelected = "" Then Return
  448. JavaSelected = GetPathFromFullPath(JavaSelected)
  449. Try
  450. '验证 Java 可用
  451. Dim NewEntry As New JavaEntry(JavaSelected, True)
  452. NewEntry.Check()
  453. '加入列表
  454. Dim JavaNewList As New JArray From {NewEntry.ToJson}
  455. For Each JsonEntry In GetJson(Setup.Get("LaunchArgumentJavaAll"))
  456. Dim Entry = JavaEntry.FromJson(JsonEntry)
  457. If Entry.PathFolder = NewEntry.PathFolder Then Continue For
  458. JavaNewList.Add(JsonEntry)
  459. Next
  460. Setup.Set("LaunchArgumentJavaAll", JavaNewList.ToString(Newtonsoft.Json.Formatting.None))
  461. '重新加载列表
  462. JavaSearchLoader.Start(IsForceRestart:=True)
  463. Hint("已将该 Java 加入 Java 列表!", HintType.Green)
  464. Catch ex As Exception
  465. Log(ex, "该 Java 存在异常,无法使用", LogLevel.Msgbox, "异常的 Java")
  466. Return
  467. End Try
  468. End Sub
  469. '自动查找
  470. Private Sub BtnArgumentJavaSearch_Click(sender As Object, e As EventArgs) Handles BtnArgumentJavaSearch.Click
  471. If JavaSearchLoader.State = LoadState.Loading Then
  472. Hint("正在搜索 Java,请稍候!", HintType.Red)
  473. Return
  474. End If
  475. RunInThread(
  476. Sub()
  477. Hint("正在搜索 Java!")
  478. JavaSearchLoader.WaitForExit(IsForceRestart:=True)
  479. If Not JavaList.Any() Then
  480. Hint("未找到可用的 Java!", HintType.Red)
  481. Else
  482. Hint("已找到 " & JavaList.Count & " 个 Java,请检查下拉框查看列表!", HintType.Green)
  483. End If
  484. End Sub)
  485. End Sub
  486. #End Region
  487. #Region "其他选项"
  488. Private Sub WindowTypeUIRefresh() Handles ComboArgumentWindowType.SelectionChanged
  489. If ComboArgumentWindowType Is Nothing Then Return
  490. If ComboArgumentWindowType.SelectedIndex = 3 AndAlso LabArgumentWindowMiddle IsNot Nothing AndAlso LabArgumentWindowMiddle.Visibility = Visibility.Collapsed Then
  491. LabArgumentWindowMiddle.Visibility = Visibility.Visible
  492. TextArgumentWindowHeight.Visibility = Visibility.Visible
  493. TextArgumentWindowWidth.Visibility = Visibility.Visible
  494. ElseIf ComboArgumentWindowType.SelectedIndex <> 3 AndAlso LabArgumentWindowMiddle IsNot Nothing AndAlso LabArgumentWindowMiddle.Visibility = Visibility.Visible Then
  495. LabArgumentWindowMiddle.Visibility = Visibility.Collapsed
  496. TextArgumentWindowHeight.Visibility = Visibility.Collapsed
  497. TextArgumentWindowWidth.Visibility = Visibility.Collapsed
  498. End If
  499. End Sub
  500. '可见性选择直接关闭的警告
  501. Private Sub ComboArgumentVisibie_SizeChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboArgumentVisibie.SelectionChanged
  502. If AniControlEnabled <> 0 Then Return
  503. If ComboArgumentVisibie.SelectedIndex = 0 Then
  504. If MyMsgBox("若在游戏启动后立即关闭启动器,崩溃检测、更改游戏标题等功能将失效。" & vbCrLf &
  505. "如果想保留这些功能,可以选择让启动器在游戏启动后隐藏,游戏退出后自动关闭。", "提醒", "继续", "取消") = 2 Then
  506. ComboArgumentVisibie.SelectedItem = e.RemovedItems(0)
  507. End If
  508. End If
  509. End Sub
  510. '开启自动内存优化的警告
  511. Private Sub CheckArgumentRam_Change() Handles CheckArgumentRam.Change
  512. If AniControlEnabled <> 0 Then Return
  513. If Not CheckArgumentRam.Checked Then Return
  514. If MyMsgBox("内存优化会显著延长启动耗时,建议仅在内存不足时开启。" & vbCrLf &
  515. "如果你在使用机械硬盘,这还可能导致一小段时间的严重卡顿。" &
  516. If(IsAdmin(), "", $"{vbCrLf}{vbCrLf}每次启动游戏,PCL 都需要申请管理员权限以进行内存优化。{vbCrLf}若想自动授予权限,可以右键 PCL,打开 属性 → 兼容性 → 以管理员身份运行此程序。"),
  517. "提醒", "确定", "取消") = 2 Then
  518. CheckArgumentRam.Checked = False
  519. End If
  520. End Sub
  521. '版本隔离提示
  522. Private Sub ComboArgumentIndie_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboArgumentIndieV2.SelectionChanged
  523. If AniControlEnabled <> 0 Then Return
  524. MyMsgBox("本设置仅会对之后新安装的版本生效。" & vbCrLf & "如果要修改已安装的版本的隔离方式,请在它的版本独立设置中调整。")
  525. End Sub
  526. #End Region
  527. #Region "高级设置"
  528. Private Sub TextAdvanceRun_TextChanged(sender As Object, e As TextChangedEventArgs) Handles TextAdvanceRun.TextChanged
  529. CheckAdvanceRunWait.Visibility = If(TextAdvanceRun.Text = "", Visibility.Collapsed, Visibility.Visible)
  530. End Sub
  531. 'JVM 参数重设
  532. Private Sub TextAdvanceJvm_TextChanged() Handles TextAdvanceJvm.ValidatedTextChanged
  533. BtnAdvanceJvmReset.Visibility = If(TextAdvanceJvm.Text = Setup.GetDefault("LaunchAdvanceJvm"), Visibility.Hidden, Visibility.Visible)
  534. End Sub
  535. Private Sub BtnAdvanceJvmReset_Click(sender As Object, e As EventArgs) Handles BtnAdvanceJvmReset.Click
  536. Setup.Reset("LaunchAdvanceJvm")
  537. Reload()
  538. End Sub
  539. #End Region
  540. '切换到版本独立设置
  541. Private Sub BtnSwitch_Click(sender As Object, e As MouseButtonEventArgs) Handles BtnSwitch.Click
  542. McInstanceSelected.Load()
  543. PageInstanceLeft.Instance = McInstanceSelected
  544. FrmMain.PageChange(FormMain.PageType.InstanceSetup, FormMain.PageSubType.InstanceSetup)
  545. End Sub
  546. '去除参数中的回车
  547. Private Sub ReplaceEnter(sender As MyTextBox, e As TextChangedEventArgs) Handles TextAdvanceJvm.TextChanged, TextAdvanceGame.TextChanged
  548. Dim NewText = sender.Text.Replace(vbCrLf, vbCr).Replace(vbLf, vbCr).Replace(vbCr, " ")
  549. If NewText = sender.Text Then Return
  550. Dim CaretIndex = sender.CaretIndex
  551. sender.Text = NewText
  552. sender.CaretIndex = Math.Max(0, CaretIndex - 1)
  553. End Sub
  554. End Class