DirectX 9のプログラムがWindows 10 update 1607でCreateDeviceでD3DCREATE_SOFTWARE_VERTEXPROCESSING なら遅くなる

Windows
スポンサーリンク

2016年8月にWindows 10のAnniversary Updateがリリースされました。

 

Windows Anniversary Update (1607) 適用後、Excel出力プログラムでComExceptionが発生
2016年8月2日、マイクロソフトからWindows 10の2回目の大型アップデート「Windows 10 アニバーサリーアップデート(Anniversary Update)」が提供されました。 このアップデートを適用後、プログラ...

 

このアップデートですが、あちらこちらでトラブルが起こっているようです。

大幅に仕様が変わったためでしょうか?

 

DirectX(Direct3D) 12はWindows 10 Anniversary Updateで大幅に変わったらしい
Windows 10 Anniversary Update以降、DirectXやDirect3Dも大幅に変更になったらしいのでメモ。 Windows 10 Anniversary Updateについては以下をご覧ください。 ...

 

 

スポンサーリンク

DirectX 9 program runs terribly after win10 update 1607

 

Windows 10のAnniversary Update適用後にDirectX 9のプログラムが異様に遅くなったとの報告です。

これは、こちらの投稿にあった内容です。

https://social.msdn.microsoft.com/Forums/windows/en-US/a84dce94-49f4-4118-9e68-fe412c909ee4/directx-9-program-runs-terribly-after-win10-update-1607?forum=windowscompatibility

 

 

I've got an old game project i've been working on for years, built on directX 9, C++, visual studio 2012. Its worked fine for ages, fine on winXP, win7 and etc, but recently i got the Win10 update 1607 and suddenly everything is running dog-slow ; 2 FPS where i used to get 50-60. This has happened on all 3, very different spec PCs that i've tried it on.  All have up-to-date drivers and decent enough graphics cards and CPUs.  A brief bit of profiling on my part hasn't revealed anything obvious beyond that *everything* seems to be rendering a whole lot more slowly than it did before.

 

原因は以下の通りです。

 

Found it..!  I'd got D3DCREATE_SOFTWARE_VERTEXPROCESSING on in the CreateDevice.
Oddly this didn't produce any noticeable performance problems previously, but it does now...

 

CreateDeviceでD3DCREATE_SOFTWARE_VERTEXPROCESSING を使うとパフォーマンスにトラブルがあるようです。

 

IDirect3D9::CreateDevice メソッド

今さら、古いけど、DirectX 9のCreateDeviceメソッドの仕様のまとめ。

 

HRESULT CreateDevice( UINT Adapter,

D3DDEVTYPE DeviceType,
HWND hFocusWindow,
DWORD BehaviorFlags,
D3DPRESENT_PARAMETERS *pPresentationParameters,
IDirect3DDevice9** ppReturnedDeviceInterface

);

 

 

パラメータは次の通りです。

 

Adapter

[in] ディスプレイ アダプタを示す序数。D3DADAPTER_DEFAULT は常にプライマリ ディスプレイ アダプタである。

DeviceType

[in] D3DDEVTYPE 列挙型のメンバ。目的のデバイス タイプを識別する。目的のデバイス タイプが利用できない場合、このメソッドは失敗する。

hFocusWindow

[in] この Microsoft® Direct3D® デバイスでフォーカスを設定するウィンドウ ハンドル。指定するウィンドウは、フルスクリーンの最上位ウィンドウでなければならない。

BehaviorFlags

[in] デバイス作成を制御する 1 つまたは複数のオプションの組み合わせ。詳細については、「D3DCREATE」を参照すること。

pPresentationParameters

[in, out] D3DPRESENT_PARAMETERS 構造体へのポインタ。作成するデバイスのプレゼンテーション パラメータが記述されている。
Microsoft Windows® 2000 および Windows XP の場合、フルスクリーン デバイスのディスプレイ リフレッシュ レートは、次の順序で設定される。

  1. ユーザー定義のゼロではない ForcedRefreshRate レジストリ キー (デバイスがサポートする場合)
  2. プレゼンテーション パラメータにアプリケーションが指定したゼロではないリフレッシュ レート値
  3. 最新のデスクトップ モードのリフレッシュ レート (デバイスがサポートする場合)
  4. 75 Hz (デバイスがサポートする場合)
  5. 60 Hz (デバイスがサポートする場合)
  6. デバイスのデフォルト。

サポートされていないリフレッシュ レートは、それより小さいサポートされている最大のリフレッシュ レートに置き換えられる。たとえば、アプリケーションで 63 Hz を指定した場合には、60 Hz が使われる。57 Hz より小さいリフレッシュ レートはサポートされない。

このメソッドを呼び出すと、D3DPRESENT_PARAMETERS の複数のメンバの値が変わる。

  • ウィンドウ モードおよびフルスクリーン モードについて、BackBufferCount、BackBufferWidth、および BackBufferHeight = 0。
  • ウィンドウ モードのみについて、BackBufferFormat = D3DFMT_UNKNOWN。フルスクリーン モードの場合はフォーマットを指定する必要がある。

