Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用Objective C和GLKit存储模型信息的数据结构_Ios_Objective C_C_Data Structures_Opengl Es - Fatal编程技术网

Ios 使用Objective C和GLKit存储模型信息的数据结构

Ios 使用Objective C和GLKit存储模型信息的数据结构,ios,objective-c,c,data-structures,opengl-es,Ios,Objective C,C,Data Structures,Opengl Es,我正在用iOS开发我的小型3D引擎。我需要一个什么样的数据结构对性能更好的建议。我想继续使用C和Objto-C。最好没有C++。 我的想法是使用GLKVector3和GLKVector4存储顶点信息。 现在,这只用于存储一个顶点。但是,几何体包含多个顶点 我想做的是在Objective-C中创建一个Geometry类,它可以为每个顶点位置存储多个GLKVector3,为每个顶点颜色存储多个GLKVector4。此类还将提供以下类型的函数: (GLvoid*)GetRawDataForVerte

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

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

  • (GLvoid*)GetRawDataForVertex
  • (GLvoid*)GetRawDataForIndex
获取存储的数据

但这与这个问题不太相关

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

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

@属性(非原子)类型的数据结构颜色//包含GLKVector4的数组 @属性(非原子)类型的数据结构位置//包含GLKVector3的数组

使用NSArray是否更好/可能?? 如果是,我是否应该将其放在简单的GLKVector3*指针旁边

谢谢你抽出时间


John

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

您需要这样的指针:

GLKVector4 *colors;
GLKVector3 *positions;
int pixels = height*width;
colors = malloc(pixels*sizeof(GLKVector4));
positions = malloc(pixels*sizeof(GLKVector3));
然后编码如下:

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不会为您管理这种类型的内存,并且块往往很大。如果创建大的缓冲区,并且在创建新缓冲区之前不释放它们,您将很快耗尽内存并崩溃。

我希望有一种比malloc更简单、更安全的方法。但如果这是更好的解决方案,我会使用它。