Using OpenGL 3.3+ we need to render dynamic 2d text, textures preloaded with FreeType lib, it means A Texture for each Symbol(small texture in fact)

Starting from the code:

glGenBuffers(1, &uRectVertexBuffer);
		glGenBuffers(1, &uRectTexcoordBuffer);

		float recttexcoords[] =
			0, 0,
			1, 0,
			0, 1,
			1, 1,

		glBindBuffer(GL_ARRAY_BUFFER, uRectTexcoordBuffer);
		glBufferData(GL_ARRAY_BUFFER, sizeof(recttexcoords), 
			recttexcoords, GL_STATIC_DRAW);
There is a static Texcoord buffer for rect rendering and dynamic vertex buffer
According to my tests there's no speedup when using index buffering(like very few vertices)

Rendering is accomplished this way:

GLuint lasttexture = 0;

		for(int i = 0; i < ui.textfields.size(); i++)
						1, glm::value_ptr(ui.textfields[i].color));
			for(int j = 0; 
				j < ui.textfields[i].text.length;
				Font* f = FontPool::GetFont(ui.textfields[i].font, ui.textfields[i].size);
				if(!f) continue;
				Glyph g = f->data[ui.textfields[i].text[j]];

				number w = g.width * scalex;
				number h = g.rows * scaley;

				if(lasttexture != g.texture)
					lasttexture = g.texture;

				float x = ui.textfields[i].screenLeft * 2.0 +
					ui.textfields[i].pixelLeft * scalex - 1.0 +
					ui.textfields[i].offsetx[j] * scalex;
				float y = -ui.textfields[i].screenTop * 2.0 -
					ui.textfields[i].pixelTop * scaley + 1.0 +
					ui.textfields[i].offsety[j] * scaley;

				float rectvertices[] =
					x, y,
					x + w, y,
					x, y - h,
					x + w, y - h,

				glBufferData(GL_ARRAY_BUFFER, sizeof(rectvertices), rectvertices, GL_DYNAMIC_DRAW);

				glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
Texture sorting didn't make me win a lot of render time, and i'm to lazy to sort texts by texture using trees, so i skip this

The performance problem is totally in dynamic vertex buffer, it's very slow
For static texts i can use static vbo's(or even images), but it's useless in dynamic texts
As you see each symbol takes it to transform 8 x float to GPU
I also tried using static vbo that renders quad all over the window, and using glsl uniform mat4 scaling and translating it to the right position, in was kind of faster(somewhy) but there was a big precision problem, the text became blury

Shaders are like: and

FPS is dropping like:

The question is: how can I make this render faster?