gpt4 book ai didi

.net - 为什么我的 Direct2D 绘图性能如此糟糕?

转载 作者:行者123 更新时间:2023-12-04 04:35:27 25 4
gpt4 key购买 nike

我正在 Win7 上开发一个需要执行映射的 Dotnet 4.0 应用程序。作为 map 应用程序,它输出大量高分辨率抗锯齿多边形。它目前支持两种类型的渲染输出,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();

在此示例代码中,我使用一个路径和每个多边形一个图形。原因是因为它更接近地反射(reflect)了 GDI+ 实现,并且在实际应用程序中而不是示例代码中,它简化了所选多边形的渲染。我知道我可以使用单个路径和多个图形,并且我已经尝试过这种方式,它稍微快一点,但不足以对一般问题产生影响。

我也在使用 TransformedGeometry 而不是在 RenderTarget 上设置变换。这样做的原因是,虽然我希望几何图形被转换,但我不希望轮廓被转换,因为缩放因子会导致它完全消失。

在我使用的特定示例数据中,只有几百个多边形,但每个多边形可以有几千个点,所以我不认为在渲染过程中分配多个 PathGeometry 和 TransformedGeometry 是问题,(因为有不是很多,我已经尝试过只使用一个 PathGeometry 和 TransformedGeometry 并且差异很小)。

我想知道我是否不应该渲染到屏幕外的 RenderTarget 并将结果传输到屏幕上的 RenderTarget,但我已经阅读了 MSDN 上关于提高 Direct2D 性能的文章,但它没有提到这是一种优化。

有人有任何想法吗?

最佳答案

我相信你的绘图程序过于频繁地创建资源,这真的很耗时。几何和汇是 device-independent resources ,您应该创建并保留它们,只要它们不被修改。这些修改通常发生在您...更改应该绘制的内容时,当然,以及当您移动/调整窗口大小或平移/缩放内容时。然后,您的绘图例程只会绘制已经存在的资源,并且速度应该会更快。

希望这可以帮助。

关于.net - 为什么我的 Direct2D 绘图性能如此糟糕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13603254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com