You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ScottPlot中高效绘制40000个圆?解决鼠标交互卡顿问题

解决ScottPlot绘制40000个圆卡顿的方案

你的卡顿问题核心是逐个添加独立Ellipse对象导致渲染开销过大——每个Ellipse都是单独的绘图实体,40000个会让GPU和CPU在鼠标交互时重复处理大量独立元素,而Scatter是批量渲染点,效率差几个数量级。不需要更换绘图库,用以下方法优化即可:

方法1:用Scatter批量绘制圆形标记(推荐)

直接利用Scatter的批量渲染能力,用圆形标记替代单独的圆,性能和你之前画点一样高效:

double[] xData = chart.MeasuredData[i].XAxis.ToArray();
double[] yData = chart.MeasuredData[i].YAxis.ToArray();

// 批量创建带圆形标记的散点图
var scatterPlot = wpfPlotGL.Plot.Add.Scatter(xData, yData);
scatterPlot.MarkerShape = MarkerShape.Circle;
scatterPlot.MarkerSize = 2.9; // 对应原椭圆的直径大小
scatterPlot.MarkerColor = Color.FromArgb(255, 0, 0, 0); // 按需设置颜色
scatterPlot.LineWidth = 0; // 不需要点之间的连线就设为0

wpfPlotGL.Refresh();

方法2:批量添加椭圆(若需保留椭圆类型)

如果后续需要绘制非正圆的椭圆,用ScottPlot的批量Ellipse方法,一次性传入所有参数,避免循环创建独立对象:

double[] xData = chart.MeasuredData[i].XAxis.ToArray();
double[] yData = chart.MeasuredData[i].YAxis.ToArray();
// 生成所有椭圆的宽高数组(这里都是2.9,对应正圆)
double[] widths = Enumerable.Repeat(2.9, xData.Length).ToArray();
double[] heights = Enumerable.Repeat(2.9, xData.Length).ToArray();

// 批量添加椭圆,仅创建一个绘图对象
wpfPlotGL.Plot.Add.Ellipses(xData, yData, widths, heights);

wpfPlotGL.Refresh();

额外优化建议

  • 确保使用的是wpfPlotGL(OpenGL后端),它比传统的WpfPlot(GDI+后端)性能高很多,你的代码里已经在用,这点没问题。
  • 若鼠标交互仍有卡顿,可降低抗锯齿级别(在PlotGL的设置里调整),或禁用一些非必要的实时渲染元素(比如网格、坐标轴标签的实时更新)。

内容的提问来源于stack exchange,提问作者최기승

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:21:09