我画了界面。有些元素有纹理。每次更新时,占用的内存量都会增加。这就是在元素上绘制纹理的代码的样子。
void RecordLabel::Draw() {
glEnableClientState(GL_VERTEX_ARRAY);
glEnable(GL_BLEND);
GLuint tex;
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
int w1 = image.GetWidth(), h1 = image.GetHeight();
int glw1 = NextPow2(w1), glh1 = NextPow2(h1);
unsigned char *d = image.GetData();
unsigned char *a = image.GetAlpha();
unsigned char *e = new unsigned char[4 * w1 * h1];
if (d && e && a){
for (int p = 0; p < w1*h1; p++) {
e[4 * p + 0] = d[3 * p + 0];
e[4 * p + 1] = d[3 * p + 1];
e[4 * p + 2] = d[3 * p + 2];
e[4 * p + 3] = a[p];
}
}
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
glw1, glh1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0,
w1, h1, GL_RGBA, GL_UNSIGNED_BYTE, e);
delete[] e;
glEnable(GL_TEXTURE_2D);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
float glw = image.GetWidth(), glh = image.GetHeight();
float ut = 1, v = 1;
float wt = w, ht = h;
glBegin(GL_QUADS);
glTexCoord2f(0, v), glVertex2f(cx - w / 2, cy + h / 2);
glTexCoord2f(ut, v), glVertex2f(cx + w / 2, cy + h / 2);
glTexCoord2f(ut, 0), glVertex2f(cx + w / 2, cy - h / 2);
glTexCoord2f(0, 0), glVertex2f(cx - w / 2, cy - h / 2);
glEnd();
glDisable(GL_TEXTURE_2D);
glDisableClientState(GL_VERTEX_ARRAY);
glDisable(GL_BLEND);
}
在这里,您正在通过调用创建新纹理
glGenTextures
,但glDeleteTextures
无处可见清理它的调用。您调用glBindTexture
绑定纹理,但相应的取消绑定调用却无处可寻。此外,所有 api
glBegin
/都已glEnd
弃用。