※ PERFORMANCE ※             目次

 12/06/26

マルチプロセッサのCPUでゲームが遅い
 複数のCPUを組み合わせたマルチコア方式のCPUを使用している場合、一つのプログラムを動かすのに複数のコアの連携が上手く行かず、反って遅くなったり止まったりといったトラブルが起きる事がある。昔のゲームではこの様なタイプのCPUでの動作を考えてプログラミングされていないというのがその理由。昔のゲームなのに最近のPCで動かしても遅い(逆に異常に速くなる)というケースでは、原因としてこれを疑ってみるのは一つの定番となる。


 障害の切り分けとしては、単一のCPUで動作させて見て変化があるかどうかを確認するのが第一となる。一時的にゲームを最小化可能ならば(ALT + TAB, ALT + ENTER, またはウインドウズボタン押下)、最小化後にALT + CTRL + DELにてタスクマネージャを呼び出し、プロセスタブから該当ゲームの実行ファイル(exe)を見付けて右クリック。プロパティから「関係の設定」を選択し、利用するCPUのチェックをどれか一つにしてやる。その後ゲームを再度呼び出す。この方法の欠点は起動の度にこの作業が必要な点と、最小化に対応していない(or最小化後に落ちてしまう)ゲームでは使えないという点。


 起動時に強制的に一つのCPUでしか動かないように出来るユーティリティはRunFirst等幾つか存在しているが(有料・無料含めて)、ここではその中の一つであるimagecfgの使い方を紹介する。私も詳しくは知らないがこれは開発者用のツールで、Windows上の全てのexeファイルが持つ“動作モードを記述する共通領域”の部分のあるビットを書き換えて、単独のCPUでしか動かないようにする事が可能な物。

 なおこれはexeファイルを書き換えるので、動作保証がされている訳では無いし、マルチプレイの際にexeファイルを改竄しているとしてチートを使っていると見なされる可能性もある。なのであくまでも自己責任にて使用してもらいたい

1.imagecfgをダウンロードして、該当ゲームのexeファイルが有る場所に解凍
2.念の為に改変するexeファイルのバックアップを取っておく
3.スタート→アクセサリ からコマンドプロンプト(XP上のDOSコマンド実行画面)を起動
4.該当ファイルの存在するフォルダに移動(以下はコマンド例)

     d: として Enter でDドライブに移動
     cd Game Enter でその下のディレクトリに移動(この場合はGameという名のディレクトリに移動)
     dir として Enter でその下のディレクトリ構造を表示

5.プロンプトから imagecfg -a 0x1 abc.exe と入れてEnter(例では実行ファイル名がabc.exeの場合)
6.以下の様なメッセージが表示されればOK
 abc.exe contains no configuration information
 abc.exe contains a Subsystem Version of 4.0
 abc.exe updated with the following configuration information: Process Affinity Mask: 00000001

7.以降書き換わったexeを実行すれば、自動的に常に単独のCPUから起動されるように設定される。


 なおかなり前のCPUになるが、Athlon 64の様にAMD Dual-Core Optimizerといったデュアルコア用のユーティリティーを入れないとならない物もあった。

ゲームの速度が遅い

*Doom3 エンジン(Tech 4)を使用しているゲームで、ランダムに遅くなる状態が頻発する

 FPSゲーマーには馴染みのあるエンジンなので記載。Quake 4やPrey等が該当する。

 そのゲームでのbaseフォルダに当たる中に有るAutoexec.cfgを開いて(無ければ他のcfgファイルをコピーして新規制作して)、
その中に seta com_precisetic "0" の一行を加えて起動する。コンソールから直接 com_precisetic 0 でも良い。

 これはエンジン内で複数の処理スレッドが走っている時にその精密な同期を外すという意味のコマンドで、よってCPUがマルチコアの場合には動作コアを一つだけに設定しても治る可能性はある。ただしコアが一つになると、折角のマルチコア対応を活かせない。そこでマルチコアによる高速化をそのままに、障害だけを直す方法として存在する物である。

 ただし精密な同期を外す為に、マシン環境やゲームによっては問題が発生する可能性もある。例えばD3ではマルチコアなら入力やサウンド処理を別のCPUで行うので、それが微妙にズレるように感じるという人もいるようだし、Preyだとリップシンクがズレてしまうという事例も出ている。それとマルチプレイではおそらく強制的に解除されてしまうはず。


