Jestem ciągle w podobnej sytuacji, mimo że nigdy nie dostaję dokładnie tego samego przesłania i trochę testowałem.
W moim rozumieniu, głównym zasobem, który jest tu stresujący, jest pamięć GPU. Ale to nie musi oznaczać, że ten zasób w ogóle się kończy. Może to po prostu oznaczać, że Desktop Window Manager wykrył, że uruchamiasz _ tak nisko_, że jedna konkretna funkcja tej usługi może zostać wyłączona, aby zwolnić więcej pamięci.
Aby to przetestować, zacząłem otwierać aplikacje wymagające dużej ilości pamięci GPU:
Jest to nieco ponadprzeciętne wykorzystanie w konfiguracji trójekranowej z uruchomionymi kilkoma kluczowymi graczami (Visual Studio 2012 (z włączoną akceleracją sprzętową), PhpStorm, Aptana Studio, Chrome, Firefox, IE, …). Tak więc, tak, jeśli masz tylko 1 GB karty i to byłby twój zwykły scenariusz użycia, to już masz problem.
Musiałem popchnąć trochę dalej i zacząć kilka kolejnych instancji Visual Studio…
…aż zbliży się do znaku 1,5 GB i…
SNAP! Spowodowało to, że Windows całkowicie zabił komponowanie pulpitu (i uwolnił pewne cenne zasoby).
Teraz, kiedy jestem już na krytycznym poziomie i uruchamiam aplikację, która zużywa nadmierną ilość pamięci GPU w trybie fullscreen , mogę nawet przekroczyć ten krytyczny limit. Oto wynik po uruchomieniu Black Mesa przez jakiś czas na 2560x1440 przy maksymalnej szczegółowości:
Tak więc, można odjąć od tego dwie rzeczy. Przekroczenie progu 75% na pulpicie może zmusić system Windows do wyłączenia kompozycji pulpitu, gdy osiągnie ten sam limit w aplikacji pełnoekranowej (i, opcjonalnie, wyjście z tej aplikacji) kompozycja pulpitu nie jest wyłączona.
Druga rzecz to, że podczas gry, można uzyskać pomysł “Hej, mam wystarczająco dużo zasobów do uruchomienia tej gry, dlaczego nie mam wystarczająco dużo zasobów na pulpit?”. Powodem jest to, że oba wymagają pamięci w tym samym czasie.
Windows może być w stanie powiedzieć ci o sytuacji pamięci tylko po wyjściu z gry. Tak więc, kiedy uruchamiam kolejne Visual Studio po wyjściu z Black Mesa…
Co możemy z tym zrobić?
Get more GPU memory
Sweet and simple.
Disable Desktop Composition (per process)
As was already suggested, you can disable desktop composition for a single executable. To powoduje, że kompozycja pulpitu jest tymczasowo wyłączona podczas wykonywania programu wykonywalnego. To drastycznie zredukowało całkowite zużycie pamięci podczas wykonywania aplikacji w moich testach:
Notatka o nagrodzie wspomina, że jest to niepożądane, ponieważ jest to potencjalnie bardzo dużo pracy.
Disable Desktop Composition (globally)
I wouldn’t consider this a solution as desktop composition is usually desired. But this is where to disable it:
I just want to get rid of the irytującą wiadomość!
Just because you remove the warning “ Your battery is almost empty! Możesz mówić tylko jeszcze przez 10 minut!” nie oznacza, że możesz mówić dłużej niż 10 minut. W rzeczywistości, Twój telefon najprawdopodobniej po prostu się wyłączy i to wszystko. Teraz jak to się ma do poprawy?
Nigdy nie zakładałem, że wiadomość może być wyłączona i nie widzę, jak można to uznać za korzyść.
Możesz myśleć, że wiesz lepiej, ale nie wiesz. Jeśli system mówi Ci, że skończyły się zasoby, to tak.
Ale tak nie jest! Wiem!
Ok, załóżmy, że Windows nie jest wystarczająco inteligentny, aby wykryć szczególną sytuację, w której się znajdujesz, a komunikat ostrzegawczy jest po prostu irytującą niedogodnością. Co teraz?
Rzecz w tym, że ja osobiście też jestem tym dotknięty i to mnie wkurza, do cholery. Bo ja nawet nie dostaję tej wiadomości ostrzegawczej. Windows po prostu zmienia mój profil kolorystyczny i to wszystko. I to mi się naprawdę podoba.
Kiedy to się dzieje, zazwyczaj szybko uruchamiam skrypt, który wywołuje
net stop uxsms & net start uxsms
Oto pełny skrypt. Otworzy on podpowiedź UAC i zrestartuje usługę, aby można było ją uruchomić z dowolnego miejsca. Mam go przypiętego do menu startowego.
@if (1==1) @if(1==0) @ELSE
@echo off&SETLOCAL ENABLEEXTENSIONS
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"||(
cscript //E:JScript //nologo "%~f0"
@goto :EOF
)
NET STOP uxsms
NET START uxsms
@goto :EOF
@end @ELSE
ShA=new ActiveXObject("Shell.Application")
ShA.ShellExecute("cmd.exe","/c \""+WScript.ScriptFullName+"\"","","runas",5);
@end
To restartuje Desktop Window Manager i sprowadza mnie z powrotem do mojego skomponowanego pulpitu (i uwalnia wiele zasobów w tym procesie, yay).
Wiedząc o tym, można również zbudować sobie specjalne środowisko gry, gdzie można zatrzymać usługę przed rozpoczęciem gry do zwalczania tego całego zachowania. Spowoduje to jednak identyczne zachowanie jak w przypadku wyłączania kompozycji pulpitu dla pojedynczego pliku wykonywalnego poprzez właściwości pliku.