Process Core Optimizer to jeden z moich większych hobbystycznych projektów programistycznych. Powstał z zainteresowania wydajnością komputerów, działaniem harmonogramu Windows oraz wpływem przypisania procesów do konkretnych rdzeni procesora.
Nie chciałem tworzyć kolejnego programu, który obiecuje magiczny wzrost FPS po kliknięciu jednego przycisku. Zależało mi na narzędziu pokazującym użytkownikowi, co dokładnie robi, pozwalającym samodzielnie wybrać ustawienia i niewprowadzającym ukrytych zmian w systemie.
Projekt zaczął się jako stosunkowo prosta aplikacja do zmiany priorytetu i koligacji procesów. Z czasem rozrósł się o Windows CPU Sets, automatyczne profile, rozpoznawanie topologii procesora, monitorowanie procesów oraz podstawową telemetrię sprzętu.
Skąd wziął się pomysł?
Windows pozwala zmienić priorytet oraz koligację procesu z poziomu Menedżera zadań. Jest to jednak rozwiązanie tymczasowe i mało wygodne.
Po ponownym uruchomieniu gry albo programu ustawienia zazwyczaj trzeba stosować od nowa. Sam Menedżer zadań nie ułatwia również zrozumienia, które procesory logiczne odpowiadają fizycznym rdzeniom, wątkom SMT lub Hyper-Threading oraz rdzeniom Performance i Efficiency.
Chciałem stworzyć program, który:
- wyświetla działające procesy w jednym miejscu,
- pozwala ustawić ich priorytet,
- umożliwia wybór konkretnych procesorów logicznych,
- obsługuje zarówno CPU Affinity, jak i Windows CPU Sets,
- zapisuje ustawienia jako profile,
- automatycznie stosuje profil po uruchomieniu procesu,
- nie wykonuje ukrytych „optymalizacji” systemu.
Tak powstał Process Core Optimizer.
Co potrafi program?
Obecna wersja Process Core Optimizer skupia się na zarządzaniu ustawieniami procesów w Windows.
| Funkcja | Zastosowanie |
|---|---|
| Priorytet procesu | Zmiana priorytetu od Idle do High |
| CPU Affinity | Ścisłe ograniczenie procesu do wybranych procesorów logicznych |
| Windows CPU Sets | Wskazanie preferowanego zestawu procesorów dla procesu |
| Profile procesów | Zapisywanie ustawień dla określonego programu |
| Automatyczne stosowanie | Ponowne ustawienie profilu po uruchomieniu procesu |
| Obsługa P-core i E-core | Rozpoznawanie typów rdzeni w procesorach hybrydowych |
| Obsługa SMT i HT | Odróżnianie rdzeni fizycznych od dodatkowych wątków |
| Telemetria | Podgląd informacji o procesorze, karcie graficznej i pamięci RAM |
| Logowanie | Zapisywanie informacji diagnostycznych i błędów |
Program został napisany w C# i WPF, a dane użytkownika są przechowywane w katalogu:
%APPDATA%\ProcessCoreOptimizer
Znajdują się tam między innymi ustawienia, zapisane profile oraz logi aplikacji.
Lista procesów i ręczna konfiguracja
Główny widok programu pokazuje działające procesy oraz podstawowe informacje o ich wykorzystaniu zasobów.

Po wybraniu procesu można ustawić:
- tryb CPU Affinity albo CPU Sets,
- wybrane procesory logiczne,
- priorytet procesu,
- automatyczne stosowanie ustawień w przyszłości.
Nie każdy proces pozwala na zmianę wszystkich parametrów. Procesy systemowe, chronione aplikacje i niektóre gry mogą odmówić dostępu albo wymagać uruchomienia programu jako administrator.
CPU Affinity — twarde przypisanie rdzeni
CPU Affinity to klasyczny mechanizm Windows pozwalający określić, na których procesorach logicznych może wykonywać się dany proces.
Przykładowo proces można ograniczyć do logicznych procesorów 2, 4, 6 i 8. Po zastosowaniu takiej maski harmonogram systemu nie powinien uruchamiać wątków procesu na pozostałych procesorach logicznych.
Daje to dużą kontrolę, ale może też być zbyt restrykcyjne. Przypisanie zbyt małej liczby rdzeni może pogorszyć wydajność albo powodować niestabilne czasy renderowania klatek.
CPU Affinity nie należy więc traktować jako ustawienia, które automatycznie zwiększa wydajność każdego programu.
Windows CPU Sets — łagodniejsza alternatywa
Drugim obsługiwanym mechanizmem są Windows CPU Sets.
CPU Sets pozwalają wskazać preferowany zestaw procesorów logicznych bez stosowania klasycznej, sztywnej maski Affinity. System zachowuje większą kontrolę nad harmonogramem, ale otrzymuje informację, gdzie powinien w pierwszej kolejności wykonywać wątki procesu.
W przypadku współczesnego Windowsa CPU Sets mogą być rozsądniejszym punktem wyjścia niż twarde ograniczanie procesu przez Affinity.
Nadal nie oznacza to gwarantowanego wzrostu FPS. W wielu programach najlepszym rozwiązaniem pozostaje pozostawienie wszystkich rdzeni i zaufanie domyślnemu harmonogramowi Windows.
Profile procesów
Jedną z najważniejszych funkcji programu są zapisane profile.
Profil przechowuje między innymi:
- nazwę procesu,
- wybrany tryb optymalizacji,
- przypisane procesory logiczne,
- ustawiony priorytet,
- informację o automatycznym monitorowaniu.

