我的绘画应用程序中有更改画笔的代码。一切都很好,但我发现,如果我多次称这种方法,记忆不会自由,并且成长和成长......我找不到它在哪里?
- (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);
}
它可能是什么,它是如何正确的?
答案 0 :(得分:3)
您永远不会删除使用glGenTextures()
创建的纹理,因此您只需分配越来越多的空间来保存所有纹理数据。
答案 1 :(得分:0)
好吧,似乎你在刷子每次更换时都会生成glGenTextures
的纹理。这些纹理由openGL
保留,必须在完成后使用glDeleteTextures
方法释放。
我建议你跟踪生成的纹理,当你想使用那个纹理时,只需使用glBindTexture
的绑定变量(不再生成它)。这个绑定变量只是告诉openGL在内存中纹理所在的位置。
每次设置画笔时生成和删除纹理都可能会影响性能,除非不经常使用它。