windows7 快適化 メモリ解放 empty for talesweaver

comfort talesweaver tool

ゲームなどのアプリが突然落ちる事(クラッシュ)。その原因の一つがメモリ食い潰し。煩わしい度々アプリ再起動でのメモリ解放。メモリ管理ソフトもありだが、ここではOS本家のツール(empty.exe)を利用する。

メモリ解放をMicrosoft社のツール(rktools/empty.exe)とschtasksで行い、メモリ解放絡みでの再起動回数を減らす。

empty.exeはパッケージrktoolsに含まれている。インストールしてしまう方法もあるが、7zipなどで必要なempty.exeだけを取り出す。このempty.exeをパスの通った所に置く。

(書庫パス) [rktools.exe/rktools.msi/empty.exe]

パスの通った所とは環境変数Pathに追加されたパス群を示す。一部の例[%windir%/System32]。管理用[%usrdir%/bin]を追加し運用。

empty.exeのプロパティ[Alt+Enter]より、念のため[互換性>特権レベル]を与えておく。プロセスによっては権限窓が出ることもあるらしい。

empty.exeをそのまま実行すると一瞬DOS窓が見える。それを避けるためにスクリプトを記述する。wsfが推奨されているが、jsでもOK。

[talesweaver 快適化]と書いているけれども他のゲームやアプリでも快適に使えるようになるはずです。

'empty *'と全プロセスにかけるのは、ブラウザやスカイプなど裏仕事されてる方への、一番手っ取り早いで方法です。

それが気持ち悪い方は、talesweaverを例にアプリEXE名(InphaseNXD)に絞って、'empty InphaseNXD'もしくは'empty *NXD'などでOK。

[empty.js]
(function(s){
var z=new ActiveXObject('WScript.Shell');
z.run(s,0);
z=null;
})('empty *');
[empty.wsf] #msdn-wsh-xml
コマンドラインでタスク作成する。#mynavi-schtasks
:: 16:45から10時間の間10分毎にempty.jsを実行するタスク例
schtasks /create /tn USER\empty /tr %usrdir%\empty.js ^
/st 16:45 /du 10:00 /sc minute /mo 10

:: [USER\]内のタスク一覧を確認
schtasks /query /tn USER\

:: タスクを即実行
schtasks /run /tn USER\empty

:: タスクを削除(ワイルドカードでは特に注意)
schtasks /delete /tn USER\*
schtasks /delete /tn USER\empty

:: ## 管理用に"/tn USER\empty"としている
:: ## %userdir% は任意のパス

emptyでメモリ解放をしないで数時間talesweaverをしていると1GB以上メモリを食っていることがザラ。empty適用後(メモリ解放されるので)、メモリ絡みで落ちる事は滅多にない。SAOイベント0時前後3回最上2回でもまず落ちない。再起するときは慎重を重ねる時ぐらい。接続エラーは別件なので今のところどうしようもない。

(2013-07-10)メンテ後、SAOアバタを装備すると落ちやすいようだ。討伐の証で交換できるクラインのヘアバンドも含まれる。描画されるだけで落ちる場合もあるようなので、イベント会場では注意が必要。ヘアバンドが気に入ってただけに、悲しい。改善に期待。

常に(empty *)で起動中アプリ全てに対して実行される必要があるのか疑問が残る。そこで対象プロセスの有無で分岐してみる。タスクスケジューラには10分毎に走らせる設定。対象プロセスがあればそれを、それ以外は偶数時間[00,20,40]分代の場合のみ全プロセスを、といった具合でemptyの走らせ方を変えてみるのもいいかも。

:: mc/tw - memory cleaner for talesweaver

mc.bat - memory cleaner
@echo off
set s=%1
tasklist /nh /fi "imagename eq %s%*" | findstr /b %s%>nul
if {%errorlevel%}=={0} (
empty %s%*
) else (
set /a s=%time:~3,1%%%2
if not {%s%}=={1} empty *
)
set s=
tw.js
(function(s){
var sh=new ActiveXObject('WScript.Shell');
sh.run(s,0);
sh=null;
}('cmd /c mc.bat InphaseNXD'));
/etで翌日またぐ方法が分からないので/duを取ることにした。
:: install.bat
@echo off
:: init
:: s: start time
:: d: duration time
:: m: skip minute
set s=16:30
set d=10:00
set m=10

:: files
set key=USER\mc
set bat=mc.bat
set js=tw.js

:: head
echo == memory cleaner task create ==
echo install task: %key%

::check
set x=0
set a=%bat%,%js%
for %%i in (%a%) do (
if exist %%i set /a "x+=1"
)
if not {%x%}=={2} (
echo please touch %bat% %js%
goto :eof
)

::istask
echo it is error output when not exists task.
echo please do not mind.
schtasks /query /nh /tn %key%>nul
if {%errorlevel%}=={0} (
echo installed task: %key%
set /p p="reinstall task? [n/y]:"
if not "%p%"=="y" goto :eof
::uninstall
schtasks /delete /f /tn %key%
)

::install
schtasks /create /tn %key% /tr %~dp0%js% ^
/sc daily /mo 1 /ri %m% /st %s% /du %d%
pause