Я недавно портировал код рисования на DirectX и был очень доволен результатами. В основном мы рисовали растровые изображения, используя бит-биение, и видим время визуализации, которое можно измерить в минутах, уменьшенном до 1-2 секунд.
Это не может сравниться с вами по-другому, поскольку мы перешли от бит-биения в C++ к Direct3D на C# с использованием SlimDX, но, я думаю, вы увидите преимущества производительности, даже если они не являются заказами как мы видим.
Я бы посоветовал вам взглянуть на использование Direct2D с помощью SlimDX. Вам нужно будет использовать DirectX 10.1, поскольку Direct2D по какой-то причине не совместим с DirectX 11. Если вы использовали API-интерфейс рисования в WPF, то вы уже будете знакомы с Direct2D, поскольку его API основан на API-интерфейсе WPF, насколько я могу судить. Основные проблемы с Direct2D - отсутствие документации и тот факт, что она работает только в Vista.
Я не экспериментировал с DirectX 10/WPF Interop, но я считаю, что это возможно (http://stackoverflow.com/questions/1252780/d3dimage-using-dx10)
EDIT: Я думал, 'дайте вам сравнение с нашим кодом рисования простого многоугольника. Первая версия 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 немного больше работы (и опирается на несколько вспомогательных функций, которые я написал), но это на самом деле очень похоже.
GDI + медленный. GDI быстро, но некрасиво. D2D лучше, но медленнее. SlimDX - это огромная зависимость и большая абстрактная кривая обучения. 3-й вариант, используя DX9 или (DX11 через DXGI), когда он дрожит с интерфейсом WPF D3DImage. Предоставлена кривая обучения, но более удобна для создания 3DX-устройства, контекста, буферов, шейдеров и получения рендеринга вашего приложения через Direct3D. Документация ужасная, и это потребует некоторой пробной и пробной ошибки, но это не так плохо, как кажется. См. Здесь для маленького реального мира [18-мегапиксельная загрузка] (http://www.gigasoft.com) включает в себя WPF WinForm и MFC, а также его главным образом данные WAV и ГИС. – Robert