Data Structure使用Objective C和GLKit存储模型信息



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

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

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

以获取存储的数据。

但这与这个问题不是很相关。

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

事实上,我的类应该有两个类型的属性

@属性(非原子)TYPEOFDATASTRUCTURE颜色//包含GLKVector4的数组@属性(非原子)TYPEOFDATASTRUCTURE位置//包含GLKVector3 的数组

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

谢谢你抽出时间。

约翰·

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

你想要这样的指针:

GLKVector4 *colors;
GLKVector3 *positions;

然后代码如下:

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

如果你想让指针进入属性,你也可以这样做,但要注意,每次使用self.colors[x]时,你都会添加一个额外的方法调用,如果你在>100万像素之间循环,就像在retina iPad上一样,它会开始对性能产生影响。

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

最新更新