Po zapisaniu profilu nie trzeba za każdym razem otwierać Menedżera zadań i ponownie ustawiać tych samych wartości.
Program może wykryć uruchomienie przypisanego procesu i automatycznie zastosować zapisane ustawienia.
Lekki watcher działający w tle
We wcześniejszych etapach rozwoju programu jednym z problemów było regularne skanowanie całej listy procesów.
Działało to, ale nie było najlepszym rozwiązaniem dla aplikacji, która sama miała być lekka i niepotrzebnie nie obciążać komputera.
W wersji 1.3.0 rozdzieliłem pełne skanowanie procesów widocznych w interfejsie od obserwowania zapisanych profili.
Pełna lista procesów jest odświeżana przede wszystkim wtedy, gdy użytkownik rzeczywiście korzysta z odpowiedniej zakładki. Watcher działający w tle sprawdza natomiast tylko procesy posiadające aktywne profile.
Był to jeden z ważniejszych etapów porządkowania projektu. Zamiast dodawać kolejne funkcje, zacząłem skupiać się na architekturze, przewidywalności i ograniczaniu niepotrzebnej pracy wykonywanej w tle.
Procesory hybrydowe, P-core i E-core
Współczesne procesory nie zawsze składają się z identycznych rdzeni.
W części procesorów Intela występują:
- rdzenie Performance, czyli P-core,
- rdzenie Efficiency, czyli E-core,
- dodatkowe wątki Hyper-Threading.
Procesory AMD mogą natomiast udostępniać dwa wątki SMT na jednym rdzeniu fizycznym.
Process Core Optimizer wykorzystuje informacje udostępniane przez Windows CPU Sets, żeby tam, gdzie jest to możliwe, rozpoznać topologię procesora i odpowiednio opisać procesory logiczne.
Program udostępnia również szybkie opcje pozwalające:
- zaznaczyć wszystkie procesory,
- wyczyścić zaznaczenie,
- wyłączyć dodatkowe wątki SMT lub Hyper-Threading,
- wyłączyć rdzenie E-core.
Nie oznacza to, że wyłączenie SMT, HT albo E-core zawsze poprawi wydajność. Efekt zależy od konkretnego procesora, gry, aplikacji i liczby programów działających w tle.
Monitorowanie sprzętu
Do programu dodałem również podstawowy moduł telemetrii oparty na LibreHardwareMonitor.

