我最近将一些绘图代码移植到 DirectX 并且对结果非常满意。我们主要使用 bit-bashing 渲染位图,并且看到可以以分钟为单位测量的渲染时间减少到大约 1-2 秒。
这不能直接与您的使用情况进行比较,因为我们已经使用 SlimDX 从 C++ 中的 bit-bashing 到 C# 中的 Direct3D,但我想您会看到性能优势,即使它们不是我们的数量级。重看。
我建议你看看使用 Direct2D 和 SlimDX。您将需要使用 DirectX 10.1,因为 Direct2D 出于某种原因与 DirectX 11 不兼容。如果您在 WPF 中使用过绘图 API,那么您已经熟悉 Direct2D,因为据我所知,它的 API 基于 WPF 绘图 API。Direct2D 的主要问题是缺乏文档,而且它只适用于 Vista 以后的版本。
我没有尝试过 DirectX 10/WPF 互操作,但我相信这是可能的 (http://stackoverflow.com/questions/1252780/d3dimage-using-dx10)
编辑:我想我会从我们绘制简单多边形的代码中给你一个比较。首先是WPF版本:
StreamGeometry geometry = new StreamGeometry();
using (StreamGeometryContext ctx = geometry.Open())
{
foreach (Polygon polygon in mask.Polygons)
{
bool first = true;
foreach (Vector2 p in polygon.Points)
{
Point point = new Point(p.X, p.Y);
if (first)
{
ctx.BeginFigure(point, true, true);
first = false;
}
else
{
ctx.LineTo(point, false, false);
}
}
}
}
现在是 Direct2D 版本:
Texture2D maskTexture = helper.CreateRenderTexture(width, height);
RenderTargetProperties props = new RenderTargetProperties
{
HorizontalDpi = 96,
PixelFormat = new PixelFormat(SlimDX.DXGI.Format.Unknown, AlphaMode.Premultiplied),
Type = RenderTargetType.Default,
Usage = RenderTargetUsage.None,
VerticalDpi = 96,
};
using (SlimDX.Direct2D.Factory factory = new SlimDX.Direct2D.Factory())
using (SlimDX.DXGI.Surface surface = maskTexture.AsSurface())
using (RenderTarget target = RenderTarget.FromDXGI(factory, surface, props))
using (SlimDX.Direct2D.Brush brush = new SolidColorBrush(target, new SlimDX.Color4(System.Drawing.Color.Red)))
using (PathGeometry geometry = new PathGeometry(factory))
using (SimplifiedGeometrySink sink = geometry.Open())
{
foreach (Polygon polygon in mask.Polygons)
{
PointF[] points = new PointF[polygon.Points.Count()];
int i = 0;
foreach (Vector2 p in polygon.Points)
{
points[i++] = new PointF(p.X * width, p.Y * height);
}
sink.BeginFigure(points[0], FigureBegin.Filled);
sink.AddLines(points);
sink.EndFigure(FigureEnd.Closed);
}
sink.Close();
target.BeginDraw();
target.FillGeometry(geometry, brush);
target.EndDraw();
}
如您所见,Direct2D 版本的工作量稍大一些(并且依赖于我编写的一些辅助函数),但实际上非常相似。