出于某种原因,我似乎无法理解为可以在运行时动态添加元素的类创建 C-Array 实例变量的过程。
我的目标是创建一个名为 AEMesh
的类。所有 AEMesh
对象都将有一个 c 数组,用于存储特定 AEMesh
的 3D 模型的顶点数据,以便与 OpenGL ES 一起使用(更具体地说,它的功能是通过传递来绘制模型它是一个简单的顶点数据 C 数组)。
最初我使用的是 NSMutableArray
,假设我可以简单地将此数组传递给 OpenGL ES,但事实并非如此,因为框架需要 C 数组。我通过在渲染特定网格时为当前 AEMesh
创建所有顶点数据的 C 数组并将该数组传递给 OpenGL ES 来解决这个问题。显然,这里的问题是性能,因为我不断地分配和释放足够的内存来保存应用程序中每个 3D 模型的顶点数据大约每秒十几次。
所以,我不想把答案勺子喂给我,但如果有人愿意向我解释为类提供可变 c 数组的标准习惯用法(我读过的一些文章提到使用 malloc
?) 我将不胜感激。根据我收集到的信息,使用 malloc 可能有效,但这不是创建一个我可以传递给 OpenGL ES 的标准 c 数组,而是它更像是一个像 c 数组一样工作的伪 c 数组?
无论如何,我会继续试验和搜索互联网,但再次重申,如果有人能提供帮助,我将不胜感激。
谢谢, - 亚当艾斯菲尔德
最佳答案
我们的想法只是向您的类添加一个指向 AEMesh 结构数组的指针,然后根据需要维护该数组。以下是一些(未经测试的)代码,它使用 malloc() 创建这样一个数组并使用 realloc() 调整它的大小。我一次将阵列增加 10 个网格:
@interface MyClass : NSObject
{
int meshCount;
AEMesh *meshes;
}
@end
@implementation MyClass
-(id)init {
if ((self = [super init])) {
meshCount = 0;
meshes = malloc(sizeof(AEMesh)*10);
}
return self;
}
-(void)addMesh:(AEMesh)mesh {
if (meshCount % 10 = 0) {
meshCount = realloc(sizeof(AEMesh) * (meshCount + 10));
}
if (meshCount != nil) {
meshes[meshCount] = mesh;
meshCount++;
}
}
@end
将数组管理考虑到它自己的 Objective-C 类中可能是值得的,就像 Brian Coleman 的回答使用 std::vector 来管理网格一样。这样,您就可以将它用于任何类型的 C 数组,而不仅仅是 AEMesh。
From the information Ive gathered, using malloc might work, but this isn't creating a standard c-array I can pass in to OpenGL ES, instead its more of a pseudo-c-array that works like a c-array?
一个C数组无非就是内存中的一系列对象(这里用的“对象”是C意义上的连续内存,不是OO意义上的)。您可以通过在堆栈上声明它来创建一个:
int foo[10]; // array of 10 ints
或者动态地在堆上:
int foo[] = malloc(sizeof(int)*10); // array of 10 ints, not on the stack
int *bar = malloc(sizeof(int)*10); // another way to write the same thing
不要忘记使用 free() 来释放您使用 malloc()、realloc()、calloc() 等创建的任何内存块。
关于ios - 代码/iOS : Simple example of a mutable C-Array as a class instance variable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7222681/