如题,在ios中使用opengl渲染的过程中,数组内存得不到释放,而我每次移动模型,会反复调用下述方法,导致内存越来越大,程序崩溃。求指点下。。
@autoreleasepool {
if (sumFloat == nil) {
sumFloat = [[NSMutableArray alloc]init];
}
NSString *fileName = [[NSBundle mainBundle]pathForResource:@"dangong" ofType:@"stl"];
if (sumFloat.count == 0) {
NSLog(@"当期没数据");
NSString *asOrbar = [NSString stringWithContentsOfFile:fileName encoding:NSUTF8StringEncoding error:nil];
if (asOrbar == nil) {
// NSLog(@"二进制");
//编译二进制文件
[sumFloat addObjectsFromArray: [STLParser stlParserWithBinary:fileName]];
}
else
{
// NSLog(@"ascii");
//编译ascii文件
[sumFloat addObjectsFromArray:[STLParser stlParserWithAscii:fileName]];
}
}
float verxxx[999999] = {0.0};//创建数组,保存顶点数据,提供给opengl画图
int i=0;
for (NSString *tem in sumFloat) {
verxxx[i] = [tem floatValue]/60;
i++;
}
//每次数据内存都得不到释放
glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, 0, verxxx);
glEnableVertexAttribArray(_positionSlot);
GLuint buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(verxxx), verxxx, GL_STATIC_DRAW);
// 3、将缓冲区的数据复制进通用顶点属性中
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 4*8, (char *)NULL + 0); //读顶点坐标
//4、继续复制其他数据
// 在前面预定义的顶点数据数组中,还包含了法线和纹理坐标,所以参照上面的方法,将剩余的数据分别复制进通用顶点属性中。
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 4*8, (char *)NULL +12); //读法线
glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 4*8, (char *)NULL + 24); //读纹理
glDrawArrays(GL_TRIANGLES, 0, sumFloat.count/7);
// NSLog(@"-----%lu",sizeof(verxxx)/32);
}
对于每一个
glGenBuffers
都要对应glDeleteBuffers
的,加上glDeleteBuffers(1, &buffer);
试试看?