मैंने हाल ही में डायरेक्टएक्स पर कुछ ड्राइंग कोड पोर्ट किया है और परिणाम से बहुत खुश हैं। हम मुख्य रूप से बिट-बैशिंग का उपयोग करके बिटमैप्स प्रस्तुत कर रहे थे और रेंडर समय देख रहे थे जिन्हें मिनटों में लगभग 1-2 सेकंड तक मापा जा सकता था।
यह सीधे आपके उपयोग की तुलना नहीं किया जा सकता है, क्योंकि हम सी ++ में सीडी में डायरेक्ट 3 डी में स्लिम डीएक्स का उपयोग करके बिट-बैशिंग से चले गए हैं, लेकिन मुझे लगता है कि आप प्रदर्शन लाभ देखेंगे, भले ही वे ऑर्डर न हों परिमाण का हम देख रहे हैं।
मैं आपको स्लिम डीएक्स के साथ डायरेक्ट 2 डी का उपयोग करने की सलाह दूंगा। आपको DirectX 10.1 का उपयोग करने की आवश्यकता होगी क्योंकि Direct2D किसी कारण से DirectX 11 के साथ संगत नहीं है। यदि आपने डब्ल्यूपीएफ में ड्राइंग एपीआई का उपयोग किया है तो आप डायरेक्ट 2 डी से पहले ही परिचित होंगे क्योंकि इसकी एपीआई डब्ल्यूपीएफ ड्राइंग एपीआई पर आधारित है, जहां तक मैं कह सकता हूं। डायरेक्ट 2 डी के साथ मुख्य समस्या दस्तावेज की कमी है और तथ्य यह है कि यह केवल 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 संस्करण से थोड़ा अधिक काम है (और कुछ सहायक कार्यों मैं लिखा है पर निर्भर करता है), लेकिन यह वास्तव में बहुत समान है।
जीडीआई + धीमी। जीडीआई तेजी से लेकिन बदसूरत। डी 2 डी बेहतर है लेकिन धीमा है। स्लिम डीएक्स एक बड़ी निर्भरता और बड़े अमूर्त सीखने की वक्र है। तीसरा विकल्प, डीएक्स 9 या (डीएक्सजीआई के माध्यम से डीएक्स 11) का उपयोग करके, क्योंकि यह डब्ल्यूपीएफ डी 3DImage इंटरफ़ेस के साथ हिलाता है। एक सीखने की अवस्था को मंजूरी दी, लेकिन एक 3 डीएक्स डिवाइस, संदर्भ, बफर, शेडर बनाने और डायरेक्ट 3 डी के माध्यम से अपना ऐप प्रतिपादन प्राप्त करने के लिए अधिक रखरखाव योग्य। दस्तावेज भयानक है और इसमें कुछ शोध और परीक्षण त्रुटि होगी लेकिन ऐसा लगता है कि यह उतना बुरा नहीं है जितना लगता है। असली दुनिया के लिए यहां देखें [18 मेग डेमो डाउनलोड] (http://www.gigasoft.com) में डब्ल्यूपीएफ विनफॉर्म और एमएफसी, और इसका ज्यादातर डब्ल्यूएवी और जीआईएस डेटा शामिल है। – Robert