最近、いくつかの描画コードをDirectXに移植し、その結果に非常に満足しています。私たちは主にビットバッシングを使用してビットマップをレンダリングしていましたが、数分で測定できるレンダリング時間が約1〜2秒に短縮されました。
SlimDXを使用してC++でのビットバッシングからC#でのDirect3Dに移行したため、これを使用状況と直接比較することはできませんが、桁違いではない場合でも、パフォーマンス上の利点が見られると思います。再見て。
SlimDXでDirect2Dを使用する方法を検討することをお勧めします。Direct2Dは何らかの理由でDirectX11と互換性がないため、DirectX10.1を使用する必要があります。WPFで描画APIを使用したことがある場合は、Direct2DのAPIはWPF描画APIに基づいているため、私が知る限り、Direct2Dについては既にご存知でしょう。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バージョンは少し手間がかかります(そして私が書いたいくつかのヘルパー関数に依存しています)が、実際にはかなり似ています。