해보니까 괜찮은것 같고 별 문제 없는것 같아서 계속 저런식으로 쓰고있습니다. 그래도 역시나 해골물일까...
프로세스를 일시정지하고 해제하는 윈도우 내장 기능이 없으므로 PSTools의 pssuspend 프로그램을 사용합니다.
아래 두개의 실행파일만 사용합니다.
pssuspend.exe와 pssuspend64.exe를 배치파일과 같은 위치에 놓고 배치파일을 실행하세요.
스토브런쳐와 소울워커 프로세스를 탐지하면서 동작합니다.
▼pssuspend 프로그램이 별도로 필요합니다.
- (The system cannot write to the specified device. 오류해결. 이하 전체적용.)
- noHT 4c : 123, noHT 5c~ : 1234, HT 2c : 123, HT 3c : 124, HT 4c : 246, HT 5c~ : 2468 으로 일단 해놓음.
▼원칙대로라면 프로그램 부분은 재배포하면 안되는데, 편의상 동봉했습니다. July 4, 2016 버전을 동봉했습니다.
작성 날짜 2018년 4월 25일 기준. STOVE 런처는 여전히 백그라운드에서 CPU타임을 먹는다. 게임 선택화면으로 보내놓으면 덜한 것 같지만 맘편하게 얼려버렸다.
듀얼코어만 사용하는 소울워커를 위해 다른 프로그램이 최대한 작업을 방해하지 않도록 CPU 코어 일부를 할당한 뒤 우선순위를 높게 만들어서 다른 프로그램이 잔여 코어에서 동작하는 것을 기대해 보았다.
@ECHO OFF
CHCP 949 >NUL
CD /D "%~dp0"
ECHO.
ECHO 이 배치스크립트는 소울워커 플레이시 시스템 리소스를 소비하는 STOVE.exe
ECHO 스토브 런처를 편리하게 일시정지 시키기 위해서 작성되었습니다.
ECHO 스토브 런처가 일시정지된 상태가 아니라면 창의 X버튼을 눌러 닫아도 됩니다.
ECHO.
ECHO 스토브 런처가 일시정지된 상태에서 실수로 이 배치스크립트를 종료했다면
ECHO 이 배치스크립트를 다시 실행시키세요. ver.3 (2018-04-28)
ECHO.
START /w pssuspend.exe STOVE.exe -r >NUL
IF ERRORLEVEL 1 (
ECHO.
ECHO Sysinternals PSTools를 찾을 수 없습니다.
ECHO 위 프로그램은 다른 프로그램을 일시정지합니다.
ECHO 다음 주소에서 다운로드 받고 같은 폴더에 이 배치파일을 보관하고 실행하십시오.
ECHO https://technet.microsoft.com/en-us/sysinternals/pstools.aspx
ECHO 클립보드에 주소를 복사합니다.
ECHO.
ECHO https://technet.microsoft.com/en-us/sysinternals/pstools.aspx | clip
pause
GOTO EXIT
)
:: BatchGotAdmin
:-------------------------------------
REM --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
exit /B
:gotAdmin
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
pushd "%CD%"
CD /D "%~dp0"
:--------------------------------------
:CHECKSTOVE
tasklist | find /i "STOVE.exe" >NUL 2>&1
IF ERRORLEVEL 1 (
ECHO.
ECHO STOVE.exe가 실행중이 아닙니다. 스토브 런처를 기다리는 중...
)
:CHECKSTOVELOOP
tasklist | find /i "STOVE.exe" >NUL 2>&1
IF ERRORLEVEL 1 (
timeout 5 >NUL
GOTO CHECKSTOVELOOP
)
:CHECK
ECHO.
ECHO SoulWorker.exe가 실행중인지 검사하는 중...
ECHO.
REM ***물리코어, 논리코어 갯수 값 받아오기
SET varphycore=
SET varlogcore=
FOR /F %%F IN ('wmic cpu get NumberOfCores /format:table ^| findstr /r "\<[1-9][0-9]*\>"') DO (
SET varphycore=%%F
)
FOR /F %%F IN ('wmic cpu get NumberOfLogicalProcessors /format:table ^| findstr /r "\<[1-9][0-9]*\>"') DO (
SET varlogcore=%%F
)
:CHECKLOOP
tasklist | find /i "SoulWorker.exe" >NUL 2>&1
IF ERRORLEVEL 1 (
timeout 2 >NUL
GOTO CHECKLOOP
) ELSE (
ECHO #############################################################################
ECHO.
ECHO SoulWorker.exe가 시작되었습니다.
REM ***논리코어4개 이상이면
IF /I %varlogcore% GEQ 4 (
wmic process where name="SoulWorker.exe" CALL setpriority 256 >NUL
ECHO - SoulWorker.exe 프로세스 우선순위를 [실시간]으로 변경하도록 시도했습니다.
REM ***하이퍼스레딩 꺼져있으면서
IF /I %varphycore% EQU %varlogcore% (
REM ***물리코어4개이면 코어123할당
IF /I %varlogcore% EQU 4 (
PowerShell "$Process = Get-Process SoulWorker; $Process.ProcessorAffinity=14"
IF ERRORLEVEL 1 (
ECHO - PowerShell 오류가 발생했습니다. 코어 일부만 할당하는 작업을 하지 못했습니다.
wmic process where name="SoulWorker.exe" CALL setpriority 128 >NUL
ECHO - SoulWorker.exe 프로세스 우선순위를 [높음]으로 변경하도록 시도했습니다.
) ELSE (
ECHO - SoulWorker 프로세스에 %varlogcore% 코어 중 3 코어[1,2,3]만 할당하도록 시도했습니다.
)
)
REM ***물리코어5개 이상이면 코어1234할당
IF /I %varlogcore% GEQ 5 (
PowerShell "$Process = Get-Process SoulWorker; $Process.ProcessorAffinity=30"
IF ERRORLEVEL 1 (
ECHO - PowerShell 오류가 발생했습니다. 코어 일부만 할당하는 작업을 하지 못했습니다.
wmic process where name="SoulWorker.exe" CALL setpriority 128 >NUL
ECHO - SoulWorker.exe 프로세스 우선순위를 [높음]으로 변경하도록 시도했습니다.
) ELSE (
ECHO - SoulWorker 프로세스에 %varlogcore% 코어 중 4 코어[1,2,3,4]만 할당하도록 시도했습니다.
)
)
)
REM ***하이퍼스레딩 켜져있으면서
IF /I %varphycore% LSS %varlogcore% (
REM ***논리코어4개이면(물리코어2개) 코어123할당
IF /I %varlogcore% EQU 4 (
PowerShell "$Process = Get-Process SoulWorker; $Process.ProcessorAffinity=14"
IF ERRORLEVEL 1 (
ECHO - PowerShell 오류가 발생했습니다. 코어 일부만 할당하는 작업을 하지 못했습니다.
wmic process where name="SoulWorker.exe" CALL setpriority 128 >NUL
ECHO - SoulWorker.exe 프로세스 우선순위를 [높음]으로 변경하도록 시도했습니다.
) ELSE (
ECHO - SoulWorker 프로세스에 %varlogcore% 코어 중 3 코어[1,2,3]만 할당하도록 시도했습니다.
)
)
REM ***논리코어6개이면(물리코어3개) 코어124할당
IF /I %varlogcore% EQU 6 (
PowerShell "$Process = Get-Process SoulWorker; $Process.ProcessorAffinity=22"
IF ERRORLEVEL 1 (
ECHO - PowerShell 오류가 발생했습니다. 코어 일부만 할당하는 작업을 하지 못했습니다.
wmic process where name="SoulWorker.exe" CALL setpriority 128 >NUL
ECHO - SoulWorker.exe 프로세스 우선순위를 [높음]으로 변경하도록 시도했습니다.
) ELSE (
ECHO - SoulWorker 프로세스에 %varlogcore% 코어 중 3 코어[1,2,4]만 할당하도록 시도했습니다.
)
)
REM ***논리코어8개이면(물리코어4개) 코어246할당
IF /I %varlogcore% EQU 8 (
PowerShell "$Process = Get-Process SoulWorker; $Process.ProcessorAffinity=84"
IF ERRORLEVEL 1 (
ECHO - PowerShell 오류가 발생했습니다. 코어 일부만 할당하는 작업을 하지 못했습니다.
wmic process where name="SoulWorker.exe" CALL setpriority 128 >NUL
ECHO - SoulWorker.exe 프로세스 우선순위를 [높음]으로 변경하도록 시도했습니다.
) ELSE (
ECHO - SoulWorker 프로세스에 %varlogcore% 코어 중 3 코어[2,4,6]만 할당하도록 시도했습니다.
)
)
REM ***논리코어10개 이상이면(물리코어5개 이상) 코어2468할당
IF /I %varlogcore% GEQ 10 (
PowerShell "$Process = Get-Process SoulWorker; $Process.ProcessorAffinity=340"
IF ERRORLEVEL 1 (
ECHO - PowerShell 오류가 발생했습니다. 코어 일부만 할당하는 작업을 하지 못했습니다.
wmic process where name="SoulWorker.exe" CALL setpriority 128 >NUL
ECHO - SoulWorker.exe 프로세스 우선순위를 [높음]으로 변경하도록 시도했습니다.
) ELSE (
ECHO - SoulWorker 프로세스에 %varlogcore% 코어 중 4 코어[2,4,6,8]만 할당하도록 시도했습니다.
)
)
)
)
REM ***논리코어4개 미만이면 코어할당기능 안씀
IF /I %varlogcore% LSS 4 (
wmic process where name="SoulWorker.exe" CALL setpriority 128 >NUL
ECHO - SoulWorker.exe 프로세스 우선순위를 [높음]으로 변경하도록 시도했습니다.
)
REM ***변수초기화
SET varphycore=
SET varlogcore=
ECHO.
ECHO SoulWorker.exe가 시작되었으므로, 다음 시간 후 STOVE.exe를 일시정지합니다.
ECHO 수동으로 스토브 런처 창을 최소화하십시오.
ECHO 일시정지된 동안에는 창이 응답하지 않습니다.
ECHO 소울워커의 서버목록이 로딩되기 전까지는 일시정지되면 안됩니다.
ECHO.
timeout 300
tasklist | find /i "STOVE.exe" >NUL 2>&1
IF ERRORLEVEL 1 (
GOTO CHECKSTOVE
)
pssuspend.exe STOVE.exe
GOTO WAIT
)
:WAIT
ECHO #############################################################################
ECHO.
ECHO STOVE.exe를 일시정지하는 프로그램을 사용했습니다. 렉없이 쾌적한 시간되십시오.
ECHO.
ECHO 나중에 다음 숫자키를 눌러 원하는 추가 동작을 선택하세요.
ECHO [1] : STOVE.exe를 정지해제하고 SoulWorker.exe가 실행중인지 다시 검사합니다.
ECHO [2] : STOVE.exe를 정지해제하고 잠시 기다립니다.
ECHO [3] : STOVE.exe를 정지해제하고 이 배치스크립트를 종료합니다.
ECHO.
@CHOICE /C 123
IF %ERRORLEVEL%==1 (
tasklist | find /i "STOVE.exe" >NUL 2>&1
IF ERRORLEVEL 1 (
GOTO CHECKSTOVE
)
pssuspend.exe STOVE.exe -r
ECHO #############################################################################
ECHO.
ECHO STOVE.exe를 정지해제했습니다. 이제 스토브 런처를 사용해도 됩니다.
ECHO.
GOTO CHECK
) ELSE IF %ERRORLEVEL%==2 (
tasklist | find /i "STOVE.exe" >NUL 2>&1
IF ERRORLEVEL 1 (
GOTO CHECKSTOVE
)
pssuspend.exe STOVE.exe -r
ECHO #############################################################################
ECHO.
ECHO STOVE.exe를 정지해제했습니다. 이제 스토브 런처를 사용해도 됩니다.
ECHO 다음 숫자키를 눌러 원하는 추가 동작을 선택하세요.
ECHO [1] : SoulWorker.exe가 실행중인지 다시 검사합니다.
ECHO [2] : 즉시, STOVE.exe를 다시 일시정지시킵니다.
ECHO [3] : 이 배치스크립트를 종료합니다.
ECHO.
@CHOICE /C 123
IF %ERRORLEVEL%==1 (
GOTO CHECK
) ELSE IF %ERRORLEVEL%==2 (
pssuspend.exe STOVE.exe
GOTO WAIT
) ELSE IF %ERRORLEVEL%==3 (
GOTO EXIT
)
) ELSE IF %ERRORLEVEL%==3 (
tasklist | find /i "STOVE.exe" >NUL 2>&1
IF ERRORLEVEL 1 (
GOTO CHECKSTOVE
)
pssuspend.exe STOVE.exe -r
ECHO #############################################################################
ECHO.
ECHO STOVE.exe를 정지해제했습니다. 이제 스토브 런처를 사용해도 됩니다.
ECHO.
GOTO EXIT
)
:EXIT
ECHO.
ECHO 안내를 종료합니다.
ECHO.
▲이건 이대로 띄워놓고 게임을 하면 됩니다.
전체화면으로 게임하다보면 5분 뒤에 알아서 일시정지 해두고 있도록 하는 겁니다.
▲시간이 다 흐르거나 강제로 키를 눌러서 스킵하면 이 화면이 됩니다. 숫자키 1,2,3을 누르지 않는 이상 넘어가지 않습니다.
게임을 껐다 켤때는 끄고나서 1을 누르면 처음과정으로 되돌아갑니다.
중간에 스토브 런처를 쓸 일이 있으면 2를 누르면 됩니다.
게임을 완전히 끄거나 그냥 스크립트 안쓰고 싶으면 3을 누르면 됩니다.