Я использую OpenGL для рендеринга текста в моем приложении, в моей реализации глиф - это небольшая текстура, рендеринг работает правильно, но производительность слишком низкая. Ниже приведен фрагмент кода, когда макет содержит 8000 глифов, для завершения рендеринга потребовалось около 200 мс (функция рендеринга), я думаю, что цикл for является ключом для замедления процесса рендеринга, возможно, для рендеринга каждого отдельного глифа как текстура - это «дурацкий путь» :(, есть ли способ улучшить производительность рендеринга текста?
#define FONT_BITMAP_WIDTH 128
#define FONT_BITMAP_HEIGHT 128
void setupOpenGL() {
...
...
// create pixel buffer object to render texture
glGenBuffers(1, &_pixelBuffer);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, _pixelBuffer);
glBufferData(GL_PIXEL_UNPACK_BUFFER,
FONT_BITMAP_WIDTH * FONT_BITMAP_HEIGHT,
NULL,
GL_STREAM_DRAW);
...
...
// create texture
glTexImage2D(GL_TEXTURE_2D,
0,
GL_RED,
FONT_BITMAP_WIDTH,
FONT_BITMAP_HEIGHT,
0,
GL_RED,
GL_UNSIGNED_BYTE,
NULL);
...
...
}
void render(Glyph** glyphs, int count) {
// render every single glyph
for (int i = 0; i < count; i ++) {
// caculate glyph vertex position
float x0 = glyphs[i]->rect.origin.x;
float y0 = glyphs[i]->rect.origin.y;
float x1 = x0 + FONT_BITMAP_WIDTH;
float y1 = y0 + FONT_BITMAP_HEIGHT;
float positions[] = {
x0, y1, 0.0, 1.0,
x1, y1, 0.0, 1.0,
x0, y0, 0.0, 1.0,
x1, y0, 0.0, 1.0,
};
float textureCoords[] = {
0.0f, 1.0f,
1.0f, 1.0f,
0.0f, 0.0f,
1.0f, 0.0f,
};
// submit vertex and texture coordinate data
glBufferSubData(GL_ARRAY_BUFFER,
0,
sizeof(positions),
positions);
glBufferSubData(GL_ARRAY_BUFFER,
sizeof(positions),
sizeof(textureCoords),
textureCoords);
// submit texture image data
glBufferSubData(GL_PIXEL_UNPACK_BUFFER,
0,
FONT_BITMAP_WIDTH * FONT_BITMAP_HEIGHT,
glyphs[i]->bitmap_ref);
glTexSubImage2D(GL_TEXTURE_2D,
0,
0,
0,
FONT_BITMAP_WIDTH,
FONT_BITMAP_HEIGHT,
GL_RED,
GL_UNSIGNED_BYTE,
0);
// render glyph
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}
// present render result
openglFlushBuffer();
}