有效的方法来绘制多个分离的四边形

假设我想在Direct3D 9中绘制几个分离的(可能是纹理的)四边形,每个都由两个三角形组成:

几个四边形

我应该如何绘制这些图片以获得最佳性能,即以下哪种方式在速度方面更好?

  1. 由4个顶点描述每个四元组,使用D3DPT_TRIANGLESTRIP并为每个四元组调用IDirect3DDevice9::DrawPrimitive ,因为它们没有连接。
  2. 用6个顶点描述每个四边形,使用D3DPT_TRIANGLELIST并调用IDirect3DDevice9::DrawPrimitive一次。

第一种方法使用较less的内存,而第二种方法只需要一个绘制调用。

然而,第二种方法似乎是可行的,只有当所有四边形具有相同的纹理时,否则将需要开关。

选项2应该更快。

理想情况下,你想要把它与索引缓冲区和DrawIndexedPrimitive()结合起来。 这样你将得到一个绘制调用,只需要4个顶点。 索引缓冲区可以在启动时创建一次,因为无论顶点数据是什么,都可以完全相同,只需要告诉D3D有多less使用。

一旦添加了纹理,最终可能会针对您使用的每种不同纹理进行一次绘制调用。 如果你真的需要的话,这可以进一步优化纹理地图集。

但是,除非四边形很小,否则顶点的数量不会对性能产生重大影响,因为每像素成本会更高。 例如,如果纹理中有任何透明度,那么添加额外的多边形,以便绘制更less的完全透明的像素通常会使其更快。

当然,它越是优化,你需要编写的代码就越多,所以除非你遇到性能问题,否则不要过度优化,分析器会告诉你原因是什么。