anchor.diff:      vatTile:       if fTilesVtxCount > 0 then
                       begin
                         glBindBuffer(GL_ARRAY_BUFFER, fVtxTilesShd);
  -                      glBufferData(GL_ARRAY_BUFFER, fTilesVtxCount * SizeOf(TTileVerticeExt), @fTilesVtx[0].X, GL_STREAM_DRAW);
  -
                         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, fIndTilesShd);
  -                      glBufferData(GL_ELEMENT_ARRAY_BUFFER, fTilesIndCount * SizeOf(fTilesInd[0]), @fTilesInd[0], GL_STREAM_DRAW);
  +
  +                      if fVBONeedsFlush[aVBOArrayType] then
  +                      begin
  +                        glBufferData(GL_ARRAY_BUFFER, fTilesVtxCount * SizeOf(TTileVerticeExt), @fTilesVtx[0].X, GL_STREAM_DRAW);
  +                        glBufferData(GL_ELEMENT_ARRAY_BUFFER, fTilesIndCount * SizeOf(fTilesInd[0]), @fTilesInd[0], GL_STREAM_DRAW);
  +                        fVBONeedsFlush[aVBOArrayType] := False;
  +                      end;
                       end else Exit;
       vatTileLayer:  if Length(fTilesLayersVtx) > 0 then
                       begin
                         glBindBuffer(GL_ARRAY_BUFFER, fVtxTilesLayersShd);
  -                      glBufferData(GL_ARRAY_BUFFER, Length(fTilesLayersVtx) * SizeOf(TTileVertice), @fTilesLayersVtx[0].X, GL_STREAM_DRAW);
  -
                         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, fIndTilesLayersShd);
  -                      glBufferData(GL_ELEMENT_ARRAY_BUFFER, Length(fTilesLayersInd) * SizeOf(fTilesLayersInd[0]), @fTilesLayersInd[0], GL_STREAM_DRAW);
  +
  +                      if fVBONeedsFlush[aVBOArrayType] then
  +                      begin
  +                        glBufferData(GL_ARRAY_BUFFER, Length(fTilesLayersVtx) * SizeOf(TTileVertice), @fTilesLayersVtx[0].X, GL_STREAM_DRAW);
  +                        glBufferData(GL_ELEMENT_ARRAY_BUFFER, Length(fTilesLayersInd) * SizeOf(fTilesLayersInd[0]), @fTilesLayersInd[0], GL_STREAM_DRAW);
  +                        fVBONeedsFlush[aVBOArrayType] := False;
  +                      end;
                       end else Exit;
       vatAnimTile:   if fAnimTilesVtxCount > 0 then
                       begin
                         glBindBuffer(GL_ARRAY_BUFFER, fVtxAnimTilesShd);
  -                      glBufferData(GL_ARRAY_BUFFER, fAnimTilesVtxCount * SizeOf(TTileVertice), @fAnimTilesVtx[0].X, GL_STREAM_DRAW);
  -
                         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, fIndAnimTilesShd);
  -                      glBufferData(GL_ELEMENT_ARRAY_BUFFER, fAnimTilesIndCount * SizeOf(fAnimTilesInd[0]), @fAnimTilesInd[0], GL_STREAM_DRAW);
  +
  +                      if fVBONeedsFlush[aVBOArrayType] then
  +                      begin
  +                        glBufferData(GL_ARRAY_BUFFER, fAnimTilesVtxCount * SizeOf(TTileVertice), @fAnimTilesVtx[0].X, GL_STREAM_DRAW);
  +                        glBufferData(GL_ELEMENT_ARRAY_BUFFER, fAnimTilesIndCount * SizeOf(fAnimTilesInd[0]), @fAnimTilesInd[0], GL_STREAM_DRAW);
  +                        fVBONeedsFlush[aVBOArrayType] := False;
  +                      end;
                       end else Exit;
       vatFOW:        if fTilesFowVtxCount > 0 then
                       begin
                         glBindBuffer(GL_ARRAY_BUFFER, fVtxTilesFowShd);
  -                      glBufferData(GL_ARRAY_BUFFER, fTilesFowVtxCount * SizeOf(TTileFowVertice), @fTilesFowVtx[0].X, GL_STREAM_DRAW);
  -
                         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, fIndTilesFowShd);
  -                      glBufferData(GL_ELEMENT_ARRAY_BUFFER, fTilesFowIndCount * SizeOf(fTilesFowInd[0]), @fTilesFowInd[0], GL_STREAM_DRAW);
  +
  +                      if fVBONeedsFlush[aVBOArrayType] then
  +                      begin
  +                        glBufferData(GL_ARRAY_BUFFER, fTilesFowVtxCount * SizeOf(TTileFowVertice), @fTilesFowVtx[0].X, GL_STREAM_DRAW);
  +                        glBufferData(GL_ELEMENT_ARRAY_BUFFER, fTilesFowIndCount * SizeOf(fTilesFowInd[0]), @fTilesFowInd[0], GL_STREAM_DRAW);
  +                        fVBONeedsFlush[aVBOArrayType] := False;
  +                      end;
                       end else Exit;
     end;
     fLastBindVBOArrayType := aVBOArrayType;
  
positive.code: //  SetLength(fTilesLayersVtx, P);
  //  TilesLayersCnt := P div 4;
  //  SetLength(fTileslayersInd, TilesLayersCnt*6);
  
    gPerfLogs.SectionLeave(psFrameUpdateVBO);
  end;
  
negative.code:   TexTileC: TUVRect;
    AL: TAnimLayer;
    TexOffsetWater, TexOffsetFalls, TexOffsetSwamp: Word;
    V: TVBOArrayType;
  begin
    if not fUseVBO then Exit;
    gPerfLogs.SectionEnter(psFrameUpdateVBO);
  