gpt4 book ai didi

c# - 具有大量几何图形的 WPF 绘图性能

转载 作者:太空狗 更新时间:2023-10-29 17:53:02 25 4
gpt4 key购买 nike

我在 WPF 绘图性能方面遇到问题。有很多小的 EllipseGeometry 对象(例如 1024 个椭圆),它们被添加到具有不同前景画笔的三个独立的 GeometryGroups 中。之后,我将其全部呈现在简单的图像控件上。代码:

DrawingGroup tmpDrawing = new DrawingGroup();
GeometryGroup onGroup = new GeometryGroup();
GeometryGroup offGroup = new GeometryGroup();
GeometryGroup disabledGroup = new GeometryGroup();

for (int x = 0; x < DisplayWidth; ++x)
{
for (int y = 0; y < DisplayHeight; ++y)
{
if (States[x, y] == true) onGroup.Children.Add(new EllipseGeometry(new Rect((double)x * EDGE, (double)y * EDGE, EDGE, EDGE)));
else if (States[x, y] == false) offGroup.Children.Add(new EllipseGeometry(new Rect((double)x * EDGE, (double)y * EDGE, EDGE, EDGE)));
else disabledGroup.Children.Add(new EllipseGeometry(new Rect((double)x * EDGE, (double)y * EDGE, EDGE, EDGE)));
}
}

tmpDrawing.Children.Add(new GeometryDrawing(OnBrush, null, onGroup));
tmpDrawing.Children.Add(new GeometryDrawing(OffBrush, null, offGroup));
tmpDrawing.Children.Add(new GeometryDrawing(DisabledBrush, null, disabledGroup));
DisplayImage.Source = new DrawingImage(tmpDrawing);

它工作正常,但需要太多时间 - 在 Core 2 Quad 上 >0.5s,在 Pentium 4 上 >2s。我到处都需要 <0.1s。如您所见,所有椭圆都是相等的。控件的背景,也就是我的 DisplayImage,是实心的(例如黑色),所以我们可以使用这个事实。我尝试使用 1024 个 Ellipse 元素而不是带有 EllipseGeometries 的 Image,它运行得更快(~0.5s),但还不够。如何加速?

问候,奥列格·叶列梅耶夫

附言对不起我的英语。

最佳答案

我保留了旧的渲染方法,但每次都创建新的 EllipseGeometry 对象是个坏主意,所以我以这种方式对其进行了优化:

for (int x = 0; x < newWidth; ++x)
{
for (int y = 0; y < newHeight; ++y)
{
States[x, y] = null;
OnEllipses[x, y] = new EllipseGeometry(new Rect((double)x * EDGE + 0.5f, (double)y * EDGE + 0.5f, EDGE - 1f, EDGE - 1f));
OffEllipses[x, y] = new EllipseGeometry(new Rect((double)x * EDGE + 0.5f, (double)y * EDGE + 0.5f, EDGE - 1f, EDGE - 1f));
DisabledEllipses[x, y] = new EllipseGeometry(new Rect((double)x * EDGE + 0.5f, (double)y * EDGE + 0.5f, EDGE - 1f, EDGE - 1f));
}
}

// . . .

DrawingGroup tmpDrawing = new DrawingGroup();
GeometryGroup onGroup = new GeometryGroup();
GeometryGroup offGroup = new GeometryGroup();
GeometryGroup disabledGroup = new GeometryGroup();

for (int x = 0; x < DisplayWidth; ++x)
{
for (int y = 0; y < DisplayHeight; ++y)
{
if (States[x, y] == true) onGroup.Children.Add(OnEllipses[x, y]);
else if (States[x, y] == false) offGroup.Children.Add(OffEllipses[x, y]);
else disabledGroup.Children.Add(DisabledEllipses[x, y]);
}
}

tmpDrawing.Children.Add(new GeometryDrawing(OnBrush, null, onGroup));
tmpDrawing.Children.Add(new GeometryDrawing(OffBrush, null, offGroup));
tmpDrawing.Children.Add(new GeometryDrawing(DisabledBrush, null, disabledGroup));
DisplayImage.Source = new DrawingImage(tmpDrawing);

对于 x = 128 和 y = 8,它运行得非常快,即使在 Pentium III 系统上也是如此。

关于c# - 具有大量几何图形的 WPF 绘图性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2393532/

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