我正在Win7上开发一个需要执行映射的Dotnet 4.0应用程序.作为地图绘制应用程序,它输出高分辨率抗锯齿多边形的垃圾负载.它目前支持两种类型的渲染输出,GDI +和Direct2D.
我担心因为GDI +输出比Direct2D快3倍左右.
两个渲染器都使用AA.我知道我可以在Direct2D中关闭它,这有点提高了吞吐量(比GDI +差了大约2倍).但这不是一个解决方案,因为我可以在GDI +中关闭AA并在那里获得更好的性能.出于此基准测试的目的,我的渲染代码是微不足道的.我希望我犯了一些可怕的错误,有人可以指出我会纠正这种情况.
_renderTarget.BeginDraw();
// Paint background.
RectF rf = new RectF(0.0f, 0.0f, renderTargetSize.Width, renderTargetSize.Height);
_renderTarget.FillRectangle(rf, _backgroundBrush);
// Draw polygons
foreach (GisTypes.Polygon polygon in _polygons)
{
using (PathGeometry path = _factory.CreatePathGeometry())
{
using (GeometrySink sink = path.Open())
{
sink.SetFillMode(Microsoft.WindowsAPICodePack.DirectX.Direct2D1
.FillMode.Alternate);
Point2F[] points = Array.ConvertAll(polygon.Points,
x => new Point2F((float)x.X, (float)x.Y));
sink.BeginFigure(points[0], FigureBegin.Filled);
for (int i = 1; i < points.Length; ++i)
{
sink.AddLine(points[i]);
}
sink.EndFigure(FigureEnd.Closed);
sink.Close();
}
using (TransformedGeometry transformedPath = _factory.CreateTransformedGeometry(
path, WorldToPage))
{
_renderTarget.FillGeometry(transformedPath, _fillBrush);
_renderTarget.DrawGeometry(transformedPath, _borderBrush, 1.0f);
}
}
}
_renderTarget.EndDraw();
Run Code Online (Sandbox Code Playgroud)
在这个示例代码中,我使用一个路径和每个多边形一个数字.原因是它更接近于GDI +实现和实际应用,而不是示例代码,它简化了所选多边形的渲染.我知道我可以使用单一路径和多个数字,我已经尝试过这种方式,它稍微快一点但不足以对一般问题产生影响.
我也使用TransformedGeometry而不是在RenderTarget上设置变换.原因是因为虽然我想要转换几何体,但我不希望轮廓被转换,因为缩放因子会导致它完全消失.
在我使用的特定样本数据中,只有几百个多边形,但每个多边形可以有几千个点,所以我不认为渲染过程中多个PathGeometry和TransformedGeometry的分配是问题,(因为那里并不是很多,我已经尝试过只使用一个PathGeometry和TransformedGeometry,差别很小.
我想知道我是否应该渲染到屏幕外的RenderTarget并将结果显示在屏幕上的RenderTarget上,但我已经阅读了有关改进Direct2D性能的MSDN文章,并且没有提到这是一个优化.
有人有任何想法吗?
| 归档时间: |
|
| 查看次数: |
4225 次 |
| 最近记录: |