我有一个动态的点列表,可以随时添加新点。我想用不同的颜色画线来连接它们。颜色基于这些点的索引。这是代码:
private List<Point> _points;
private static Pen pen1 = new Pen(Color.Red, 10);
private static Pen pen2 = new Pen(Color.Yellow, 10);
private static Pen pen3 = new Pen(Color.Blue, 10);
private static Pen pen4 = new Pen(Color.Green, 10);
private void Init()
{
// use fixed 80 for simpicity
_points = new List<Point>(80);
for (int i = 0; i < 80; i++)
{
_points.Add(new Point(30 + i * 10, 30));
}
}
private void DrawLinesNormal(PaintEventArgs e)
{
for (int i = 0; i < _points.Count-1; i++)
{
if (i < 20)
e.Graphics.DrawLine(pen1, _points[i], _points[i + 1]);
else if (i < 40)
e.Graphics.DrawLine(pen2, _points[i], _points[i + 1]);
else if (i < 60)
e.Graphics.DrawLine(pen3, _points[i], _points[i + 1]);
else
e.Graphics.DrawLine(pen4, _points[i], _points[i + 1]);
}
}
当我有新的点高速进入时,我发现这种方法不够快。有什么办法可以让它更快吗?我做了一些研究,有人说使用 GraphicsPath 可能会更快,但是如何呢?
[更新]我收集了一些可能的优化:
- 使用图形路径,原始问题 https://stackoverflow.com/questions/1074813/looking-for-a-faster-than-gdi-solution-for-rendering-dynamic-data-plots/1243503#1243503
- 更改图形质量(例如SmoothingMode/PixelOffsetMode...),还调用SetClip来指定唯一需要渲染的区域。
在不损失质量或更改为更快的渲染器(GDI、OpenGL、DirectX)的情况下,您将无法从该代码中获得更高的速度。但 GDI 通常会快很多(可能是 2 倍),而 DirectX/OpenGL 可能会快得多(可能是 10 倍),具体取决于您绘制的内容。
使用 Path 的想法是将许多(在您的示例中为 20)行批处理到单个方法调用中,而不是调用 DrawLine 20 次。仅当您可以将传入数据排列为绘图例程的正确点列表格式时,这才会对您有利。否则,您将必须将点复制到正确的数据结构中,这将浪费您通过批处理到路径中获得的大量时间。对于 DrawPath,您可能必须从点数组创建 GraphicsPath,这可能会导致无法节省时间。但是,如果您必须多次绘制相同的路径,则可以将其缓存,然后您可能会看到净收益。
如果将新点添加到列表中,但旧点未删除(即,您总是只是将新行添加到显示中),那么您将能够使用屏幕外位图来存储到目前为止渲染的行。这样每次添加一个点时,您都会绘制one线,而不是每次都绘制全部 80 条线。
这完全取决于您想要做什么。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)