2014年7月3日木曜日

なぜ、古いPCゲームをVista以降のOSで遊ぶと反応が悪く感じるのか

はじめに 

この手の記事、ゲーマー向けに色々あるけど
日本語サイトで正確かつ一定の網羅性のある情報を誰も書いてねぇ!!!!!
と思ったので書きます。仕方ないね。



対象とする読者

1.一定のPC/AT互換アーキテクチャに関する知識を持つ人
2.DirectXとは何かをある程度理解している人
3.この記事の専門用語が分からなくても検索が出来る人
4.Eternalなんとかという14年前のゲームに異常な拘りを持つ人


でも、分からないなら結論だけ読めばOK!



結論

WindowsXP及び、それ以前のOS向けに作られたPCゲームをWindows7で実行すると
必ず遅延します。
仕様なので軽減することは出来ても完全回避することは不可能です。
古いPCゲーム最小遅延で遊びたいならXPを用意しましょう。

というか、今更古いゲームするのはやめましょう。
XPなんてサポートの切れたOSとか危ない。







・・・と結論から書きましたが、これから詳しく説明します。


注意事項

Vista/Windows7/Windows8で各々仕様の違いが若干あります。
本稿では、執筆時点(2014年7月現在)で最も普及している 
Windows7(64bit)のDirectX仕様を前提に説明します。



何が原因で遅延するのか。

 大きな観点で言うと、以下の問題があります。

 ①WDDM/DWM問題

 ②WOW問題

 ③FPS誤差問題

 ④互換API問題


① WDDM/DWM問題とは

 WDDM及びDWMとは、Vista以降のOSで採用されているドライバモデル及び描画システムです。

 XPまでのOSは、フルスクリーン時にアプリケーションがGPUを殆ど直接に近い状態で
 シングルタスク描画していました。このモデルをXPDMといいます。

 XPDMは貧弱な描画性能でも最大限にリソースを活用するという観点では優れたモデルでした。


 ただし、2つの大きな欠点がありました。
  ・ XPDMはアプリケーションのバグでOSクラッシュしやすい
  ・ 年々向上しているGPU性能(特に3D関連)を有効活用しにくい

マイクロソフトはアプリケーションのバグでOSクラッシュをするリスクを低減するために、
GPUを仮想化してOSや他のアプリケーションに影響が出ない方式を採用しました。

それがWDDM(Windows Display Driver Model)及びDWM(Desktop Window Manager)です。

 ・ GPUを仮想化が原因で、アプリケーションが描画したい情報を直接的に反映されなく
  なりました。
 ・ 古い2DのDirectXアプリケーションの場合、DWMがDirect3Dに変換します。
 ・ 各々のアプリケーションが描画した情報とウインドウの前後関係を判別して合成後
  DWMが描画します。この描画ではDirect3Dに統一されます。
 ・ 一部のブログなどで『Win7でXPDMドライバ動かしました』とか『DWMを無効化しました
  とか書いてあったりしますが、中間処理の一部が"欠損"するだけです。
  XPと同等のレスポンスにはなりません。


 これらの遅延が積み重なることによって僅かな影響は出てきます。
 しかし、極々一部の最上位ゲーマー同士の戦いだけです。
 常人には全く影響ありません。


② WOW問題

 WOWとはWindows on Windowsの略称で、64bitのWindowsで32bitアプリケーションを
 実行する為のエミュレータです。

 64bitCPUでありながらソフトウェア処理32bitCPUの挙動をアプリケーション見せることで
 32bitアプリケーションを実行することができます。

 しかし、このエミュレータの処理によって僅かな遅延が発生します。
 ですが、現在のCPU性能を考えると人間には判別不可能なレベルと思われます。


③ FPS誤差問題

 一部のゲームで、XPでは64FPSVista以降では63FPSかそれ以下で動いてしまう問題です。
 これは解決方法があるのですが、英文などの文献にも全く情報がない中、
 筆者が相当の苦労して調べた情報なので相応のお金を貰わない限り公開しません


④ 互換API問題

 古い2DのDirectXアプリケーションは、Direct3Dに変換されるという話はDWMの話で書きましたが、
 最近のDirectXの2D機能で作られたアプリケーションなら変換処理されずに描画されます。
 古い2DとはDirectDrawによる描画処理です。最近の2DとはDirect2Dです。
 Direct2Dとは、Direct3Dの一部機能を使って2Dを描画する方式です。
 そのため中身はDirect3Dであり、変換処理がされないのです。

0 件のコメント:

コメントを投稿