opengl的内存增长

时间:2013-12-26 13:46:14

标签: ios opengl-es memory-leaks paint

我的绘画应用程序中有更改画笔的代码。一切都很好,但我发现,如果我多次称这种方法,记忆不会自由,并且成长和成长......我找不到它在哪里?

- (void)setBrush:(UIImage *)brush withColor:(UIColor *)color andOpacity:(CGFloat)opacity andSize:(CGFloat)size {
CGImageRef brushImage;
CGContextRef brushContext;
GLubyte *brushData;
size_t width, height;
brushImage = brush.CGImage;
width = CGImageGetWidth(brushImage);
height = CGImageGetHeight(brushImage);
if(brushImage) {
    brushData = (GLubyte *) calloc(width * height * 4, sizeof(GLubyte));
    brushContext = CGBitmapContextCreate(brushData, width, height, 8, width * 4, CGImageGetColorSpace(brushImage), (CGBitmapInfo)kCGImageAlphaPremultipliedFirst);
    CGContextDrawImage(brushContext, CGRectMake(0.0, 0.0, (CGFloat)width, (CGFloat)height), brushImage);
    CGContextRelease(brushContext);
    glGenTextures(1, &brushTexture);
    glBindTexture(GL_TEXTURE_2D, brushTexture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, brushData);
    free(brushData);
}
CGColorRef clr = [color CGColor];
const CGFloat *components = CGColorGetComponents(clr);
CGFloat red = components[0];
CGFloat green = components[1];
CGFloat blue = components[2];
glColor4f(red * opacity/3, green * opacity/3, blue * opacity/3, opacity/3);
glPointSize(width * size / 2);
}

它可能是什么,它是如何正确的?

2 个答案:

答案 0 :(得分:3)

您永远不会删除使用glGenTextures()创建的纹理,因此您只需分配越来越多的空间来保存所有纹理数据。

答案 1 :(得分:0)

好吧,似乎你在刷子每次更换时都会生成glGenTextures的纹理。这些纹理由openGL保留,必须在完成后使用glDeleteTextures方法释放。

我建议你跟踪生成的纹理,当你想使用那个纹理时,只需使用glBindTexture的绑定变量(不再生成它)。这个绑定变量只是告诉openGL在内存中纹理所在的位置。

每次设置画笔时生成和删除纹理都可能会影响性能,除非不经常使用它。