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 个大动态顶点缓冲区并将所有内容都渲染到一个中要好得多。应用于精灵的纹理也是如此。将它们保存在一个大纹理中将为您节省许多状态更改,并使您的渲染速度总体上要快得多。

编辑:进行多个 DrawPrimitive/DrawIndexedPrimitive 调用非常慢。对于您设置的每个矩阵,您需要进行单独的绘图调用。避免这种情况的方法是自己将矩阵应用于 4 个顶点中的每一个,然后将它们复制到已经转换的顶点缓冲区中。这意味着您可以使用单位世界矩阵集进行一次绘制调用。

事后看来,ID3DXSprite 很可能会从您那里抽象出来,因为您无法设置角落。如果它没有从你那里抽象出来,性能真的会很糟糕。

然而,它不太可能抽象出纹理问题。因此最好将一个精灵的所有帧存储在一个纹理中(并且可能将多个精灵的所有帧存储在一个纹理中)。因此,在这种情况下,您最好传递一个 IDirect3DTexture 并将 pSrcRect 设置为您所在的帧的子矩形,而不是使用单独的纹理。您使用的纹理越少,性能就会越好。

于 2010-02-08T22:31:15.010 回答