さて、私はさまざまな異なるテクスチャ圧縮技術を使用することの賛否両論を比較検討しようとしています。DirectXを使用してWindowsマシン用の2Dスプライトゲームをコーディングする時間の99.999%を費やしています。
これまで、アルファトリミングを使用したテクスチャパッキング(SpriteSheets)を見てきましたが、これはもう少しパフォーマンスを上げるための適切な方法のようです。今、私はそれらが保存されているテクスチャフォーマットを見始めています。現在、すべてが*.PNGとして保存されています。
* .DDSファイルは、テクスチャがVRAMで圧縮されたままなので、特にDXT5(タスクによっては/3/1)圧縮で使用する場合に適していると聞きました。また、すでにDirectDrawサーフェスであるため、ロードもはるかに高速であると言われています。
そこで、これをテストするためのアプリケーションを作成しました。下の行を20回呼び出し、各呼び出しの間にテクスチャを解放します。
for (int i = 0; i < 20; i++)
{
if( FAILED( D3DXCreateTextureFromFile( g_pd3dDevice, L"Test.dds", &g_pTexture ) ) )
{
return E_FAIL;
}
g_pTexture->Release();
g_pTexture = NULL;
}
DXT5テクスチャでこれを試してみると、単純な*.PNGでロードする場合よりも完了するのに5倍の時間がかかります。ミップマップを生成しないと遅くなる可能性があると聞いたので、それを再確認しました。次に、*。DDSファイルを生成するために使用していたプログラムを変更し、NVIDIA独自のnvcompress.exeに切り替えましたが、いずれも効果がありませんでした。
編集:ファイル(*.pngと*.ddsの両方)は両方とも同じ画像であり、異なる形式で保存されていることを忘れました。(同じサイズ、アルファの量、すべて!)
編集2:次のパラメータを使用すると、ロードがほぼ2.5倍速くなり、消費するVRAMが大幅に少なくなります。
D3DXCreateTextureFromFileEx( g_pd3dDevice, L"Test.dds", D3DX_DEFAULT_NONPOW2, D3DX_DEFAULT_NONPOW2, D3DX_FROM_FILE, 0, D3DFMT_FROM_FILE, D3DPOOL_MANAGED, D3DX_FILTER_NONE, D3DX_FILTER_NONE, 0, NULL, NULL, &g_pTexture )
ただし、テクスチャの透明度がすべて失われています。DXT5テクスチャを確認しましたが、Paint.NETおよびDirectXDDSViewerでは問題なく表示されます。ただし、すべての透明度をロードすると、黒一色に変わります。ColorKeyの問題?
編集3:その最後のビットを無視して、私はばかげていて、私の「簡単な例」では、D3DXSprite-> Begin()でアルファブレンドを有効にするのを忘れていました。ドー!