CPU overhead reduction

This commit is contained in:
2026-04-15 22:39:15 +02:00
parent cd2aa91abc
commit 3327e822c4

View File

@@ -157,10 +157,7 @@ extern "C" __declspec(dllexport) void SetFixEnabled(bool enabled, bool init) {
UltraWideFixEnabled(); UltraWideFixEnabled();
CameraDistanceFixEnabled(); CameraDistanceFixEnabled();
HUDUpdate(true); HUDUpdate(true);
gPendingDOF = true; SetAllEffectsToBeToggled();
gPendingCA = true;
gPendingVignetting = true;
gPendingFog = true;
LogFixToggle(GameFixes::None, g_fix_enabled); LogFixToggle(GameFixes::None, g_fix_enabled);
} }
@@ -219,7 +216,11 @@ static void ProcessEvent() {
PEHook = safetyhook::create_mid(ProcessEventaddress + 0xc, PEHook = safetyhook::create_mid(ProcessEventaddress + 0xc,
[](SafetyHookContext& ctx) { [](SafetyHookContext& ctx) {
ULONGLONG now = GetTickCount64(); ULONGLONG now = GetTickCount64();
if (now - lastScanTick >= DEFAULT_DELAY_BETWEEN_TICK) { // Delay between each tick to avoid ProcessEvent stuttering static UC::int32 NAME_Construct = -1;
static UC::int32 NAME_Destruct = -1;
static UC::int32 NAME_PerceptionTick = -1;
if (now - lastScanTick >= DEFAULT_DELAY_BETWEEN_TICK) { // Delay between each tick to avoid ProcessEvent stuttering
lastScanTick = now; lastScanTick = now;
GetResolution(screenWidth, screenHeight, g_AspectRatio); GetResolution(screenWidth, screenHeight, g_AspectRatio);
} }
@@ -228,113 +229,118 @@ static void ProcessEvent() {
UFunction* func = (UFunction*)ctx.rdx; UFunction* func = (UFunction*)ctx.rdx;
if (!object || !func) return; if (!object || !func) return;
std::string funcName = func->GetName(); UC::int32 comparisonIndex = func->Name.ComparisonIndex; // Make function comparision faster than allocating std::srting
if (NAME_PerceptionTick == -1 && func->Name.ToString() == "OnPerceptionIntensityUpdated")
NAME_PerceptionTick = comparisonIndex;
// Full stealth fix: disable AI perception. // Full stealth fix: disable AI perception.
if (object->IsA(AStyx3AIController::StaticClass()) && funcName == "OnPerceptionIntensityUpdated") { if (NAME_PerceptionTick == comparisonIndex && object->IsA(AStyx3AIController::StaticClass())) {
auto* AIController = static_cast<AStyx3AIController*>(object); auto* AIController = static_cast<AStyx3AIController*>(object);
if (g_Player && AIController->PerceptionGaugeComponent) { if (g_Player && AIController->PerceptionGaugeComponent) {
if (g_Stealth_fix_enabled) { if (g_Stealth_fix_enabled)
AIController->PerceptionGaugeComponent->ResetGauges(g_Player); AIController->PerceptionGaugeComponent->ResetGauges(g_Player);
if (g_Player) g_Player->bIsPerceptible = false; else AIController->PerceptionGaugeComponent->SetActiveBufferDetection(g_Player, true);
}
else { g_Player->bIsPerceptible = !g_Stealth_fix_enabled;
AIController->PerceptionGaugeComponent->SetActiveBufferDetection(g_Player, true);
if (g_Player) g_Player->bIsPerceptible = true;
}
} }
} }
if (object->IsA(UUserWidget::StaticClass()) && (funcName == "Construct" || funcName == "Destruct" || funcName == "Tick")) { if (object->IsA(UUserWidget::StaticClass())) {
std::string objectName = object->GetName(); if (NAME_Construct == -1 && func->Name.ToString() == "Construct") NAME_Construct = func->Name.ComparisonIndex;
if (NAME_Destruct == -1 && func->Name.ToString() == "Destruct") NAME_Destruct = func->Name.ComparisonIndex;
// UI scaling // UI scaling
auto HandleWidget = [&](auto* typedWidget, auto*& gWidgetPtr) { // Lambda to initialize pointers on Construct and nullify them on Destruct if (NAME_Construct == comparisonIndex || NAME_Destruct == comparisonIndex) {
if (funcName == "Construct") { std::string objectName = object->GetName();
gWidgetPtr = typedWidget; // Lambda to initialize pointers on Construct and nullify them on Destruct
HUDUpdate(false); auto HandleWidget = [&](auto* typedWidget, auto*& gWidgetPtr) {
} if (NAME_Construct == comparisonIndex) {
else if (funcName == "Destruct") gWidgetPtr = nullptr; gWidgetPtr = typedWidget;
};
if (object->IsA(UUI_Settings_C::StaticClass()))
HandleWidget(static_cast<UUI_Settings_C*>(object), g_UISettingsWidget);
else if (object->IsA(UUI_Difficulty_C::StaticClass()))
HandleWidget(static_cast<UUI_Difficulty_C*>(object), g_DifficultyWidget);
else if (object->IsA(UUI_InGameMenu_C::StaticClass()))
HandleWidget(static_cast<UUI_InGameMenu_C*>(object), g_InGameMenuWidget);
else if (object->IsA(UUI_PauseMenu_C::StaticClass()))
HandleWidget(static_cast<UUI_PauseMenu_C*>(object), g_PauseWidget);
else if (object->IsA(UUI_Profile_C::StaticClass()))
HandleWidget(static_cast<UUI_Profile_C*>(object), g_ProfileWidget);
else if (object->IsA(UUI_MainMenu_C::StaticClass()))
HandleWidget(static_cast<UUI_MainMenu_C*>(object), g_UIMainMenuWidget);
else if (object->IsA(UUI_Saves_C::StaticClass()))
HandleWidget(static_cast<UUI_Saves_C*>(object), g_SavesWidget);
else if (object->IsA(UUI_Upgrades_C::StaticClass()))
HandleWidget(static_cast<UUI_Upgrades_C*>(object), g_UpgradeWidget);
else if (objectName.rfind("UI_Map_C", 0) == 0)
HandleWidget(static_cast<UUserWidget*>(object), g_MapWidget);
else if (objectName.rfind("UI_GameOver_C", 0) == 0)
HandleWidget(static_cast<UUserWidget*>(object), g_GameOverWidget);
else if (objectName.rfind("UI_Loading_C", 0) == 0)
HandleWidget(static_cast<UUserWidget*>(object), g_LoadingWidget);
else {
std::function<void(SDK::UWidget*)> FindWidgets;
FindWidgets = [&](SDK::UWidget* Widget) { // Find all HUD important widgets in container
if (!Widget) return;
const std::string widgetName = Widget->GetName();
const std::string className = Widget->Class ? Widget->Class->GetName() : "";
auto match = [&](const std::string& pattern) {
return widgetName.find(pattern) != std::string::npos || className.find(pattern) != std::string::npos;
};
if (!g_StatusWidget && match("StatusWidget")) g_StatusWidget = Widget;
else if (!g_GaugesWidget && match("Gauges")) g_GaugesWidget = Widget;
else if (!g_ChangeWheelWidget && match("ChangeWheel")) g_ChangeWheelWidget = Widget;
else if (!g_AbilityWheelWidget && match("AbilityWheel")) g_AbilityWheelWidget = Widget; // g_QuestWidget
else if (!g_QuestWidget && match("Notifications_Missions")) g_QuestWidget = Widget;
else if (!g_LootWidget && match("Notifications_Loot")) g_LootWidget = Widget;
// Stop early if everything found-
if (g_StatusWidget && g_GaugesWidget && g_ChangeWheelWidget && g_AbilityWheelWidget && g_QuestWidget && g_LootWidget)
return;
// Descend Panel children
if (Widget->IsA(SDK::UPanelWidget::StaticClass())) {
auto* Panel = static_cast<SDK::UPanelWidget*>(Widget);
for (int i = 0; i < Panel->GetChildrenCount(); ++i)
FindWidgets(Panel->GetChildAt(i));
}
// Descend UserWidget root
if (Widget->IsA(SDK::UUserWidget::StaticClass())) {
auto* UW = static_cast<SDK::UUserWidget*>(Widget);
if (UW->WidgetTree && UW->WidgetTree->RootWidget)
FindWidgets(UW->WidgetTree->RootWidget);
}
};
if (objectName.rfind("Crafting", 0) == 0) {
if (funcName == "Construct") {
g_CraftingWidget = static_cast<UUserWidget*>(object);
HUDUpdate(false); HUDUpdate(false);
} }
else if (funcName == "Destruct") g_CraftingWidget = nullptr; else if (NAME_Destruct == comparisonIndex) gWidgetPtr = nullptr;
} };
else if (objectName.rfind("HUD_Widget_C", 0) == 0) {
auto* HUDWidget = static_cast<UUserWidget*>(object); if (object->IsA(UUI_Settings_C::StaticClass()))
if (funcName == "Construct") { HandleWidget(static_cast<UUI_Settings_C*>(object), g_UISettingsWidget);
if (HUDWidget && HUDWidget->Class) { else if (object->IsA(UUI_Difficulty_C::StaticClass()))
FindWidgets(HUDWidget->WidgetTree->RootWidget); HandleWidget(static_cast<UUI_Difficulty_C*>(object), g_DifficultyWidget);
else if (object->IsA(UUI_InGameMenu_C::StaticClass()))
HandleWidget(static_cast<UUI_InGameMenu_C*>(object), g_InGameMenuWidget);
else if (object->IsA(UUI_PauseMenu_C::StaticClass()))
HandleWidget(static_cast<UUI_PauseMenu_C*>(object), g_PauseWidget);
else if (object->IsA(UUI_Profile_C::StaticClass()))
HandleWidget(static_cast<UUI_Profile_C*>(object), g_ProfileWidget);
else if (object->IsA(UUI_MainMenu_C::StaticClass()))
HandleWidget(static_cast<UUI_MainMenu_C*>(object), g_UIMainMenuWidget);
else if (object->IsA(UUI_Saves_C::StaticClass()))
HandleWidget(static_cast<UUI_Saves_C*>(object), g_SavesWidget);
else if (object->IsA(UUI_Upgrades_C::StaticClass()))
HandleWidget(static_cast<UUI_Upgrades_C*>(object), g_UpgradeWidget);
else if (objectName.rfind("UI_Map_C", 0) == 0)
HandleWidget(static_cast<UUserWidget*>(object), g_MapWidget);
else if (objectName.rfind("UI_GameOver_C", 0) == 0)
HandleWidget(static_cast<UUserWidget*>(object), g_GameOverWidget);
else if (objectName.rfind("UI_Loading_C", 0) == 0)
HandleWidget(static_cast<UUserWidget*>(object), g_LoadingWidget);
else {
std::function<void(SDK::UWidget*)> FindWidgets;
FindWidgets = [&](SDK::UWidget* Widget) { // Find all HUD important widgets in container
if (!Widget) return;
const std::string widgetName = Widget->GetName();
const std::string className = Widget->Class ? Widget->Class->GetName() : "";
auto match = [&](const std::string& pattern) {
return widgetName.find(pattern) != std::string::npos || className.find(pattern) != std::string::npos;
};
if (!g_StatusWidget && match("StatusWidget")) g_StatusWidget = Widget;
else if (!g_GaugesWidget && match("Gauges")) g_GaugesWidget = Widget;
else if (!g_ChangeWheelWidget && match("ChangeWheel")) g_ChangeWheelWidget = Widget;
else if (!g_AbilityWheelWidget && match("AbilityWheel")) g_AbilityWheelWidget = Widget;
else if (!g_QuestWidget && match("Notifications_Missions")) g_QuestWidget = Widget;
else if (!g_LootWidget && match("Notifications_Loot")) g_LootWidget = Widget;
// Stop early if everything found-
if (g_StatusWidget && g_GaugesWidget && g_ChangeWheelWidget && g_AbilityWheelWidget && g_QuestWidget && g_LootWidget)
return;
// Descend Panel children
if (Widget->IsA(SDK::UPanelWidget::StaticClass())) {
auto* Panel = static_cast<SDK::UPanelWidget*>(Widget);
for (int i = 0; i < Panel->GetChildrenCount(); ++i)
FindWidgets(Panel->GetChildAt(i));
}
// Descend UserWidget root
if (Widget->IsA(SDK::UUserWidget::StaticClass())) {
auto* UW = static_cast<SDK::UUserWidget*>(Widget);
if (UW->WidgetTree && UW->WidgetTree->RootWidget)
FindWidgets(UW->WidgetTree->RootWidget);
}
};
if (objectName.rfind("Crafting", 0) == 0) {
if (NAME_Construct == comparisonIndex) {
g_CraftingWidget = static_cast<UUserWidget*>(object);
HUDUpdate(false); HUDUpdate(false);
} }
else if (NAME_Destruct == comparisonIndex) g_CraftingWidget = nullptr;
} }
else if (funcName == "Destruct") { else if (objectName.rfind("HUD_Widget_C", 0) == 0) {
g_QuestWidget = nullptr; auto* HUDWidget = static_cast<UUserWidget*>(object);
g_LootWidget = nullptr; if (NAME_Construct == comparisonIndex) {
g_StatusWidget = nullptr; if (HUDWidget && HUDWidget->Class) {
g_GaugesWidget = nullptr; FindWidgets(HUDWidget->WidgetTree->RootWidget);
g_ChangeWheelWidget = nullptr; HUDUpdate(false);
g_AbilityWheelWidget = nullptr; }
}
else if (NAME_Destruct == comparisonIndex) {
g_QuestWidget = nullptr;
g_LootWidget = nullptr;
g_StatusWidget = nullptr;
g_GaugesWidget = nullptr;
g_ChangeWheelWidget = nullptr;
g_AbilityWheelWidget = nullptr;
}
} }
} }
} }