将NSMutableArray复制到GLES渲染的浮点数组中

我有一个名为mVerticies的NSMutableArray存储为我的类的成员,我想将它们放入一个float数组中,用glVertexAttribPointer绘制它们。

通常在绘图时,我会有类似的东西:

float verticies[] = {-1, -1, 1, -1}; // ... prepare to draw glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, 0, verticies); // ... draw 

但是为了使用glVertexAttribPointer函数,我需要一个float []。 verticies存储为NSMutableArray,因为它们经常更改。 是否有一种简单的方法可以将动态float []存储为成员,或者将NSMutableArray快速转换为float []?

假设值存储为NSNumbers,您可以执行以下操作:

 float *floatsArray = malloc([numbersArray count] * sizeof(float)); if (floatsArray == NULL) { // handle error } [numbersArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSNumber *number, NSUInteger idx, BOOL *stop) { floatsArray[idx] = [number floatValue]; }]; // use floatsArray free(floatsArray); 

如果您只是希望原始块内存直接读取和写入值,则需要使用malloc

如果您有一个包含NSNumber实例的NSArray array

 float *vertices = malloc(sizeof(float) * [array count]); for (int i = 0; i < [array count]; i++) { vertices[i] = [[array objectAtIndex:i] floatValue]; } // draw cool 3D objects and stuff glVertexAttribPointer(....) // then, when you're totally done with the memory free(vertices); 

与Objective-C对象不同, vertices指针没有保留计数,因此您需要自己释放它,并跟踪何时可以释放它,因为当您调用free时它将立即消失。

只需循环遍历这些值。 假设您的浮动存储为NSNumbers:

 NSUInteger count = [mutableVerticesArray count]; float vertices[count]; for (NSUInteger i = 0; i < count; i++) { vertices[i] = [[mutableVerticesArray objectAtIndex:i] floatValue]; } // Drawing etc.