Skrypt powstał z potrzeby. Większość z nas używa pewnie sterownika IPM od shkodera ustawiającego taktowanie procesora tosi "na sztywno" an 512 MHz. Po takim zabiegu G900 zachowuje się jak zupełnie inna maszyna
Tak długo jak jest przez większość czasu uśpiona, nie ma żadnego problemu Ale niestety, jeśli jest włączona przez dłuższy czas na przykład w trakcie słuchania muzyki, to te 512MHz non-stop odbije się na czasie pracy na baterii. Fakt, że na czas słuchania muzyki można uztawić sobie mniejsze taktowanie przy pomocy xGuru (co też do tej pory robiłem), ale jest to nieco denerwujące na dłuższą metę. A dodatkowo, jeśli przy słuchaniu muzyki (ze zmniejszonym taktowaniem) akurat przyjdzie potrzeba napisać sms-a to można się wściec (przynajmniej w tmail-u i przy słuchaniu przez BT).
Wkurzyło mnie to, więc postanowiłem coś z tym zrobić
Konfiguracja może być nieco kłopotliwa i wymaga pewnej znajomości mortscripta, ale wygląda na to, że spełnia swoje zadanie. Może ktoś będzie w stanie stworzyć coś nieco bardziej przyjaznego dla użytkownika działającego na podobnej zasadzie
Skrypt (a właściwie skrypty) z załącznika działa w uproszczeniu następująco: co sekundę (czas jest konfigurowalny) sprawdza, czy któryś ze skonfigurowanych warunków jest spełniony (np. czy aktywne jest dane okno) i na tej podstawie ustawia prędkość procesora używając xguru.
A mówiąc bardziej szczegółowo:
W załączniku są 4 skrypty:
- scaller.mscr - główny skrypt, jeśli wszystko działa jak należy to można wrzucić skrót do niego do autostartu
- config.mscr - zawiera warunki, na podstawie których ustawiane jest taktowanie procesora. Po uruchomieniu wszystkie procedury w nim zawarte i tak są importowane do skryptu głównego, ale ze względu na przejrzystość i wygodę postanowiłem oddzielić tą część od głównej.
- closeScaller.mscr - jak sama nazwa wskazuje - kończy sktypt skalujący taktowanie procesora - wolałem przygotować coś takiego na wszelki wypadek
- helper.mscr - sprawdza, czy scaller.mscr jest uruchomiony i w zależności od tego pozwala na jego zakończenie, uruchomienie lub zrestartowanie (koniczne po zmianie konfiguracji). Skrypt ten pozwala także na sprawdzenie (i skopiowanie do schowka) nazwy wybranego okna i nazwy odpowiedzialnego za nie procesu. Może się to przydać przy konfiguracji.
Proponuję wszystko rozpakować w pamięci głównej, np. do /Program Files. Oczywiście konieczne będzie też zainstalowanie mortscripta (o ile nie jest już zainstalowany lub wgotowany w rom).
Żeby wyjaśnić jak używać tego skryptu należałoby zacząć od wyjaśnienia w jaki sposób korzysta on z xGuru.
Program ten umożliwia wybór prędkości z poziomu wiersza poleceń. Składnia to xguru.exe #<numer ustawienia>, np xguru.exe #3. Numery ustawień można sprawdzić w menu xguru (pojawia się po odpaleniu go bez żadnego parametru) w sekcji speed/remove from menu lub speed/add to menu. Na przykład u mnie wygląda to tak:
Czyli parametr #1 ustawi 208MHz, #3 - 312MHz, #6 - 512MHz.
Na początku trzeba zadeklarować w ustawieniach skryptu scaller.mscr z których ustawień xguru planujemy korzystać. Domyślna konfiguracja wygląda następująco:
SpeedSetting["default"]=5
SpeedSetting[1]=6
SpeedSetting[2]=3
Oznacza to, że korzystam z 3 ustawień prędkości: 5 oznaczające 442MHz jest prędkością domyślną ustawioną przez większość czasu. 6 i 3, czyli 512 i 312MHz są prędkościami ustawianymi kiedy spełnione będą pewne kryteria. Xguru obsługuje do 8 ustawień prędkości, ten skrypt też byłby w stanie tyle obsłużyć. Wystarczyłoby zadeklarować dodatkowe prędkości jako
SpeedSetting[3],
SpeedSetting[4] itp.
Warunki, na podstawie których ustawiana jest jedna z tych prędkości są zdefiniowane w pliku config.mscr. Każdy z warunków ma postać procedury mortscripta:
Sub SpeedX_AppsettingY
<code>
Return(BOOL)
endSub
gdzie
X jest numerem ustawienia prędkości xguru, która ma być wybrana kiedy warunek jest spełniony.
Y jest kolejnym numerem warunku dla danej prędkości (numeracja zaczyna się od 1 i musi być ciągła: 2, 3, 4 itp.).
Czyli jeśli używamy dwóch ustawień prędkości (3 i 6) i dla obu mamy po dwa warunki, to config.mscr powinien zawierać cztery procedury:
Speed3_AppSetting1,
Speed3_AppSetting2,
Speed6_AppSetting1 oraz
Speed6_AppSetting2. Dla każdej prędkości zadeklarowanej przez
SpeedSetting* musi istnieć przynajmniej jeden warunek.
<code> może być dowolnym kodem mortscripta - może to byś sprawdzanie czy dane okno jest aktywne, czytanie rejestru - jakikolwiek poprawny kod mortscripta. Oczywiście lepiej za mocno go nie komplikować - w końcu te procedury są wywoływane dość często i nie powinny zajmować za dużo czasu CPU
Każda procedura musi zwracać wartość logiczną TRUE lub FALSE (albo 0 jako false lub liczbę różną od zera jako true) jako argument funkcji
Return()Jeśli procedura zwraca TRUE, odpowiadająca jej prędkość jest ustawiana, w przeciwnym przypadku nie.
Przykład:
Sub Speed3_AppSetting1
Return(WndActive("Desktop"))
EndSub
WndActive("Desktop") zwróci wartość TRUE kiedy aktywny jest ekran Today. Wobec tego sens całej procedury jest taki, że kiedy aktywny jest ekran Today, ustawiona zostanie prędkość 3 (czyli 312MHz).
Ale możliwości są znacznie większe, na przykład:
Sub Speed6_AppSetting2
ActiveProc=ActiveProcess()
Return(ActiveProc eq "tmail.exe" && WndActive("SMS \ MMS") && screen("landscape"))
EndSub
Ten warunek z kolei spowoduje ustawienie prędkości 6, czyli 512MHz kiedy aktywna jest aplikacja tmail.exe, a konkretnie okno SMS/MMS, ale tylko wtedy kiedy ekran jest w orientacji poziomej, czyli kiedy jest rozłożona klawiatura. Jeśli klawiatura jest złożona, warunek nie jest spełniony i procesor będzie taktowany domyślną prędkością.
Kilka innych przykładów jest skonfigurowanych w pliku config.mscr
Po skonfigurowaniu procedur trzeba jeszcze podać ile ich jest dla poszczególnych ustawień prędkości. Odpowiadają za to ustawienia z pliku scaller.mscr:
NumApps[3]=2
NumApps[6]=3
Liczba w nawiasach kwadratowych jest numerem ustawienia xguru. liczba po znaku równości ilością skonfigurowanych dla niej warunków w config.mscr. Ilość warunków musi być zdefiniowana dla każdej zadeklarowanej wcześniej prędkości (
SpeedSetting*).
Pozostałe ustawienia:
xGuruPath="\Windows"
Ścieżka do xguru. Jeśli program jest wgotowany to siedzi w \windows. Nie jestem pewien gdzie trafi jeśli jest instalowany z caba.
CheckDelay=1000
Czas jaki mija pomiędzy kolejnym sprawdzaniem czy któryś z warunków zdefiniowanych w config.mscr jest spełniony (w milisekundach). Ustawione domyślnie dwie sekundy wydają się rozsądną wartością. Jeśli użyje się wielu ustawień prędkości/warónków, może nie zaszkodzi nieco zwiększyć tego czasu.
ShowSpeedChanges=FALSE
Po ustawieniu na True przy każdym wywołaniu xguru będzie wyświetlane przez sekundę okno informujące o ustawionej prędkości. Przydaje się do sprawdzenia, czy nowo skonfigurowany warunek działa jak należy.
W celu ograniczenia zużycia zasobów Xguru jest uruchamiany tylko wtedy, kiedy jest taka potrzeba (czyli kiedy trzeba zmienić prędkość). Prędkości zdefiniowane jako późniejsze w tablicy
SpeedSetting* mają wyższy priorytet. Na przykład, jeśli przy prędkościach zdefiniowanych w przykładzie spełnione byłyby warunki:
Sub Speed3_AppSetting2
ActiveProc=ActiveProcess()
Return(ActiveProc eq "tmail.exe")
EndSub
Sub Speed6_AppSetting2
ActiveProc=ActiveProcess()
Return(ActiveProc eq "tmail.exe" && WndActive("SMS \ MMS") && screen("landscape"))
EndSub
(Oba będą spełnione jeśli będzie aktywne okno SMS/MMS programu tmail, ponieważ aktywnym procesem jest też wtedy tmail.exe), ustawiona zostałaby prędkość #3, czyli 312MHz ponieważ została ona zadeklarowana z wyższym indeksem w tablicy
SpeedSetting.
Z pobieżnych testów wynika, że działający cały czas w tle skrypt zużywa w porywach do 6% czasu procesora (a przez większość czasu jest uśpiony, czyli 0%), więc nie powinien spowodować jakichkolwiek zauważalnych spowolnień. Oczywiście wszystko zależy od ilości zdefiniowanych warunków, ale mimo wszystko zużycie czasu CPU nie powinno być zbyt wysokie.
Aha, skrypt i komentarze są po angielsku. Po prostu nie lubię się przerzucać między językami (np. komendy po angielsku, nazwy zmiennych i komentarze po polsku) - takie durne przyzwyczajenie. Dlatego starałem się pisać wszystko tutaj.
Uff, to chyba byłoby tyle - opis zajął chyba więcej czasu niż tworzenie samego skryptu
mam nadzieje że wyszło toto w miarę zrozumiale i komuś się przyda