使用 DirectX 2D 呈现内容的正确方法
Proper way to render content with DirectX 2D
在阅读了许多关于如何使用 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 直接 link 到设备,每次调用 GPU 都必须刷新状态、停止、与设备驱动程序同步状态,然后绘制新图像。
应该用什么方法来完成上面提到的这种代码?我有使用 GDI+ 的相同代码,不同之处在于我们从位图创建图形,然后使用 graphics.DrawImage(bitmapX,rect) 绘制到该位图,最后将该图像设置到屏幕上。
我相信我刚才提到的是使用 Direct X 将多个位图渲染到屏幕时应该遵循的方法,对吗?是否有任何教程可以正确解释如何执行此操作,而不是将每个位图直接绘制到设备上,这真的很慢?
提前致谢。
你最初的假设是错误的; Direct2D1 的 C/C++ API 在后台使用批处理和延迟渲染,因此提供的示例实际上可以非常有效地执行操作,而无需用户进行任何额外的工作。
This 简要说明 D2D1 用于实现此批处理的方法。尽管您的项目是用 C# 编写的,但 C/C++ 文档是了解正在执行的操作的最佳来源 - SharpDX 仅提供了一个非常薄的原生层包装器。
现在,话虽这么说,还是有办法提高系统性能的。如果您知道几何图形不会改变,请创建一个 CPU 渲染目标并将所有内容绘制到一个单一的、包含所有内容的位图中,并在绘制时仅渲染该位图。或者,如果您的应用程序体系结构支持它,将相似的部分分批处理并将它们从多个线程渲染到一组不同的 CPU 绑定渲染目标,然后在主线程中合并它们。
图形方面的经验法则是预渲染所有你能渲染的东西,并批量处理你不能渲染的东西(尽管根据你引用的 GDI+ 知识,你可能已经知道这一点)。在这里,Direct2D1 涵盖了批处理,因此没有太多事情要做,除非分析显示使用 D2D1 时速度变慢。
在阅读了许多关于如何使用 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 直接 link 到设备,每次调用 GPU 都必须刷新状态、停止、与设备驱动程序同步状态,然后绘制新图像。
应该用什么方法来完成上面提到的这种代码?我有使用 GDI+ 的相同代码,不同之处在于我们从位图创建图形,然后使用 graphics.DrawImage(bitmapX,rect) 绘制到该位图,最后将该图像设置到屏幕上。
我相信我刚才提到的是使用 Direct X 将多个位图渲染到屏幕时应该遵循的方法,对吗?是否有任何教程可以正确解释如何执行此操作,而不是将每个位图直接绘制到设备上,这真的很慢?
提前致谢。
你最初的假设是错误的; Direct2D1 的 C/C++ API 在后台使用批处理和延迟渲染,因此提供的示例实际上可以非常有效地执行操作,而无需用户进行任何额外的工作。
This 简要说明 D2D1 用于实现此批处理的方法。尽管您的项目是用 C# 编写的,但 C/C++ 文档是了解正在执行的操作的最佳来源 - SharpDX 仅提供了一个非常薄的原生层包装器。
现在,话虽这么说,还是有办法提高系统性能的。如果您知道几何图形不会改变,请创建一个 CPU 渲染目标并将所有内容绘制到一个单一的、包含所有内容的位图中,并在绘制时仅渲染该位图。或者,如果您的应用程序体系结构支持它,将相似的部分分批处理并将它们从多个线程渲染到一组不同的 CPU 绑定渲染目标,然后在主线程中合并它们。
图形方面的经验法则是预渲染所有你能渲染的东西,并批量处理你不能渲染的东西(尽管根据你引用的 GDI+ 知识,你可能已经知道这一点)。在这里,Direct2D1 涵盖了批处理,因此没有太多事情要做,除非分析显示使用 D2D1 时速度变慢。