*古いゲームをXP上で動作させると遅い

 95/98/MEといったOSのゲームをXP上で動作させる際に、OS上でのプログラムの取り扱い方法が異なる為に、最新のPCでもむしろ遅くなってしまうという現象が起きる事がある。まず第一にゲームの起動用のショートカットを右クリックしてプロパティを出し、互換性タブの中の「互換モードでこのプログラムを動作させる」にチェックを入れて、OSを変化させてから起動してテスト。

 他にはゲームの処理優先順位を上げてみるという方法がある。以下の様にショートカットのリンク先を変更してタスクの優先順位を上げる。

 書式: cmd /c start /d<パス名> /<優先度> <実行ファイル名>

 例) cmd.exe /c start /d"C:\Program Files\ABC Game" /HIGH abc.exe

ゲームの速度が速過ぎる
 一般的なアプリはPCが高速なほど速く処理されるが、そこには何の問題も無い。しかし主にアクションゲームにおいては、ゲームの中の速度は常に一定でなければならない。遅いPCだとゲーム内のスピードが遅くなり、速いPCではゲームの内のスピードが速くなってしまうのでは不味い訳だ。具体的には自分の操作するキャラクターの移動速度や敵が動くスピードは、どんなPCであっても常に同じ速度である事が要求される。

 そこでゲーム側にて速度調整用のプログラムを用意するのが普通である。例えばゲームの起動時等に速度測定プログラムを走らせてそのPCの性能を計測。それを基準値として設定しているスピードと比較する。その測定結果が基準値の2倍(2倍の速さ)だった場合なら、ゲームのスピードを基準値の半分に落としてしまう事で丁度100%の速度に出来る。反対に1/2の速度であったならば、基準値の2倍速で動かしてやればこれも100%になるという風に調整が可能。

 しかしゲームの発売後にアーキテクチャ(設計)が異なるCPUが登場したりすると、その計測用のプログラムが新しいCPUの速度を正確に計れなくなるというケースが出てくる。またアプリの扱いはOSによっても異なる為に、古いOSにしか対応していないゲームだと速度の管理システムが正常に働かないという事も起こり得る。それが原因でゲーム内のスピード調整が上手く行かず、製作側の意図しているスピードよりも速くなってしまってプレイに支障が出たりしてしまう。


*垂直同期を有効にする

 V-sync(垂直同期)をONにすると、画面周波数よりもフレームレートの値が上がらなくなるので(例えばデフォルトの60Hzならばfpsは最大で60になる)、昔のゲームがあまりに軽過ぎて速くなっているのならばこれで制御可能。ただしゲーム内のオプションに設定がない場合には、ビデオカードのユーティリティー側から強制的に指定しないとならない。


*互換モード

 OSによってアプリケーションの速度管理方法は異なるので、想定していないOSの配下では上手く動かない可能性がある。起動ショートカットを右クリックしてプロパティから当時のOSの互換モードを選んで改善されないかを試す。


*省電力PCにおけるCPU速度検知の問題

 ノートPCの様な省電力PCの場合、通常動作時はCPU速度が低く抑えられており、必要な時だけフルパワーで動作するようになっている。その為にゲーム起動時のCPU速度が実際よりも遅く検出されてしまい、いざプレイした時に最大速度になったCPUに対して高速化補正が掛かってしまって、製作側が意図したよりも遥かに速くゲームが動いてしまうというトラブルが発生する。

 例えば起動時にCPUの速度が100と判定された時に、ゲーム内の速度が標準の“1.0倍”で動くように設定されているとしよう。もし測定値が200だったら基準速度を0.5倍にして動かせばちょうど良くなり、同じく50だったら2.0倍にすれば速度は100で同じになる。ところが省電力モードで動いている場合、仮に本来の速度が100のCPUが半分の50で動作中だったらどうなるか。起動した時の判定は50だから2.0倍にして基準値に合わせようとするが、実際にゲームが始まった時にはCPUの速度はフルの100に切り替わっており、100*2.0=200で動くからゲーム内のスピードが2倍速になるというトラブルが発生してしまう。

 これが原因かどうかを調べるには省電力の設定を一時解除してやれば良い。コントロールパネル→電源オプションにて省電力の設定を切ってみるというテストで、「ポータブル・ラップトップ」から「常時ON」や「自宅または会社のデスク」に変更して治るかどうかをテスト。ただこの方法だと省電力モードにする為には、一々ゲームが終わったら設定を戻さないとならなくなるという問題がある。なおこれは各種CPUが持っている低消費電力モードにも影響される可能性があるので、そういった機能を設定からオフにしてのテストも必要である。この際にはBIOSから変更しないとならないかも知れない。


