anchor.diff:    Mapper<Particle> particleMapper;
     Float32List positions;
     Float32List colors;
  -  Buffer positionsBuffer;
  -  Buffer colorsBuffer;
     int maxLength = 0;
   
     ParticleRenderingSystem(RenderingContext gl) : super(gl, Aspect.getAspectForAllOf([Particle, Color, Position]));
   
     @override
  -  void processEntities(Iterable<Entity> entities) {
  -    var length = entities.length;
  -    if (length > 0) {
  -      var a_Position = gl.getAttribLocation(program, 'a_Position');
  -      var a_Color = gl.getAttribLocation(program, 'a_Color');
  -
  -      if (length > maxLength) {
  -        positions = new Float32List(length * 2);
  -        colors = new Float32List(length * 4);
  -        maxLength = length;
  -      }
  -      var index = 0;
  -      entities.forEach((entity) {
  -        var p = pm[entity];
  -        var c = cm[entity];
  -        var particle = particleMapper[entity];
  -
  -        positions[index * 2] = p.x;
  -        positions[index * 2 + 1] = p.y;
  -        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);
  -      colorsBuffer = buffer(a_Color, colors, 4, colorsBuffer);
  -
  -      gl.drawArrays(RenderingContext.POINTS, 0, length);
  -    }
  -  }
  -
  +  void processEntity(int index, Entity entity) {
  +    var p = pm[entity];
  +    var c = cm[entity];
  +    var particle = particleMapper[entity];
  +
  +    positions[index * 2] = p.x;
  +    positions[index * 2 + 1] = p.y;
  +    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_Color', colors, 4);
  +
  +    gl.drawArrays(RenderingContext.POINTS, 0, length);
  +  }
  +
  +  @override
  +  void updateLength(int length) {
  +    positions = new Float32List(length * 2);
  +    colors = new Float32List(length * 4);
  +  }
   
     @override
     String get vShaderSource => '''
  
positive.code:     gl.useProgram(program);
    }
  
    Buffer buffer(int index, Float32List items, int itemSize, Buffer buffer) {
      var vertexBuffer = null == buffer ? gl.createBuffer() : buffer;
      gl.bindBuffer(RenderingContext.ARRAY_BUFFER, vertexBuffer);
      gl.bufferData(RenderingContext.ARRAY_BUFFER, items, RenderingContext.STREAM_DRAW);
      gl.vertexAttribPointer(index, itemSize, RenderingContext.FLOAT, false, 0, 0);
      gl.enableVertexAttribArray(index);
      return vertexBuffer;
    }
  
    @override
    bool checkProcessing() => success;
  
    String get vShaderSource;
    String get fShaderSource;
  }
  
negative.code:   RenderingContext gl;
    Program program;
    bool success = true;
    Map<String, Buffer> buffers = <String, Buffer>{};
    int maxLength = 0;
  
    WebGlRenderingSystem(this.gl, Aspect aspect) : super(aspect);
  
    @override
    void initialize() {
      var vShader = _createShader(RenderingContext.VERTEX_SHADER, vShaderSource);
      var fShader = _createShader(RenderingContext.FRAGMENT_SHADER, fShaderSource);
  
      _createProgram(vShader, fShader);
    }
  
    void _createProgram(Shader vShader, Shader fShader) {
      program = gl.createProgram();
      gl.attachShader(program, vShader);
      gl.attachShader(program, fShader);
  