anchor.diff:    Float32List positions;
     Float32List colors;
     Float32List sizes;
  -  Buffer positionsBuffer;
  -  Buffer colorsBuffer;
  -  Buffer sizesBuffer;
  -  int maxLength = 0;
   
     BackgroundDotRenderingSystem(RenderingContext gl)
         : super(gl, Aspect.getAspectForAllOf([Background, Position, Color]));
   
     @override
  -  void processEntities(Iterable<Entity> entities) {
  -    var length = entities.length;
  -    if (length > 0) {
  -      var a_Position = gl.getAttribLocation(program, 'a_Position');
  -      var a_PointSize = gl.getAttribLocation(program, 'a_PointSize');
  -      var a_FragColor = gl.getAttribLocation(program, 'a_FragColor');
  -      if (length > maxLength) {
  -        positions = new Float32List(length * 2);
  -        colors = new Float32List(length * 4);
  -        sizes = new Float32List(length);
  -        maxLength = length;
  -      }
  -      var index = 0;
  -      entities.forEach((entity) {
  -        var p = pm[entity];
  -        var c = cm[entity];
  -        var b = bm[entity];
  -
  -        positions[index * 2] = p.x;
  -        positions[index * 2 + 1] = p.y;
  -        sizes[index] = b.size;
  -        colors[index * 4] = c.red;
  -        colors[index * 4 + 1] = c.green;
  -        colors[index * 4 + 2] = c.blue;
  -        colors[index * 4 + 3] = c.alpha;
  -
  -        index++;
  -      });
  -      positionsBuffer = buffer(a_Position, positions, 2, positionsBuffer);
  -      sizesBuffer = buffer(a_PointSize, sizes, 1, sizesBuffer);
  -      colorsBuffer = buffer(a_FragColor, colors, 4, colorsBuffer);
  -
  -      gl.drawArrays(RenderingContext.POINTS, 0, length);
  -    }
  +  void processEntity(int index, Entity entity) {
  +    var p = pm[entity];
  +    var c = cm[entity];
  +    var b = bm[entity];
  +
  +    positions[index * 2] = p.x;
  +    positions[index * 2 + 1] = p.y;
  +    sizes[index] = b.size;
  +    colors[index * 4] = c.red;
  +    colors[index * 4 + 1] = c.green;
  +    colors[index * 4 + 2] = c.blue;
  +    colors[index * 4 + 3] = c.alpha;
  +  }
  +
  +  @override
  +  void render(int length) {
  +    buffer('a_Position', positions, 2);
  +    buffer('a_PointSize', sizes, 1);
  +    buffer('a_FragColor', colors, 4);
  +
  +    gl.drawArrays(RenderingContext.POINTS, 0, length);
  +  }
  +
  +  @override
  +  void updateLength(int length) {
  +    positions = new Float32List(length * 2);
  +    colors = new Float32List(length * 4);
  +    sizes = new Float32List(length);
     }
   
     String get vShaderSource => '''
  
positive.code:     }
    }
  
    createShader(int type, String source) {
      var shader = gl.createShader(type);
      gl.shaderSource(shader, source);
      gl.compileShader(shader);
  
negative.code: }
  ''';
  
  
  
  }
  