在阅读了很多关于如何使用Direct X绘制到设备的教程之后,我意识到所有这些教程可能会有相同的错误。它们都直接吸引到设备上。
例如,我有20个位图要渲染到我的内容+让我们说1000个形式(形状像矩形,线条,圆圈)。每个教程似乎都使用这种方法。
for(int i = 0; i < 1000; i++) {
RenderTarget.DrawLines(vec2,vec2,Color);
}
for(int i = 0; i < 1000; i++) {
RenderTarget.DrawBitmap(bitmap,rectangle);
}
这是当场写的基本示例。但是,这种方法会慢一点,你需要绘制的内容越多?由于RenderTarget直接链接到设备,因此每次调用GPU都必须刷新状态,停止,与设备驱动程序同步状态,然后绘制新图像。
应该采用什么方法来完成上面提到的这种代码?我使用GDI +有相同的代码,区别在于我们从位图创建一个Graphics,然后使用graphics.DrawImage(bitmapX,rect)绘制到这个位图,然后最终将该图像设置到屏幕。
我相信我刚刚提到的是我应该遵循的方法,使用Direct X将多个位图渲染到屏幕上吗?是否有任何教程可以正确解释如何执行此操作而不是将每个位图直接绘制到非常慢的设备?
提前致谢。
答案 0 :(得分:0)
你最初的假设是错误的; Direct2D1的C / C ++ API在底层使用批处理和延迟渲染,因此提供的示例实际上可以非常有效地完成工作而无需用户进行任何额外的工作。
This简要介绍了D2D1用于实现此批处理的方法。尽管您的项目是用C#编写的,但C / C ++文档是确定正在完成的工作的最佳来源 - SharpDX只是在原生层周围提供了一个非常薄的包装。
现在,正如所说,有一些方法可以改善系统的性能。如果您知道几何体不会改变,请创建一个CPU渲染目标,并将所有内容绘制到一个包含所有内容的位图,并在绘制时进行渲染。或者,如果您的应用程序体系结构支持它,批处理类似的部分并将它们从多个线程渲染到一组不同的CPU绑定渲染目标,并在以后从主线程合并它们。
使用图形的经验法则是预先渲染您可以做的所有事情,并批量处理您不能做的事情(尽管考虑到您引用的GDI +知识,您可能已经知道这一点)。在这里,Direct2D1已经覆盖了批处理,因此除非在使用D2D1时分析显示速度减慢,否则没有太多工作要做。