Direct3Dコンポーネントの肥大化を解消するために、旧版のDirect3Dは最新のDirect3Dのラッパに構成し直す計画だというのをMicrosoft公式ブログで読んだ記憶がある。
Windows 10のカーネルサイズに絡んだ内容だったと思うのでDirect3D 12を対象にしたものだっただろうか。
Microsoft公式ブログのサイトが変わってしまって過去の記事を見付けるのが難しく断念。
Direct3D 9で浮動小数点数の演算精度が変化する問題はどうなる(どうなった)のか。
とりあえず現状はどうなっているか検証してみた。
検証のベースとなるコード。
► スポイラーを表示
CODE:
#include "DxLib.h"
#include
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//SetUseDirect3DVersion(DX_DIRECT3D_9);
ChangeWindowMode(TRUE);
if (DxLib_Init() != 0) return 0;
SetDrawScreen(DX_SCREEN_BACK);
double d = 0.1;
float f = 0.1f;
unsigned int controlfp = _controlfp(0, 0);
while (ProcessMessage() == 0 && ScreenFlip() == 0 && ClearDrawScreen() == 0)
{
DrawFormatString(0, 0,GetColor(255,255,255),"double: %.1f * %.1f = %.15g",d,d,d*d);
DrawFormatString(0,20,GetColor(255,255,255),"float: %.1f * %.1f = %.15g",f,f,f*f);
switch (GetUseDirect3DVersion()) {
case DX_DIRECT3D_9:
DrawString(0,40,"DX_DIRECT3D_9",GetColor(255,255,255));
break;
case DX_DIRECT3D_9EX:
DrawString(0,40,"DX_DIRECT3D_9EX",GetColor(255,255,255));
break;
case DX_DIRECT3D_11:
DrawString(0,40,"DX_DIRECT3D_11",GetColor(255,255,255));
break;
}
switch (controlfp & _MCW_PC) {
case _PC_24:
DrawString(0,60,"_PC_24",GetColor(255,255,255));
break;
case _PC_53:
DrawString(0,60,"_PC_53",GetColor(255,255,255));
break;
case _PC_64:
DrawString(0,60,"_PC_64",GetColor(255,255,255));
break;
}
}
DxLib_End();
return 0;
}
Windows 10 Pro バージョン1703 64ビット
Visual Studio 2017 Community
DXライブラリ 3.18e
検証結果。

- float.png (7 KiB) 閲覧数: 191 回
上から
1. DXライブラリ・VCのコンパイルオプション共にデフォルト
2. DXライブラリのSetUseDirect3DVersion関数でDX_DIRECT3D_9を指定、VCのコンパイルオプションはデフォルト
3. DXライブラリのSetUseDirect3DVersion関数でDX_DIRECT3D_9を指定、VCのコンパイルオプションに/arch:IA32を指定
1.
現在のDXライブラリは、Direct3D 11が使えるときはDirect3D 11を使う。
Microsoftのサポートが継続していて最も古いWindows 7でDirect3D 11は標準搭載である。
浮動小数点数演算の精度変化が発生するのはDirect3D 9であり、Direct3D 11では発生しない。
2.
Visual Studio 2012以降、/arch:SSE2オプションが既定となり、浮動小数点数の演算にSIMD拡張命令が使用される。
Direct3D 9で浮動小数点数演算の精度変化が発生する対象はx87(FPU)命令であり、 SIMD拡張命令に影響しない。
#64ビットターゲットでは常にSIMD拡張命令が使用される。
オフトピック
MSDNライブラリの/archオプションの説明だと、/arch:SSE2としてもx87命令が完全に排除されるとは限らないように読める。ちょっとしたコードの変化でも演算結果に影響を与える可能性はあるということか。
3.
SIMD拡張命令を使用しないようにしてやっと浮動小数点数演算の精度変化が確認できた。
SetUseDirect3DVersion関数でDX_DIRECT3D_9EXを指定した場合も同様であった。
いまのところ、32ビットターゲットでDirect3D 9/Direct3D 9Exデバイスを作成するプログラムを/arch:IA32オプションを付けてビルドするとまだ再現するということが確認できた。
Windows XPで動作させたいといった目的でもなければもはやあり得ない組み合わせだと思う。
この情報が何かの役に立つだろうか。