ラグはなぜ起きる?

ラグ、らぐ、Lag!!

ソロでもペアでも、どこへ行っても、どの職をやっても、思った通りに動けなくて、画面見ても実際に立ってる場所と違うところにいるからペナりまくりで、気分の落ち込みが止まりません。

20101101_1

ほとんど誰もいない時間帯にブラゴレマップで狩りしてたら、高い頻度で4~5マスずれて表示されてる感じ。今日だけでトータル10ペナ。はぁ…。

この気持ちを分かってくれる人は誰もいないし、ラグをなくすためにはどうすればいいか適切なアドバイスをくれる人もいない。

ラグはどうして起こるのか、どうやったら無くせるのか、深く調べてみた。

狩場がどこであっても起こるし、時間帯によって発生率に変わりがないので、サーバーが原因ではない。自宅のネットワークかクライアントの問題だ。

(1) ネットワークの問題

モデム、ルータやスイッチングハブの電源再投入で若干ラグの発生率が下がった。ファームウェアの不具合なのか、稼働時間に比例してこれらの機器の処理速度が遅くなるためかと。

自宅の回線はADSLですが、電話がかかってくると切断されてしまう。どうやらNTTが設置した保安器のバグが原因らしく、工事すれば直るものの料金がかかるようだ。NTT側の不具合なのにどうしてこちらが費用を払わないといけないのか理解できない。

また、ADSLモデムの管理画面でバーストエラーの発生数を確認できるのだが、ラグったなと思ったときに見ると、バーストエラーが100以上発生していた。秒数に換算すると2~3秒。何回かクリックしても移動できないときはまさにこれ。どこからか電波の干渉を受けているのが原因らしい。

ADSLがダメとなると光にするしかないわけだが、集合住宅だと構内がVDSLになり、結局、xDSLの弱点である、電波の干渉を受ける現象は起こり続ける。なかには家主に了解を得て、高額の工事費用をかけて、一戸建てと同様の光ファイバーを引く人もいるらしいが、たかがROのためにそこまでする気にはなれない。

(2) クライアントの問題

貧弱なビデオカードを使っているとラグが起こりやすいらしい。

2~3年前に主流だった9600GTを積んだPCと、オンボードRadeonのPCを使っている。普通に考えれば前者のほうが性能が良く、ラグも起こりにくそうだが、実は大差ない。それどころか、スクリーンショットの実行時や、状態異常『幻覚』にかかったときなんて、前者のほうが処理に時間がかかる有様。

これはいったいどうしてなのか。

どうやらビデオメモリからシステムメモリへの転送に要する時間が、そのまま、スクリーンショットや『幻覚』の処理時間に反映されるせいのようだ。オンボードだとビデオメモリはシステムメモリの一部から確保されるので、実際にはシステムメモリからシステムメモリへの転送となり、高速に処理できる。対して、一般的なグラフィックカードだと、ビデオメモリからビデオメモリの転送は早いが、それ以外の転送が遅い。

スクリーンショットの処理はプライマリサーフェスの内容をビデオメモリからシステムメモリにコピーしてファイルに保存する流れだろうから、これは仕方ない。しかし、『幻覚』はプログラマブルシェーダを使えばビデオメモリだけで処理できるはずなのに、いちいちビデオメモリからシステムメモリにコピーしてきて、ラスタ処理(うねうね)を施してまたビデオメモリに戻している。どうしてか。

ROはDirectX 7で実装されていて、現行のDirectX 9以降で定められているようなプログラマブルシェーダの機能が使えない。だからCPUでラスタ処理しなければならず、一度システムメモリにプライマリサーフェスの内容を持ってくる必要がある。Gravity社がDirectX 9でクライアントプログラムを書き直せばいいわけだけど、7と9では書き方が違いすぎるから改修は難しいんだろうな。

さらに踏み込んで調べてみると、VistaのDWMもパフォーマンス悪化に一役買っているようだ。DWMとはDestktop Compositionの機能を持った画面描画プログラムで、OSの機能の一部。

一般的に、ROのようなDirectX7アプリケーションは次のように画面を描画する。

(a) 2000・XPの場合

ウィンドウモードの場合、オフスクリーンサーフェスに画面内容を描いておき、ディスプレイの垂直同期に合わせてプライマリサーフェスへブリットコピーする。一方、フルスクリーンモードの場合、バックバッファサーフェスに描き、プライマリサーフェスとフリップする。フリップとは画面に表示するサーフェスがどれかを指定するだけであり、ブリットコピーに比べてはるかに軽い処理。

(b) Vistaの場合

ウィンドウモードではXPのようにオフスクリーンサーフェスからプライマリサーフェスへのブリットコピーが直接実行できず、いったんDWMの管理するサーフェスにコピーされる。そのあと、DWMがそのサーフェスを他のウィンドウと合成する形でプライマリサーフェスに描画する。つまり、XPに比べてコピーが2倍行われる。フルスクリーンモードの場合はXPと同じ。

(c) 7の場合

ウィンドウモードではDWMの管理するサーフェスというものがなくなり、2回目のコピーはフリップで済むように変更されている。7の画面描画がVistaに比べて早いのはこのため。ただしこれはDirectX7を用いる古い実装のアプリケーションには適用されない。

このことから、Vistaや7のウィンドウモードで遊ぶ場合、DWMが有効の状態でプレイするとパフォーマンスが低下し、ラグが起こりやすくなると言える。また、プライマリサーフェスの面積が大きくなればなるほどこのデメリットの影響も大きくなるので、なるべく小さい画面解像度にしたほうが良い。ROのウィンドウのサイズでなく、画面全体の解像度に比例する。

対処法をまとめると、Aeroを切るかXPを使う、もしくはフルスクリーンモードにする。いずれの場合も画面全体の解像度を小さく。これでかなりラグが抑えられる。

ところで、棚10Fで釣りをしていると、必ずマップの上中央と下中央で一瞬ラグってmobの塊に捕まってしまう。mobの数が増えるほどラグも増えるわけだが、それ以上に、マップ上に複雑な3Dオブジェクトが登場するとラグる感じがする。これについては原因がわからないので、その場所を通過するときはmobとの距離を取るなどの工夫をするしかない。

とりあえず自分のせいでラグってるわけじゃない。

くだものが快適にROできるように、NTTは殿様商売を今すぐやめて無償で保安器を交換し、GravityはさっさとDirectX9対応のROを作るべき。

2 Comments.

  1. くだもんがじゅもんをとなえた!

    ねこさんはめをまわしてしまった0(¦3っ)っ

  2. i~~ お線香立てておきますね。お祝いごとにつかうロウソクじゃないよ。