如题,我还是在读取那个stl文件,然后读取一个100多M得文件的时候,运行内存十分大,我使用的方式是以文本形式读取文件并按行分开存到一个NSArray,然后再拆分NSArray细分找到需要的数据转成float型在存到float数组内。。。但是在读取的时候运行内存已经超过了900M,这肯定是不行的。
请问还有什么思路换种方式去进行读取,让内存降下来。现在的情况是我再模拟器可以读出来文件,但在自己的手机上肯定是崩的。
代码如下:
float *squareVertexData;//数据集合
int faceNum;//三角片面数
NSString *fileContext = [NSString stringWithContentsOfFile:curFileName encoding:NSUTF8StringEncoding error:nil];
//声明可变数组用户存储文件的没一行数据
NSMutableArray *lineArr;
if (lineArr == nil) {
lineArr = [[NSMutableArray alloc]init];
}
[lineArr addObjectsFromArray:[fileContext componentsSeparatedByString:@"\n"]];//按行取出模型文件数据
fileContext = nil;
//删除没用的影响循环的数据
[lineArr removeObjectAtIndex:0];//删除第一行solid+文件名 数据
[lineArr removeLastObject];//删除最后一行“ ”数据
[lineArr removeLastObject];//删除倒数第二行endsolid数据
faceNum = (int)lineArr.count/7;//循环次数
squareVertexData = (float *)malloc(faceNum*24*sizeof(float));//给float数组空间
for (int i=0; i<faceNum; i++) {
//每一个循环内我会取出每段带有有效数据的字符串再将其分割出来单独取出有效数据。
//每个循环内有四段有效数据,每段有效数据都是三个浮点数,我需要将第一段有效数据内取出的三个浮点数添加到第2、3、4段有效数据的浮点数后再添加两个1.0浮点数存储起来供使用
NSArray *nor = [lineArr[0] componentsSeparatedByString:@" "];//包含有效数据1
NSArray *vex1 = [lineArr[2] componentsSeparatedByString:@" "];//包含有效数据2
int count = 0;
squareVertexData[i*24+count] = [vex1[vex1.count-3] floatValue];
count++;
squareVertexData[i*24+count] = [vex1[vex1.count-2] floatValue];
count++;
squareVertexData[i*24+count] = [vex1[vex1.count-1] floatValue];
count++;
squareVertexData[i*24+count] = [nor[nor.count-3] floatValue];
count++;
squareVertexData[i*24+count] = [nor[nor.count-2] floatValue];
count++;
squareVertexData[i*24+count] = [nor[nor.count-1] floatValue];
count++;
squareVertexData[i*24+count] = 1.0;
count++;
squareVertexData[i*24+count] = 1.0;
count++;
NSArray *vex2 = [lineArr[3] componentsSeparatedByString:@" "];//第二段有效数据
squareVertexData[i*24+count] = [vex2[vex2.count-3] floatValue];
count++;
squareVertexData[i*24+count] = [vex2[vex2.count-2] floatValue];
count++;
squareVertexData[i*24+count] = [vex2[vex2.count-1] floatValue];
count++;
squareVertexData[i*24+count] = [nor[nor.count-3] floatValue];
count++;
squareVertexData[i*24+count] = [nor[nor.count-2] floatValue];
count++;
squareVertexData[i*24+count] = [nor[nor.count-1] floatValue];
count++;
squareVertexData[i*24+count] = 1.0;
count++;
squareVertexData[i*24+count] = 1.0;
count++;
NSArray *vex3 = [lineArr[4] componentsSeparatedByString:@" "];//第三段有效数据
squareVertexData[i*24+count] = [vex3[vex3.count-3] floatValue];
count++;
squareVertexData[i*24+count] = [vex3[vex3.count-2] floatValue];
count++;
squareVertexData[i*24+count] = [vex3[vex3.count-1] floatValue];
count++;
squareVertexData[i*24+count] = [nor[nor.count-3] floatValue];
count++;
squareVertexData[i*24+count] = [nor[nor.count-2] floatValue];
count++;
squareVertexData[i*24+count] = [nor[nor.count-1] floatValue];
count++;
squareVertexData[i*24+count] = 1.0;
count++;
squareVertexData[i*24+count] = 1.0;
count++;
//每行数据为:顶点坐标+法矢量+纹理坐标
以上,如有不清楚的,追问下我,谢谢大家。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
你不需要文件全部内容同时在内存, 有个几行的"窗口"可以了.
malloc一个顶点buffer;
while(文件还没完) {
从文件读一段;
写到buffer;
if(顶点buffer满了){
if (能malloc一个两倍大小的) {
把旧的内容复制过来;
旧的释放掉;
开始用新的;
} else {
旧的释放掉;
文件关掉 返回错误;
}
}
}