【问题标题】:Data Structure to store a model information using Objective C and GLKit使用 Objective C 和 GLKit 存储模型信息的数据结构
【发布时间】:2014-03-02 13:01:05
【问题描述】:

我正在为 iOS 中的 3D 开发我的小型引擎。我需要一个关于哪种数据结构对性能更好的建议。我想继续使用 C 和 Objective-C。最好不要 C++。 我的想法是使用 GLKVector3 和 GLKVector4 来存储顶点信息。 现在这是只存储一个顶点。然而,一个几何图形包含多个顶点。

我想做的是在Objective-C中创建一个几何类,它可以为每个顶点位置存储多个GLKVector3,为每个顶点颜色存储多个GLKVector4。该类还将提供以下类型的函数:

  • (GLvoid *)getRawDataForVertices;
  • (GLvoid *)getRawDataForIndices;

获取存储的数据。

但这与问题不太相关。

我想知道的是哪种数据结构(对于我的实例变量)应该更适合在 NSObject 类中存储多个 GLKVector3 或 GLKVector4。

我的班级实际上应该有 2 个类型的属性

@property(非原子)TYPEOFDATASTRUCTURE 颜色; //一个包含GLKVector4的数组 @property(非原子)TYPEOFDATASTRUCTURE 位置; //一个包含GLKVector3的数组

使用 NSArray 是否更好/可能? 如果是的话,我应该在一个简单的 GLKVector3* 指针旁边更喜欢它吗?

感谢您的宝贵时间。

约翰

【问题讨论】:

    标签: ios objective-c c data-structures opengl-es


    【解决方案1】:

    如果您打算在 OpenGL 中工作,您需要习惯使用动态分配的内存缓冲区和 C 数组。时期。这就是您必须传递给 OpenGL 的内容,通过这种方式,您将获得更紧凑的存储和更高效的处理。不要使用 NSArrays。每次你想用它做某事时,你最终都会在格式之间来回转换你的数据。

    你想要这样的指针:

    GLKVector4 *colors;
    GLKVector3 *positions;
    

    然后是这样的代码:

    int pixels = height*width;
    colors = malloc(pixels*sizeof(GLKVector4));
    positions = malloc(pixels*sizeof(GLKVector3));
    

    如果您想将指针指向属性,您也可以这样做,但请注意,每次使用 self.colors[x] 时,您都会添加一个额外的方法调用,并且如果您正在循环超过 100 万像素,就像在视网膜 iPad 上一样,它开始对性能产生影响。

    附:当您使用 malloc 时,请注意您有责任在完成后释放内存。 ARC 不会为您管理这种类型的内存,并且这些块往往很大。如果您创建大缓冲区并且在创建新缓冲区之前不释放它们,您将很快耗尽内存并崩溃。

    【讨论】:

    • 我希望有一种比 malloc 更简单、更安全的方法。但如果这是更好的解决方案,我会使用它。
    猜你喜欢
    • 2012-01-07
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多