ios - 代码/iOS : Simple example of a mutable C-Array as a class instance variable?

标签 ios arrays xcode malloc mutable

出于某种原因,我似乎无法理解为可以在运行时动态添加元素的类创建 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/

相关文章:

iphone - 模拟器构建路径

ios - 如何更改 App store 上 iphone 应用程序的设备兼容性?

Java - 如何在数组中存储大量值

c++ - 在 C++ 中声明常量数组值

php - 如何在数组树中查找值?

ios - 具有多个 .xcconfig 文件和 cocoapods 的复杂 Xcode 项目

ios - 有没有办法获取崩溃报告以及我们的代码在我们应用程序中保存的 .txt 文件或 .doc 文件中崩溃的原因?

objective-c - 为什么这个 subview 没有被删除?

ios - 如何与代码并排打开 SwiftUI 预览?

xcode - 由于类扩展而导致快速编译错误