我的代码很慢,我不知道如何修复它?

my code is slow and I have no idea how to fix it?

我正在制作一个程序,您可以在其中绘制,当超过 38000 _points 时它开始滞后。

代码如下:

public class _point {
  float x = 0;
  float y = 0;

  boolean active = true;

  color c = color(255, 255, 255);

  public void _point() {
  }
  public void change_pos(float x1, float y1, color c1)
  {
    x = x1;
    y = y1;
    c = c1;
  }
  public void u_line(float px, float py)
  {
    if (dist(x, y, px, py) < 15)
    {
      stroke(c);
      strokeWeight(5);
      line(x, y, px, py);
    }
  }
  public void remove_beans()
  {
    if (eraser) {
      if (dist(x, y, mouseX, mouseY)<main_tool.radius/2) {
        active = false;
      }
    }
  }
  public void a_line()
  {
    for (int i = 0; i < _points.size(); ++i) {
      _point part = _points.get(i);

      if (dist(x, y, part.x, part.y) < 15)
      {
        line(x, y, part.x, part.y);
      }
    }
  }
}

绘制位置:

ArrayList<_point> _points = new ArrayList<_point>();
void draw_beans() {
  for (int i = 0; i < _points.size(); ++i) {
    _point part = _points.get(i);

    if (part.active == false) {
      _points.remove(i);
    }

    if (i != 0 && i != _points.size()-1 && i != _points.size()) {
      OPTIMIZE(_points.get(i+1), part, _points.get(i-1));
    }

    if (i != 0) {
      _point past = _points.get(i-1);

      part.u_line(past.x, past.y);//past.x,past.y
    }
  }
}

这是将点添加到数组的情况:

void add_beans() {
  if (!eraser && !IIIINNZ()) {
    _points.add(new _point());
    _point part = _points.get(_points.size()-1);
    part.change_pos(mouseX-transX, mouseY-transY, color(int(color_text0.texts), int(color_text1.texts), int(color_text2.texts)));
  }
  for (int i = 0; i < _points.size(); ++i) {
    if (eraser && !IIIINNZ()) {
      _point part = _points.get(i);
      part.remove_beans();
    }
  }
}

和优化:

void OPTIMIZE(_point next, _point thiss, _point prev) {
  if (dist(thiss.x, thiss.y, next.x, next.y)+dist(thiss.x, thiss.y, prev.x, prev.y)<14) {
    thiss.active = false;
  }
}

设置:

void setup() {
  size(512, 512);
  noCursor();
}

平局:

void draw() {
  background(#222833);//27,27,33
  textFont(font);

  pushMatrix();
  translate(transX, transY);
  draw_beans();
  popMatrix();

  show_options();

  main_tool.update();

  println(_points.size());
}

我试过对其进行多线程处理,但线程与动画线程不对齐,因此存在缺失点。

我正在使用 Processing 3 java 库和 vscode。

不清楚 OPTIMIZEIIIINNZ 的作用。

如果无法 运行 您的代码和测试,我无法判断这些函数是否会减慢它的速度,或者它只是(重新)渲染。

我建议使用 VisualVM 来分析草图(PApplet 子类)的 CPU 用法。 CPU Profiler 将从最慢的开始列出方法:

将您的精力集中在最慢的顶部,尽可能不要牺牲代码的可读性。

(关于代码可读性,我建议整体使用 Java Style 指南。它将节省时间 scanning/reading 越来越长的程序)

你的问题让我想起了一点an older one I answered a while ago

相似之处在于渲染的线条较多。另外你使用 distance() (这反过来使用 Math.sqrt() 这可能会花费 CPU 一点,但与渲染一样多。你可以改用平方距离,但这将使代码有点难读,如果与渲染相比不是那么慢,我会把它留在里面)。

本质上有很多点实例根据阈值距离渲染线。每个 stroke()strokeWeight()line() 调用都会产生费用。

我试图将线渲染分组为更简单的东西:访问所有点实例的单个形状:

void draw_beans() {
  beginShape(LINES);
  for (int i = 0; i < points.size(); ++i) {
    Point part = points.get(i);
    
    
    if (part.active == false) {
      points.remove(i);
    }

    //if (i != 0 && i != points.size()-1 && i != points.size()) {
    //  OPTIMIZE(points.get(i+1), part, points.get(i-1));
    //}

    if (i != 0) {
      Point past = points.get(i-1);

      //part.u_line(past.x, past.y);//past.x,past.y
      vertex(past.x, past.y);
    }
  }
  endShape();
}

这几乎没有什么影响,即使它会更快,它也会受到限制。

值得一提的是 line() 是如何在每个渲染器的后台实现的。令人惊讶的是,FX2D 渲染器可能更适合您的设置(例如 size(512, 512, FX2D);