32bitなWindowsでSecondLifeを頑張るアナタへ

Second Lifeの公式クライアントは今でも32bit版しか存在しませんが以前にも増してクライアントの消費メモリー量が多くなってきているので、しばしばメモリー確保不足でのクラッシュも少なくないと思われます。理由は簡潔でご存じのとおり32bitアプリケーションである故に利用できるメモリーが2Gbyte迄という制約に起因するものです。ところが、この32bitアプリケーションというのがLARGEADDRESSAWAREの設定ビットをOnにすることで2Gbyteの制約を超えて動作するという仕組みがWindowsにはあったりします。

しかし全てのOSで32bitアプリケーションのメモリー上限は同じではありません。
メモリーの数値は以下のようになります。

・32bitOS上では、LARGEADDRESSAWAREモードにより、上限が3GB。
・64bitOS上では、LARGEADDRESSAWAREモードにより、上限が4GB。
・64bitOS上で64bitアプリケーションを動作させる場合は、LARGEADDRESSAWAREモードにより、上限が8TB。

けれども32bitのWindowsでLARGEADDRESSAWAREモードを利用するには、PAE(物理アドレス拡張)モードがサポートされていて、かつ、起動時に /3GB スイッチが付加されている状態でないと利用は出来ません。

つまりどうやっても普通の状態の32bitなWindowsでは2Gbyteの壁に阻まれることになります。

このため最も確実安全かつお手軽なメモリーを増やす手段として64BitのWindows上で利用することを推奨する人達が多いのです。さらにはサードパーティ製ビュワーで64bitアプリケーションとして作成されている物もあり、そちらを使用しているユーザーも多いのではないでしょうか。

では32bitなWindowsに/3GBスイッチを付加して対処すればいいのかと安易に考えても他のアプリケーションやデバイスドライバなど2GBを越える環境に対応していないものが正常に動作しなくなってしまうのが必至なので、ちょっとした動作テスト専用の環境などでない限りは/3GB環境にするべきではないでしょう。あまりにもリスクの方が大きすぎます。
あまりにも古いドライバ類でなければ問題は起こりにくいと考えます。

 そこで発想を変えてメモリーが足りないから増やすのではなく、限りあるメモリーなのだから消費量を減らすことで少しでも快適にSecondLifeのビュワーを使ってみてはどうでしょうか。

具体的にはSecondLifeのビュワー起動中にメモリーの解放を行って少しでもメモリー割当を少ない状態でビュワーを起動させることでクラッシュを回避しようということです。メモリー解放と聞くと、よく耳にするのがメモリークリーナーとかメモリー管理ソフトとかなどの名称の、所謂「動作中にメモリースワップを発生させてメインメモリーの空きを増やす」という系統の単なる強制スワップを行うツール類を思い浮かべると思いますが、そういった系統のものではなく、アプリケーションが確保しているワーキングセットの領域を強制的に開放して使用メモリー量を減らすものを利用します。

MS純正のツールというか拡張コマンドの「Empty.exe」ですね。

これをOSで起動中の全てのプロセス対象ではなく、個別指定でSecondLifeのビュワー類だけこまめに解放して消費メモリーが2GBを越えないようにします。
手入力で起動してもよいのですが、それだと手間なので周期的に自動起動となるとタスクスケジューラーを使う方法もありますが、もっと単純にバッチファイルのループでやってしまえば明確安全だと思います。


■バッチファイルのサンプル
:LOOP
CLS

C:\TOOLS\empty.exe FirestormOS-Beta.exe
C:\TOOLS\empty.exe SLPlugin.exe

sleep 330
GOTO LOOP
empty.exe と sleep.exe はWindowsの標準には含まれていません。
別途Resource Kit などから入手してください。
どちらもMS純正ですから安心して利用できます。

こんな感じで記述したバッチファイルをSecondLifeのビュワー起動後に実行しておけば指定時間間隔でメモリー解放を行えます。


■複数個のビュワーを使っていて実行中だけ個別に解放したい場合の例
:LOOP
CLS

tasklist /NH | find "FirestormOS-Beta.exe" > NUL
if errorlevel 0 C:\TOOLS\empty.exe FirestormOS-Beta.exe

tasklist /NH | find "SingularityViewer.exe" > NUL
if errorlevel 0 C:\TOOLS\empty.exe SingularityViewer.exe

tasklist /NH | find "CoolVLViewer.exe" > NUL
if errorlevel 0 C:\TOOLS\empty.exe CoolVLViewer.exe

C:\SRVTOOLS\empty.exe SLPlugin.exe

sleep 330
GOTO LOOP
tasklistコマンドはHomeエディションなどの下位グレードなOSだと含まれていない場合があります。
実行中のタスク一覧を取得してFindの入力として、そこに指定の文字列があればEmpty実行!って流れです。



ま、これでSIM間をテレポートではなく移動で横断し続けたりする場合に少しは落ちにくくなる(かも)

今月末には新しいOSであるWindows10が登場しますが、それでもレガシーな32bitのOSを使い続ける方に参考になれば・・・w

◆追記
結局はXP32bit環境ではboot.iniに /3GB のオプション付きで更に /Userva=3072 も付加して使っています。
Singularity viewerで2GB越えで動作可能でした。
Vista以降、Win 7 などは Win XP32 と違って /3GBスイッチ相当が無く、ブート構成データ(BCD)にてUserVaの割り当てが制限されているだけなのでコマンドで容易に変更することが可能です。
 bcdedit /set IncreaseUserVa 3072
これだけで2GB以上を割り当てることが出来るようになります。
せっかく機能があるのですから32bit系で使わない手は無いですよね。標準状態では無くなってしまいますが・・・。

しかしながらWin XP32ではVista以降とはメモリー周りが大きく違って特にBIOSで設定したMMIO域のMemory Remapが見えず、ばっさりと3GB分しかOSから見えない場合があります。どのみち32bit系OSでは4GB以上は扱えないので余剰のRAM部分はOS管理外RAMのRAMディスクなどとして使っていると思いますがMemory Remapで全容量のRAMを扱えるようにするか、あえてMMIO域のMemory Remapは行わず、僅かに残った部分をOSにメモリーとして認識させるか、XP32環境ではこの選択に迫られます。少しでも扱えるメモリーが多い方がいいのでXP32環境ではMemory Remap機能をOFFにしたほうがいいでしょうね。このあたりは各ハードウェア毎に違いが出てくることなので、まぁお好みで~♪。

0 件のコメント:

コメントを投稿

Popular Posts of the Month