update Cpu Affinity

This commit is contained in:
xkeyC 2023-11-21 01:05:20 +08:00
parent 5ecfc82506
commit faec463478
8 changed files with 99 additions and 13 deletions

View File

@ -201,4 +201,17 @@ foreach ($adapter in $adapterMemory) {
} catch (_) {} } catch (_) {}
return totalSize; return totalSize;
} }
static Future<int> getNumberOfLogicalProcessors() async {
final cpuNumberResult = await Process.run(powershellPath,
["(Get-WmiObject -Class Win32_Processor).NumberOfLogicalProcessors"]);
if (cpuNumberResult.exitCode != 0) return 0;
return int.tryParse(cpuNumberResult.stdout.toString().trim()) ?? 0;
}
static Future<int?> getCpuAffinity(int eCoreCount) async {
final cpuNumber = await getNumberOfLogicalProcessors();
if (cpuNumber == 0) return null;
return (1 << cpuNumber) - (1 << eCoreCount);
}
} }

View File

@ -3,6 +3,8 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'dart:ui' as ui; import 'dart:ui' as ui;
import 'package:flutter/services.dart';
void dPrint(src) { void dPrint(src) {
if (kDebugMode) { if (kDebugMode) {
print(src); print(src);
@ -58,6 +60,38 @@ Future<bool> showConfirmDialogs(
return r == true; return r == true;
} }
Future<String?> showInputDialogs(BuildContext context,
{required String title,
required String content,
BoxConstraints? constraints,
String? initialValue,
List<TextInputFormatter>? inputFormatters}) async {
String? userInput;
constraints ??=
BoxConstraints(maxWidth: MediaQuery.of(context).size.width * .38);
final ok = await showConfirmDialogs(
context,
title,
Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (content.isNotEmpty) Text(content),
const SizedBox(height: 6),
TextFormBox(
initialValue: initialValue,
onChanged: (str) {
userInput = str;
},
inputFormatters: inputFormatters,
),
],
),
constraints: constraints);
if (ok == true) return userInput;
return null;
}
Future showBaseDialog(BuildContext context, Future showBaseDialog(BuildContext context,
{required String title, {required String title,
required Widget content, required Widget content,

View File

@ -134,8 +134,7 @@ class HomeUIModel extends BaseUIModel {
return; return;
} }
scInstallPaths = await SCLoggerHelper.getGameInstallPath(listData, scInstallPaths = await SCLoggerHelper.getGameInstallPath(listData,
withVersion: ["LIVE", "PTU", "EPTU", "TECH-PREVIEW"], withVersion: ["LIVE", "PTU", "EPTU"], checkExists: true);
checkExists: true);
if (scInstallPaths.isNotEmpty) { if (scInstallPaths.isNotEmpty) {
scInstalledPath = scInstallPaths.first; scInstalledPath = scInstallPaths.first;
} }

View File

@ -49,7 +49,7 @@ class LoginDialog extends BaseUI<LoginDialogModel> {
color: Colors.white.withOpacity(.6), color: Colors.white.withOpacity(.6),
), ),
) )
] else if (model.loginStatus == 2) ...[ ] else if (model.loginStatus == 2 || model.loginStatus == 3) ...[
Center( Center(
child: Column( child: Column(
children: [ children: [
@ -76,7 +76,9 @@ class LoginDialog extends BaseUI<LoginDialogModel> {
fontSize: 24, fontWeight: FontWeight.bold), fontSize: 24, fontWeight: FontWeight.bold),
), ),
const SizedBox(height: 32), const SizedBox(height: 32),
const Text("正在为您启动游戏..."), Text(model.loginStatus == 2
? "正在为您启动游戏..."
: "正在等待优化CPU参数..."),
const SizedBox(height: 12), const SizedBox(height: 12),
const ProgressRing(), const ProgressRing(),
], ],

View File

@ -7,6 +7,7 @@ import 'package:hive/hive.dart';
import 'package:jwt_decode/jwt_decode.dart'; import 'package:jwt_decode/jwt_decode.dart';
import 'package:local_auth/local_auth.dart'; import 'package:local_auth/local_auth.dart';
import 'package:starcitizen_doctor/base/ui_model.dart'; import 'package:starcitizen_doctor/base/ui_model.dart';
import 'package:starcitizen_doctor/common/helper/system_helper.dart';
import 'package:starcitizen_doctor/common/win32/credentials.dart'; import 'package:starcitizen_doctor/common/win32/credentials.dart';
import 'package:starcitizen_doctor/ui/home/home_ui_model.dart'; import 'package:starcitizen_doctor/ui/home/home_ui_model.dart';
import 'package:starcitizen_doctor/ui/home/webview/webview.dart'; import 'package:starcitizen_doctor/ui/home/webview/webview.dart';
@ -217,12 +218,21 @@ class LoginDialogModel extends BaseUIModel {
await launchFile.writeAsString(json.encode(launchData)); await launchFile.writeAsString(json.encode(launchData));
notifyListeners(); notifyListeners();
await Future.delayed(const Duration(seconds: 1)); await Future.delayed(const Duration(seconds: 1));
await Future.delayed(const Duration(seconds: 3));
final confBox = await Hive.openBox("app_conf");
final inputGameLaunchECore = int.tryParse(
confBox.get("gameLaunch_eCore_count", defaultValue: "0")) ??
0;
final processorAffinity =
await SystemHelper.getCpuAffinity(inputGameLaunchECore);
// TODO
homeUIModel.doLaunchGame( homeUIModel.doLaunchGame(
'$installPath\\$executable', '$installPath\\$executable',
["-no_login_dialog", ...launchOptions.toString().split(" ")], ["-no_login_dialog", ...launchOptions.toString().split(" ")],
installPath); installPath);
await Future.delayed(const Duration(seconds: 3));
Navigator.pop(context!);
} }
String getChannelID() { String getChannelID() {
@ -232,8 +242,6 @@ class LoginDialogModel extends BaseUIModel {
return "PTU"; return "PTU";
} else if (installPath.endsWith("\\EPTU")) { } else if (installPath.endsWith("\\EPTU")) {
return "EPTU"; return "EPTU";
} else if (installPath.endsWith("\\TECH-PREVIEW")) {
return "TECH-PREVIEW";
} }
return "LIVE"; return "LIVE";
} }

