Ho recentemente portato un po 'di codice di disegno su DirectX e sono stato molto soddisfatto dei risultati. Stavamo principalmente rendendo bitmap usando bit-bashing e vediamo tempi di rendering che potevano essere misurati in minuti ridotti a circa 1-2 secondi.
Questo non può essere confrontato direttamente a voi l'utilizzo, come siamo passati da po-colpire in C++ per Direct3D in C# utilizzando SlimDX, ma immagino si vedrà benefici delle prestazioni, anche se non sono gli ordini di magnitudine stiamo vedendo.
Consiglierei di dare un'occhiata all'utilizzo di Direct2D con SlimDX. È necessario utilizzare DirectX 10.1 poiché Direct2D non è compatibile con DirectX 11 per qualche motivo. Se hai utilizzato l'API di disegno in WPF, avrai già familiarità con Direct2D poiché la sua API si basa sull'API di disegno WPF per quanto ne so. I problemi principali con Direct2D sono la mancanza di documentazione e il fatto che funziona solo in Vista in poi.
non ho sperimentato con DirectX 10/WPF interoperabilità, ma credo che sia possibile (http://stackoverflow.com/questions/1252780/d3dimage-using-dx10)
EDIT: ho pensato che Ti do un paragone dal nostro codice per disegnare un semplice poligono. In primo luogo la versione 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);
}
}
}
}
Ora la versione 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();
}
Come si può vedere, la versione Direct2D è leggermente più lavoro (e si basa su alcune funzioni di aiuto che ho scritto), ma in realtà è molto simile.
GDI + lento. GDI veloce ma brutto. D2D è migliore ma lento. SlimDX è un'enorme dipendenza e una grande curva di apprendimento astratto. Terza opzione, usando DX9 o (DX11 via DXGI) mentre si stringe con l'interfaccia D3DImage di WPF. Concessa una curva di apprendimento, ma più manutenibile per creare un dispositivo 3DX, contesto, buffer, shader e ottenere il rendering dell'app tramite Direct3D. La documentazione è terribile e ci vorrà qualche ricerca e un errore di prova, ma non è così male come sembra. Vedi qui per un piccolo mondo reale [18 meg demo download] (http://www.gigasoft.com) include WPF WinForm e MFC, e la maggior parte dei dati WAV e GIS. – Robert