假设我想在Direct3D 9中绘制几个分离的(可能是纹理的)四边形,每个都由两个三角形组成:
我应该如何绘制这些图片以获得最佳性能,即以下哪种方式在速度方面更好?
D3DPT_TRIANGLESTRIP
并为每个四元组调用IDirect3DDevice9::DrawPrimitive
,因为它们没有连接。 D3DPT_TRIANGLELIST
并调用IDirect3DDevice9::DrawPrimitive
一次。 第一种方法使用较less的内存,而第二种方法只需要一个绘制调用。
然而,第二种方法似乎是可行的,只有当所有四边形具有相同的纹理时,否则将需要开关。
选项2应该更快。
理想情况下,你想要把它与索引缓冲区和DrawIndexedPrimitive()
结合起来。 这样你将得到一个绘制调用,只需要4个顶点。 索引缓冲区可以在启动时创建一次,因为无论顶点数据是什么,都可以完全相同,只需要告诉D3D有多less使用。
一旦添加了纹理,最终可能会针对您使用的每种不同纹理进行一次绘制调用。 如果你真的需要的话,这可以进一步优化纹理地图集。
但是,除非四边形很小,否则顶点的数量不会对性能产生重大影响,因为每像素成本会更高。 例如,如果纹理中有任何透明度,那么添加额外的多边形,以便绘制更less的完全透明的像素通常会使其更快。
当然,它越是优化,你需要编写的代码就越多,所以除非你遇到性能问题,否则不要过度优化,分析器会告诉你原因是什么。