4

さて、私はさまざまな異なるテクスチャ圧縮技術を使用することの賛否両論を比較検討しようとしています。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()でアルファブレンドを有効にするのを忘れていました。ドー!

4

2 に答える 2

14

ファイルがディスクに保存される形式と、ビデオ メモリで最終的にテクスチャが使用する形式を区別する必要があります。DXT 圧縮テクスチャは、ビデオ メモリのメモリ使用量と品質のバランスが取れていますが、PNG や Jpeg 圧縮などの他の圧縮技術では、通常、ファイルが小さくなり、ディスク上の品質が向上します。

DDS ファイルには、DXT フォーマットを直接サポートし、DirectX がデータをメモリに配置することを期待するのと同じ方法でディスクに配置するという利点があります。ハードウェアが使用できます。また、PNG などの形式がサポートしていない、事前に生成されたミップマップ チェーンもサポートしています。画像を DXT 形式に圧縮するのはかなり時間がかかるため、一般的に、ロード時に圧縮することはできるだけ避けたいと考えています。

作成する予定のビデオ メモリ テクスチャと同じサイズで、同じフォーマットを使用する、事前に生成されたミップマップを含む DDS ファイルは、標準フォーマットの中で最小の CPU 時間を使用します。ただし、それを保証するために、スケーリング、フィルタリング、フォーマット変換、またはミップマップ生成を実行しないように D3DX に指示する必要があります。D3DXCreateTextureFromFileEx内部変換が行われないようにするフラグを指定できます (D3DX_DEFAULT_NONPOW2ハードウェアが 2 の累乗以外のテクスチャをサポートしている場合は画像の幅と高さ、D3DFMT_FROM_FILEミップマップの生成またはフォーマット変換D3DX_FILTER_NONEを防止し、フィルタリングやスケーリングを防止します)。

ただし、CPU 時間は話の半分にすぎません。最近では、CPU は非常に高速で、ハード ドライブは比較的低速であるため、PNG や JPG などの小さな圧縮ファイル形式をロードして、それを変換するために多くの CPU 作業を行うと、大きなファイルをロードする場合よりも合計ロード時間が短くなることがあります。 DDS のように、ビデオ メモリに memcpy を実行するだけです。良い結果が得られる一般的な方法は、DDS ファイルを圧縮して解凍し、ディスクから高速に読み込み、フォーマット変換の CPU コストを最小限に抑えることです。

PNG や JPG などの圧縮形式は、一部の画像を他の画像よりも効果的に圧縮します。DDS は固定圧縮率です。特定の画像解像度と形式は、常に同じサイズに圧縮されます (これが、ハードウェアでの圧縮解除に適している理由です)。テスト用に代表的ではない単純な画像 (均一な色や単純なパターンなど) を使用している場合、PNG ファイルは非常に小さい可能性が高いため、通常のゲーム画像よりも高速にディスクからロードされます。

于 2009-09-22T23:31:45.033 に答える
1

標準の PNG をロードしてから圧縮する場合と、DDS ファイルをロードするのにかかる時間を比較してください。

それでも、PNG が同じテクスチャ DXT5 圧縮よりも速く読み込まれる理由がわかりません。1つは、かなり小さいので、フォームディスクをより速くロードする必要があります! この DXt5 テクスチャは PNG テクスチャと同じですか? つまり、それらは同じサイズですか?

D3DXCreateTextureFromFileEx で遊んでみましたか? 何が起こっているのかをはるかに制御できます。それはあなたを助けるかもしれません。

于 2009-09-22T19:45:45.260 に答える