Windows 10 Anniversary Updateで起きた事。
万事OKとはならなかった
Windows 10 Anniversary Updateが公開され、それによって新しい機能が追加され、またアカウントのライセンスが新しい形となった事で、DSP版を使用している人にはいろいろと朗報だったハズのWindows 10 Anniversary Updateだが、即導入を決めた事で問題が発生した人もいた。
私もその中の一人なのだが、旧世代の遺産を抱える者であれば、少なからずこの問題にぶつかる可能性があるので、とりあえず起きた事などを書いておく事にする。
まず、前提として話をすると、今回のWindows 10 Anniversary Updateというアップデートを実施した事で、完全にWindows10は最新版に切り替わる。
Windows10へとアップデートしただけでも最新になるにはなるが、Windows10はその後のメジャーアップグレードがなくなる代わりに、メジャーアップデートが一定期間で実施される。ようするにこれが以前で言う所のServicePack的なアップデートになるワケだが、これが意外と大きなものだったりして、新機能の実施と共に大幅にシステムに変化をもたらす可能性がある。
今回のWindows 10 Anniversary Updateは、概ね良好なアップデートだったのだが、前述したように過去の遺産を最新のWindows10上で利用しようとすると問題を起こすという問題が発生した。
具体的には、Microsoft Direct3D周りの変化が大きかったようで、特にDirectX9.0cで動作する一部のアプリケーション(そのほとんどはゲームだと思う)で、一気に動作がもっさりしてフレームレートが激減するという問題が発生した。
DirectX10以降であれば、こうした問題は起きないのだが、ちょっと昔のゲームになると、DirectX9.0cで動作するというものが多く、これはWindowsXPの寿命が異常に長かった事に起因する。
Windows7環境になっても、一部メーカーは依然としてDirectX9.0cで制作していた、なんて話もあって、これが結構根深い問題でもあるのだが、私の環境では今回のアップデートでまともにこの現象が発生し、困った事態に陥った。
解決できるか?
DirectX9.0cは、Windows10をクリーンインストールするとそもそもインストールされる事はない。何故なら現在はDirectX12が最新だからだ。もしどうしても過去のDirectXで動作させたいとなると、ランタイムという形で後からインストールする事になる。
だが、Windows7からWindows10にアップグレードした人は、過去のデータがHDDの中に残されている(元に戻す事ができるという事はそういう事である)ため、DirectX9.0cに関わるデータ(特に重要なのがDLLデータ)が入っている。
なので、Windows10をクリーンインストールした人でDirectX9.0cに起因する問題にぶつかった場合は、自分の手持ち以外のデータで解決の糸口を見つけるしかない。
逆にWindows7からアップグレードした人は、自分のHDDの中に解決の糸口が含まれている事になる。何故なら、Windows7時代には、そうした問題にぶつかっていなかったハズだからである。
だから、今回のDirectX9.0cに起因するもっさり問題にぶつかった人は、ココに気付く事ができれば、今回の問題はかなり大きく前進する事になる。
DLLファイル
私はプログラマーではないので、詳しい話はわからないが、DirectX9.0cのコアプログラムはどうも「d3d9.dll」というDLLファイルにあるらしい。
どうも、今回のWindows 10 Anniversary Updateでは、d3d12.dllという、DirectX12に関わるDLLファイルが更新された事で、旧来のDirectX9.0cの動作に変化が現れ、問題となっているらしい。
となると、d3d12.dllを以前のものに戻すか、或いは特定のプログラムを実行する時のみd3d9.dllを読み込ませるようにするかしか方法がない。
通常、d3d12.dllはC:\Windows\System32等、Windowsのコアシステムの中にインストールされている。通常DirectXで動作するアプリケーションは、実行ファイルと同じ階層内をまず確認して、そこにd3d*.dllがあると、そのDLLファイルで動作する。しかし実行ファイルと同じ階層内にd3d*.dllが存在しない場合は、WindowsはC:\Windows\System32のフォルダを確認し、そこにd3d*.dllがあると、そのDLLファイルで動作する。
これが簡単な説明。だが、実際はそんな単純な問題ではない。以前の…そう、XP時代はこういう認識で問題はなかったようだが、現在はもっとシステムの中に深く入り込んでいて、こんな単純な構成で動作していないらしい。
だが、基本的な考え方そのものは間違っていないハズ…そう考えて、私は一つの実験を試みた。
決め手はd3d9.dll
まずは実験をするために、過去問題なく動作していたd3d9.dlを探す事から始めた。
検索すると…というか、コレは実は単純に見つける事ができる。
起動ドライブの直下に「Windows.old」というフォルダが存在する。このフォルダがあるという事が、Windows7等からWindows10へとアップグレードした証である。
このoldフォルダは、言うまでもなく過去のWindows OSで使用していたプログラムが保存されている。なので「d3d9.dl」は間違いなくこのフォルダ内に残っているハズである。
「Windows.old」内は、以前のWindowsのシステムと同じ構成でデータが保存されているので、探すのは難しくない。このフォルダ内にある「system32」から目的のd3d9.dllを探せばよいのである。
だが、同時に64bit版だと「WoW64」というフォルダ内にもd3d9.dllがあり、場合によっては両方のd3d9.dllが違うデータだったりする。タイムスタンプやデータサイズで同一性をよく確認してもらいたい。もし両者のデータが違っていたら、両方で試してみるしかないので、とりあえずその両方のデータをコピーして別のフォルダに入れるか、名前を変更してコピー、保存する。一つしかデータが存在しないなら、その一つで試すしかない。同じようにとりあえずコピーを別の場所に保存すれば良い。
で、ここで前述の基本を思い出す事になる。
「実行ファイルと同じ階層にあるDLLファイルをまず探す」という原理から、ココでコピーしたd3d9.dllを、もっさり問題の出るアプリケーションの実行ファイルと同じフォルダに入れて、プログラムを起動してみるのである。
基本通りなら、同じ階層にあるDLLで起動するハズであるから、アップデートされた新しいDLLファイルではなく、以前まで使っていたDLLファイルでプログラムが起動するハズである。
d3d9.dllが2種類検出された人は、上手くいかなければもう片方のデータで試してみる。それで上手く動けば問題解決である。
私の場合
私は、実は2種類のd3d9.dllが検出され、それぞれ1.8MBと2MBとデータサイズが異なるd3d9.dllが見つかった。ちなみにどちらも時間は多少異なっていたがタイムスタンプが2016/07/01だった。
だからまず手始めに2MBのd3d9.dllで試してみたが、それで上手く行かず、1.8MBのd3d9.dllで試すと以前のような問題のない動作を確認する事が出来た。
しかし…どうもこれだけでは上手くいかないという人も少なからずいるようである。
おそらくは、そういう人はWindows8環境の人ではないのかと思うのだが(あくまでも勘の話)、私が行ったケースで100%上手くいく、という事ではないようである。
私はプログラマーではないので、今回の問題の根幹部分が何に起因するものなのかすら分からないで、思いついた対処法を試しているのだが、DLLファイルで動作する基本的な解釈で対処できるケースもある、という事である。
実際に実施する場合は「どこのフォルダに何のファイルを追加したか?」「どのフォルダから何のファイルを消した(移動した)か?」などをちゃんと記録しておかないと、取り返しの付かない事になったりするので要注意なワケだが、単純にファイルのやり取りだけで解決できる場合もある。
なので、私の場合と同様に、今回のWindows 10 Anniversary Updateによって同様の問題が発生した人は、一度この「d3d9.dll」の実行ファイル同階層配置による対応を試してみることをオススメしたい。
また、Windows10をクリーンインストールしたのだが、昔のアプリケーション(ゲーム等)を動かしたくなって動かしたらもっさりする…という場合の人は、ネット上から「d3d9.dll」を入手できたりするので、同じように実行ファイルど同階層にd3d9.dllを入れて試してみる、という手をオススメしたい。出来ないかもしれないが、出来るかも知れない…可能性はゼロじゃないので、試してみる価値はあるだろう。
その場合…くれぐれもウィルス/スパイウェア対策だけはしっかりやっていただきたい。
それにしても…国内ではDirectX12対応ソフトというのは未だに出てきていないワケだが…国内ソフトではもう望みはないのかな?