2

D3DXSprite を使用してテクスチャを描画します。
それらを変換(回転、スケーリングなど)したいので、 SetTransfrom メソッドを使用します。
古い変換を保存する -> 新しい変換を設定する -> 描画 -> 古い変換を設定する必要がありますか? Draw メソッドと Update メソッドを処理するスプライト クラスがあります。私は次のようなことを意味します:

D3DXMatrix oldMatrix;
sprite->GetTransfrom(&oldMatrix);

D3DXMatrix newMatrix;
D3DXMatrixScaling(&newMatrix, 2.0f, 2.0f, 0.0f);

sprite->SetTransform(&newMatrix);
sprite->Draw(...);

sprite->SetTransform(&oldMatrix);

良し悪し?

4

2 に答える 2

1

悪いのは、を取得しoldMatrixて計算に使用することですnewMatrix(精度の問題)。新しいドローごとに新しいマトリックスを再計算することをお勧めします。

スプライトごとに保存したいのは、位置、回転、倍率です。

于 2010-02-08T11:56:05.780 に答える
1

TBH 描画 2 tris (スプライトの構成要素であると想定しています) 変換と描画の変更は非常に非効率的です。

4 つの頂点を 1 つの大きな動的頂点バッファーに手動で変換し、すべてをワンダーでレンダリングする方がはるかに優れています。スプライトに適用されるテクスチャについても同様です。それらを 1 つの大きなテクスチャに保持することで、多くの状態変更を節約し、レンダリングを全体的にはるかに高速に行うことができます。

編集: 複数の DrawPrimitive/DrawIndexedPrimitive 呼び出しを行うと、非常に遅くなります。設定したマトリックスごとに、個別の描画呼び出しを行う必要があります。これを回避する方法は、マトリックスを 4 つの頂点のそれぞれに自分で適用し、それらを既に変換された頂点バッファーにコピーすることです。これは、アイデンティティ ワールド マトリックス セットを使用して 1 つの描画呼び出しを行うことができることを意味します。

後から考えると、コーナーを設定できないため、ID3DXSprite がこれを抽象化する可能性が非常に高くなります。これを抽象化しないと、パフォーマンスは本当に最悪です。

ただし、テクスチャの問題を抽象化することはほとんどありません。したがって、スプライトのすべてのフレームを 1 つのテクスチャに格納するのが最善です (場合によっては、複数のスプライトのすべてのフレームを 1 つのテクスチャに格納することもできます)。したがって、この場合、別のテクスチャを使用するのではなく、1 つの IDirect3DTexture を渡し、現在のフレームのサブ rect に pSrcRect を設定するのが最善です。使用するテクスチャが少ないほど、パフォーマンスが向上します。

于 2010-02-08T22:31:15.010 に答える