D3DCREATE_ADAPTERGROUP_DEVICE を設定した場合、pPresentationParameters は配列である。存在するヘッドの数にかかわらず、1 つの深度/ステンシル サーフェイスのみが自動的に作成される。

ppReturnedDeviceInterface

[out, retval] 返される IDirect3DDevice9 インターフェイスへのポインタのアドレス。作成されたデバイスを表す。

 

 

 

問題は、BehaivorFlagsの[D3DCREATE]です。

D3DCREATE に指定できる値は以下の組み合わせです。

 

#define 説明
D3DCREATE_
FPU_PRESERVE
アプリケーションで倍精度浮動小数点単位 (FPU) または FPU 例外を有効にする必要があることを示す。Microsoft® Direct3D® は、呼び出されるたびに FPU の状態を設定する。デフォルトでは、パイプラインは単精度を使う。倍精度が必要な場合は、必ずこのフラグを使うこと。このフラグを設定すると、Direct3D のパフォーマンスが低下する。
D3DCREATE_
MULTITHREADED
アプリケーションが Direct3D にマルチスレッドでの安全性を要求することを示す。Direct3D はグローバル クリティカル セクションをいっそう頻繁に取得するようになり、パフォーマンスが低下する可能性がある。
D3DCREATE_
PUREDEVICE
Direct3D が、ステート ブロックに格納できる内容に対する Get* の呼び出しをサポートしないことを指定する。また、頂点処理のエミュレーション サービスを提供しないことを Direct3D に指示する。これは、デバイスが頂点処理をサポートしていない場合、アプリケーションではトランスフォーム後の頂点しか使えないことを意味する。
D3DCREATE_
HARDWARE_
VERTEXPROCESSING
ハードウェアによる頂点処理を指定する。
D3DCREATE_
SOFTWARE_
VERTEXPROCESSING
ソフトウェアによる頂点処理を指定する。
D3DCREATE_
MIXED_
VERTEXPROCESSING
ミックス (ソフトウェアとハードウェアの両方) 頂点処理を指定する。
D3DCREATE_
DISABLE_DRIVER_
MANAGEMENT
ドライバの代わりに、Direct3D がリソースを管理しなければならないことを指定する。
D3DCREATE_
ADAPTERGROUP_DEVICE
アプリケーションは、このマスタ アダプタが所有するすべてのヘッドを駆動するように、デバイスに指示する。非マスタ アダプタについては、フラグは無効である。このフラグが設定されている場合、IDirect3D9::CreateDevice に渡すプレゼンテーション パラメータは、D3DPRESENT_PARAMETERS の配列を指していなければならない。この配列には正確に NumberOfAdaptersInGroup と同じ数の要素が含まれていなければならない。ランタイムは、AdapterOrdinalInGroup の番号順に各要素を各ヘッドに割り当てる。
D3DCREATE_MANAGED すべてのリソースが、アクセラレータがアクセス可能なメモリとシステム メモリの間で、必要に応じてスワップされるデバイスである。管理下のデバイスは、面倒なメモリ管理作業からアプリケーションを解放する。

 

D3DCREATE_HARDWARE_VERTEXPROCESSING
D3DCREATE_MIXED_VERTEXPROCESSING
D3DCREATE_SOFTWARE_VERTEXPROCESSING
は互いに排他的なフラグである。
IDirect3D9::CreateDevice を呼び出すときは、これらの頂点処理フラグを最低 1 つ指定する必要がある。

 

 

レジストリ AllowGameDVR とは?

この問題に関して、レジストリのAllowGameDVRの値を0に変更して、試してみてってコメントがありました。

 

It often cause by GameDVR setting, try turning off the Game Bar DVR feature by navigating to this Registry key:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PolicyManager\default\
ApplicationManagement\AllowGameDVR

 

 

Game DVRはXboxのアプリケーションで 「Windowsキー+G」 で、ゲームバーを表示するための設定です。

ただ、普通にWindows 10でゲームバーを使うとビデオ録画やスクリーンショットを取ることが出来るようです。

 

 

The Game DVR is a feature of the Xbox app that lets you use the Game bar (Win+G) to record and share game clips and screenshots in Windows 10. However, you can also use the Game bar to record videos and take screenshots of any app in Windows 10.

This tutorial will show you how to enable or disable the Game DVR and Game bar feature from the Xbox app for all users in Windows 10.

You must be signed in as an administrator to be able to enable or disable the Game DVR and Game bar.

 

 

ただし、この設定をオフにして試してみても、Windows 10のAnniversary Update適用後にDirectX 9のプログラムが異様に遅くなった現象は修正されません。

 

CreateDeviceでD3DCREATE_HARDWARE_VERTEXPROCESSING を使うとパフォーマンス問題は改善されるようです。

 

うーん。。

 

 

最後まで読んでいただきありがとうござました。
この記事が気に入っていただけたらシェアしてくれると嬉しいです。

 

 

コメント