3

以前は NVIDIA 8400GS (256MB) を使用して一貫した 60 FPS (モニターの同期速度) で実行された 2 画面の DirectX アプリケーションがあります。ただし、512 MB の RAM を搭載したカードに交換したところ、フレーム レートが 40 FPS を超えるのに苦労しました。(トリプルバッファリングを使用しているため、これだけ高くなります。) 2 枚のカードは同じメーカー (PNY) のものです。他のすべての条件は同じです。これは Windows XP Embedded アプリケーションであり、各カードの新しいイメージから始めました。ドライバーのバージョン番号は 169.21 です。

アプリケーションはすべて 2D です。つまり、テクスチャ化されたクワッドの束と、事前にレンダリングされたグラフィックスがたくさんあります (したがって、カードのメモリをアップグレードする必要があります)。また、CPU がオンザフライでデコードする圧縮アニメーションもあります。これにはテクスチャ ロックが含まれます。ロックには永遠に時間がかかりますが、CPU が更新する別のシステム メモリ テクスチャを用意してから、デバイスの UpdateTexture メソッドを使用してレンダリングされたテクスチャを更新することも試みました。全体的なパフォーマンスの違いはありません。

DirectX のパフォーマンスに関してインターネットで見つけられるすべての FAQ を読みましたが、DirectX プロジェクトに取り組むのはこれが初めてなので、難解な知識があれば役に立ちます。:)

私が主題に取り組んでいる間、もう1つ。スワップ チェーンで Present を呼び出すと、現在のパラメーター (PresentationInterval) と呼び出し自体のフラグの両方で D3DPRESENT_DONOTWAIT を使用しているにもかかわらず、DirectX は現在の完了を待機しているようです。これは 2 画面のアプリケーションであるため、2 つのモニターがゲンロックされていないように見えるため、これは問題です。スレッドプールを介して Present 呼び出しを実行することで、この問題を回避しています。この根本的な原因は何でしょうか?

4

2 に答える 2

2

カードはまったく同じ (どちらも GeForce 8400GS) で、メモリ サイズのみが異なりますか? メモリ サイズが異なると、クロック レートがわずかに異なることがよくあります (つまり、より多くのメモリを搭載したカードは、より遅いメモリを使用する可能性があります!)。

したがって、最初に確認することは、GPU-Zなどを使用して、GPU コアとメモリのクロック レートです。

于 2008-09-17T07:10:25.970 に答える
1

サーフェス ロックが問題であるかどうかを確認するのは簡単なテストです。テクスチャの更新をコメント アウトして、フレームレートが 60hz に戻るかどうかを確認するだけです。残念ながら、ロックされたサーフェスに書き込んでリソースを更新すると、常にパフォーマンスが低下します。テクスチャでミップマップを使用していますか? DX9 がミップマップの自動生成を追加したことは知っていますが、それらの生成に多くの時間がかかる可能性があります。フレームごとに同じリソースを常にロックしている場合は、テクスチャを除くトリプルバッファリングのようなテクスチャのプールを作成することもできます。レンダリングに 1 つのテクスチャを使用させ、次の更新時に、レンダリングに使用されていないプール内の次の使用可能なテクスチャを選択します。もちろん、メモリが制限されている場合や、アニメーション化されたテクスチャとの唯一の差分を作成している場合を除きます。

于 2008-09-11T13:06:04.307 に答える