*Unrealエンジン使用のゲーム

 もしそのゲームがUnreal Engineを使っている物であれば、起動オプションに-cpuspeedを付けるという方法がある。起動ショートカットを右クリック→プロパティ→リンク先欄に、以下の様に半角空けて -cpuspeed を追加する(どこにインストールしているかによって変る)。なおこのオプションが全ての同エンジン対応ゲームに適用されるのかどうかは未確認。(Splinter Cell, Deus Ex, Unreal IIでは機能する事を確認)。

 例) "C:\Program Files\Ubisoft\Splinter Cell\system\SplinterCell.exe" -cpuspeed=1500  (1.5GHzのCPUの場合)

 この-cpuspeedの値は、ノート等の省電力モードになっているPCでは最高速でのCPUクロック速度(単位はMHz)で調整を行う(1GHz = 1000MHz)。マルチコアの場合にはクロック数とはピッタリと合わない可能性もあるのでその辺はテストで調整する。例えば3GHzのCPUを使っていて速過ぎるなら、4000, 5000といった具合に増やして行く。


*Hitman 2: Silent Assassin

 特定のゲームだが、今でもプレイされている有名なゲームなのでトラブルとして記載。

 FAT32でフォーマットされたHD上にセーブされたデータを、NTFSを使っているHD上にコピーして使用した場合、ゲーム内のスピードが加速してしまうという障害が確認されている。原因は不明。修正方法も無く、新規にゲームを始めるしかない。


*その他の対策

 一般的な対策としては、ゲーム内部の設定を解像度を上げたりして出来るだけ重くすると同時に、ビデオカードのドライバ(ユーティリティ)からアンチエイリアスやフィルタリングの設定を重くして負荷を掛けてやるという手法がある。

 上記の様な対策が通用しないケース。まず特殊なケースになるが、CPU速度の検知を起動の度に行わずに、インストール時等の一回限り行うというゲームも存在するようだ。この場合にはその内容を書き込んだ設定ファイルがどれか分かるのならば削除して再生成。分からなければ一度アンインストールしてから再度インストールという形になる。なおセーブデータやゲームの設定ファイルに速度設定値を保存している物もあり、この場合には新しいPCに昔のデータをそのまま移行するとおかしくなる。こちらは新しく設定ファイルを作成し、New Gameで開始してみて速度がちゃんとなるのならば、また新しい状態からやり直すしかない(設定ファイル内部の速度記述部分を書き換える方法が判らない限り)。

 ソフトウェア的に擬似的な負荷を掛けて遅くするソフトウェアとしてはCPU KillerMo'Sloといった物があるがどちらも有料(無料のツールも有るが原始的)。昔のゲームをプレイする事が多くない人には高価である。またストラテジーやRPGとかならまだ良いのだが、アクションゲームの様にリアルタイムで変化する速度を綺麗に調整するというのは難しく、ゲームによって上手く行ったり行かなかったりも発生する。

 10%の速度で動かすと指定した場合に、長時間での平均を10%に近くにするというのは可能であり、リアルタイムでのアクションを要求されないタイプのゲームではそれであまり問題は無い。しかし常に10%を保つという風に「綺麗で滑らかに遅くする」というのは難しく、リアルタイムでの反応が重視されるアクション系では困難が伴う。


      目次