Pozwala on podejrzeć wybrane informacje o:
- procesorze,
- karcie graficznej,
- wykorzystaniu pamięci RAM,
- dostępnych czujnikach sprzętowych.
W nowszej wersji telemetria jest inicjalizowana dopiero po otwarciu zakładki sprzętowej. Program nie musi dzięki temu stale odpytywać czujników, gdy użytkownik korzysta wyłącznie z zarządzania procesami.
Domyślnie ograniczyłem również odpytywanie czujników dysków, ponieważ nie było potrzebne do podstawowego działania aplikacji.
Funkcje, które celowo ograniczyłem
Podczas rozwijania programu część pierwotnych pomysłów została zmieniona albo całkowicie usunięta.
Usunięcie trybu Exclusive
Jedna ze starszych wersji posiadała tryb Exclusive. Jego zadaniem było odsuwanie innych procesów od rdzeni wybranych dla docelowej aplikacji.
Teoretycznie dawało to większą kontrolę nad zasobami. W praktyce program zaczynał ingerować również w procesy, których użytkownik bezpośrednio nie wybrał.
Zwiększało to ryzyko problemów ze stabilnością, a możliwe korzyści wydajnościowe nie były tego warte.
Tryb Exclusive został więc usunięty, a starsze profile korzystające z tej opcji są przekształcane do zwykłego Affinity.
Ukrycie priorytetu RealTime
Priorytet RealTime brzmi jak najlepsze możliwe ustawienie, ale w praktyce może powodować poważne problemy.
Proces z takim priorytetem może utrudnić działanie podstawowych usług systemowych, obsługi myszy, klawiatury albo interfejsu Windows.
Dlatego RealTime jest domyślnie ukryty i musi zostać świadomie włączony w ustawieniach zaawansowanych.
Bezpieczniejsze zapisywanie profili
Profile i ustawienia programu są przechowywane w plikach JSON.
W nowszej wersji dodałem zapis atomowy oraz pliki tymczasowe i zapasowe. Ma to zmniejszyć ryzyko uszkodzenia danych, gdy aplikacja zostanie zamknięta podczas zapisu albo system niespodziewanie przerwie działanie programu.
Dodałem również:
- rotację dużych logów,
- ochronę przed uruchomieniem kilku instancji programu,
- bezpieczniejszą obsługę argumentów startowych,
- oddzielne serwisy odpowiedzialne za skanowanie, optymalizację i aktualizacje.
Czego nauczył mnie ten projekt?
Process Core Optimizer był dla mnie czymś więcej niż prostym ćwiczeniem w tworzeniu interfejsu WPF.
Podczas pracy nad nim rozwijałem między innymi:
- programowanie w C#,
- tworzenie aplikacji desktopowych w WPF,
- komunikację z funkcjami Windows,
- pracę z procesami i uprawnieniami,
- analizowanie topologii procesora,
- zapisywanie konfiguracji użytkownika,
- obsługę błędów i logowanie,
- przygotowywanie instalatora,
- publikowanie wersji programu na GitHubie,
- utrzymywanie dokumentacji i changelogu.
Najważniejsza zmiana dotyczyła jednak samego podejścia do projektowania.
Na początku najważniejsze było dla mnie dodawanie kolejnych możliwości. Później zacząłem częściej zadawać sobie pytanie:
Czy ta funkcja jest bezpieczna, przewidywalna i czy użytkownik rozumie, co program rzeczywiście zmienia?
To podejście stało się później jednym z fundamentów kolejnego projektu.
Dlaczego powstał FrameHub?
Po wersji 1.3.0 uznałem Process Core Optimizer za stabilną bazę do zarządzania procesami.
Jednocześnie miałem coraz więcej pomysłów, które przestawały pasować do programu skupionego wyłącznie na rdzeniach CPU i priorytetach.
Chciałem dodać między innymi:
- bibliotekę gier i aplikacji,
- wykrywanie instalacji Steam i Epic Games,
- powiązanie profili bezpośrednio z grami,
- konfigurację ustawień konkretnych tytułów,
- bezpieczne kopie plików konfiguracyjnych,
- bardziej rozbudowany interfejs,
- kolejne moduły związane z wydajnością Windows.
Zamiast dalej rozbudowywać jedno wyspecjalizowane narzędzie, rozpocząłem nowy projekt — FrameHub.
FrameHub przejął najważniejsze doświadczenia i część podstawowej logiki Process Core Optimizer, ale rozwija je jako większy hub do zarządzania grami, aplikacjami i wydajnością systemu.
Process Core Optimizer nadal pozostaje dostępny jako mniejsze, samodzielne narzędzie.
Czy przypisanie rdzeni zwiększa FPS?
Nie ma jednej odpowiedzi działającej dla każdego komputera.
Zmiana CPU Affinity, CPU Sets lub priorytetu może pomóc w określonych konfiguracjach, ale może też:
- nie przynieść żadnej różnicy,
- pogorszyć średni FPS,
- pogorszyć wartości 1% low,
- zwiększyć przycięcia,
- ograniczyć możliwości harmonogramu Windows.
Dlatego najlepszym sposobem jest wykonanie powtarzalnego testu przed zmianą i po zmianie.
Process Core Optimizer daje narzędzia do przeprowadzenia takiego eksperymentu, ale nie obiecuje automatycznego wzrostu wydajności.
Pobieranie i kod źródłowy
Process Core Optimizer jest projektem open source dostępnym na licencji MIT.
Program jest przeznaczony dla systemu Windows. W przypadku zmieniania ustawień gier korzystających z systemów anti-cheat należy pamiętać, że zgodność z każdym zabezpieczeniem nie może być zagwarantowana.
Process Core Optimizer nie próbuje omijać systemów anti-cheat ani modyfikować pamięci gier.