title: Drawing lots of particles efficiently
body: <p>I have written a particle system applet; currently I am creating, and drawing each particle separately.
  (Here is the code)</p>
  
  <pre><code>BufferedImage backbuffer;
  Graphics2D g2d;
  
  public void init(){
      backbuffer = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);
      g2d = backbuffer.createGraphics();
      setSize(WIDTH, HEIGHT);
  
      //creates the particles
      for (int i = 0; i &lt; AMOUNTPARTICLES; i++) {
          prtl[i] = new particleO();
          prtl[i].setX(rand.nextInt(STARTX));
          prtl[i].setY(rand.nextInt(STARTY));
          prtl[i].setVel(rand.nextInt(MAXSPEED)+1);
          prtl[i].setFAngle(Math.toRadians(rand.nextInt(ANGLESPREAD)));
  
          }
  
      //other code
  }
  
  
  
      public void update(Graphics g) {        
  
      g2d.setTransform(identity);
  
      //set background
      g2d.setPaint(BGCOLOUR);
      g2d.fillRect(0,0,getSize().width,getSize().height);
      drawp();
      paint(g);           
      }
  
  
  public void drawp() {
  
      for (int n = 0; n &lt; AMOUNTPARTICLES; n++) {
  
      if (prtl[n].getAlive()==true){
              g2d.setTransform(identity);
              g2d.translate(prtl[n].getX(), prtl[n].getY());
              g2d.setColor(prtl[n].getColor());
  
              g2d.fill(prtl[n].getShape());
  
  
              }
      }
  
  }
  </code></pre>
  
  <p>It's performance was alright, I could get ~40FPS with 20,000 particles (although, I have a decent laptop). But after I added collision detection (see below), that number plummeted to less than 2000,</p>
  
  <pre><code>public void particleUpdate(){
   for (int i = 0; i &lt; AMOUNTPARTICLES; i++) {
          //other update code (posx, posy, angle etc etc)
  
            for (int j = 0; j &lt; AMOUNTPARTICLES; j++) {
  
                  if (i!=j &amp;&amp; prtl[j].getAlive()==true){
  
                       if(hasCollided(i, j)){
                          prtl[i].setcolor(Color.BLACK);
                          prtl[j].setcolor(Color.BLACK);
       }
              }
    }
  
  public boolean hasCollided(int prt1, int prt2){
  
          double dx = prtl[prt1].getX() - prtl[prt2].getX();
          double dy = prtl[prt1].getY() - prtl[prt2].getY();
          int edges =  prtl[prt1].getRadius() + prtl[prt2].getRadius();
  
          double distance = Math.sqrt( (dx*dx) + (dy*dy) );
          return (distance &lt;= edges);
  
  
      }
  </code></pre>
  
  <p>I have searched quite a bit for a better way of drawing the particles to the screen, but the examples either confused me, or were not applicable.</p>
  
  <p>I am doing a boat load of calculations (too many). But I couldn’t think of another way of doing it, suggestions are welcome.</p>