View File

@ -1,3 +1,4 @@
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:starcitizen_doctor/base/ui.dart'; import 'package:starcitizen_doctor/base/ui.dart';
import 'package:starcitizen_doctor/common/conf.dart'; import 'package:starcitizen_doctor/common/conf.dart';
import 'package:starcitizen_doctor/ui/settings/settings_ui_model.dart'; import 'package:starcitizen_doctor/ui/settings/settings_ui_model.dart';
@ -11,12 +12,18 @@ class SettingUI extends BaseUI<SettingUIModel> {
margin: const EdgeInsets.all(16), margin: const EdgeInsets.all(16),
child: Column( child: Column(
children: [ children: [
if (AppConf.isMSE) if (AppConf.isMSE) ...[
makeSettingsItem(const Icon(FluentIcons.reset_device), "重置自动密码填充", makeSettingsItem(const Icon(FluentIcons.reset_device), "重置自动密码填充",
subTitle: subTitle:
"启用:${model.isEnableAutoLogin ? "已启用" : "已禁用"} 设备支持:${model.isDeviceSupportWinHello ? "支持" : "不支持"} 邮箱:${model.autoLoginEmail} 密码:${model.isEnableAutoLoginPwd ? "已加密保存" : "未保存"}", "启用:${model.isEnableAutoLogin ? "已启用" : "已禁用"} 设备支持:${model.isDeviceSupportWinHello ? "支持" : "不支持"} 邮箱:${model.autoLoginEmail} 密码:${model.isEnableAutoLoginPwd ? "已加密保存" : "未保存"}",
onTap: model.onResetAutoLogin) onTap: model.onResetAutoLogin),
else const SizedBox(height: 12),
makeSettingsItem(const Icon(FontAwesomeIcons.microchip),
"启动游戏时忽略能效核心( 适用于Intel 12 ~ 14th处理器 ",
subTitle:
"已设置的核心数量:${model.inputGameLaunchECore} 设置需要忽略的处理器的能效心数量盒子将在使用启动游戏功能时为您修改游戏所运行的CPU参数当为 0 时不启用此功能 ",
onTap: model.setGameLaunchECore),
] else
const Text("暂无设置项"), const Text("暂无设置项"),
], ],
), ),

View File

@ -1,3 +1,4 @@
import 'package:flutter/services.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:local_auth/local_auth.dart'; import 'package:local_auth/local_auth.dart';
import 'package:starcitizen_doctor/base/ui_model.dart'; import 'package:starcitizen_doctor/base/ui_model.dart';
@ -10,6 +11,7 @@ class SettingUIModel extends BaseUIModel {
String autoLoginEmail = "-"; String autoLoginEmail = "-";
bool isEnableAutoLogin = false; bool isEnableAutoLogin = false;
bool isEnableAutoLoginPwd = false; bool isEnableAutoLoginPwd = false;
String inputGameLaunchECore = "0";
@override @override
loadData() async { loadData() async {
@ -18,6 +20,7 @@ class SettingUIModel extends BaseUIModel {
notifyListeners(); notifyListeners();
if (AppConf.isMSE) { if (AppConf.isMSE) {
_updateAutoLoginAccount(); _updateAutoLoginAccount();
_updateGameLaunchECore();
} }
} }
@ -41,4 +44,25 @@ class SettingUIModel extends BaseUIModel {
userBox.get("account_pwd_encrypted", defaultValue: "") != ""; userBox.get("account_pwd_encrypted", defaultValue: "") != "";
notifyListeners(); notifyListeners();
} }
Future<void> setGameLaunchECore() async {
final userBox = await Hive.openBox("app_conf");
final defaultInput =
userBox.get("gameLaunch_eCore_count", defaultValue: "0");
final input = await showInputDialogs(context!,
title: "请输入要忽略的 CPU 核心数",
content: "",
initialValue: defaultInput,
inputFormatters: [FilteringTextInputFormatter.digitsOnly]);
if (input == null) return;
userBox.put("gameLaunch_eCore_count", input);
reloadData();
}
Future _updateGameLaunchECore() async {
final userBox = await Hive.openBox("app_conf");
inputGameLaunchECore =
userBox.get("gameLaunch_eCore_count", defaultValue: "0");
notifyListeners();
}
} }

View File

@ -186,8 +186,7 @@ class ToolsUIModel extends BaseUIModel {
return; return;
} }
scInstallPaths = await SCLoggerHelper.getGameInstallPath(listData, scInstallPaths = await SCLoggerHelper.getGameInstallPath(listData,
checkExists: false, checkExists: false, withVersion: ["LIVE", "PTU", "EPTU"]);
withVersion: ["LIVE", "PTU", "EPTU", "TECH-PREVIEW"]);
if (scInstallPaths.isNotEmpty) { if (scInstallPaths.isNotEmpty) {
scInstalledPath = scInstallPaths.first; scInstalledPath = scInstallPaths.first;
} }