c - 为 OpenGL 程序简洁地存储原子模型数据

标签 c optimization opengl data-structures data-modeling

我希望能够在我正在编写的 OpenGL 程序中存储原子模型。没有什么花哨;只是存储为 GLfloat[3] 的常量网格顶点值,加上简单的纹理。我还希望模型能够作为单个对象自由移动和旋转。这是我到目前为止所拥有的:

typedef struct _coordnode {
 GLfloat    *pts;           /* XYZ (vertex) or XY (texture) */
 struct _coordnode *next;
} coordnode;

typedef struct _facenode {
 GLfloat    *norm;          /* XYZ */
 coordnode  *vertices;      /* head of linked list */
 GLfloat    *color;         /* RGBA */
 coordnode  *textures;      /* head of linked list */
 struct _facenode *next;
} facenode;

typedef struct _model {
 GLenum     mode;
 facenode   *faces;         /* head of linked list */
 GLfloat    *rot;           /* delta-XYZ from Theta-origin */
 GLfloat    *rot_delta;     /* delta-delta-XYZ */
 GLfloat    *trans;         /* delta-XYZ from origin */
 GLfloat    *trans_delta;   /* delta-delta-XYZ from origin */
} model;

这会以这样一种方式进行设置,即模型具有 facenode 的链表,每个链表分别具有其顶点和纹理坐标的两个链表。

因为这是我的第一个 C 程序,我想问经验丰富的程序员的问题是这个特定方法是否存在任何不一致或效率低下,或者它是否存储了足够的数据。

更多信息,不一定相关:

  • 内存中只有几个对象,其中两个将参与碰撞检测。
  • 一个模型将具有部分透明度。
  • 一个模型将凸起应用于模型面部的渲染文本,并根据重力 vector 移动。
  • 两个模型将根据外部输入作为一个模型旋转。

最佳答案

假设您使用的是 32 位架构,并且 GLgloat 类型定义为 32 位浮点此结构

typedef struct _coordnode {
 GLfloat   *pts;            /* XYZ (vertex) or XY (texture) */
 struct _coordnode *next;
} coordnode;

将消耗 8 个字节的内存。然后,如果我理解正确的话,pts 将指向一个单独的分配,该分配将具有 2 或 3 个 GlFloats,即 8 或 12 字节的内存。这是两次分配中的 16 或 20 个字节。而这

typedef struct _coordnode {
 GLfloat   pts[3];           /* XYZ (vertex) or XY (texture) */
 struct _coordnode *next;
} coordnode;

总是 16 字节,再加上少一个故障点,因为它是单个分配而不是两个。

因此,即使您的分配器的开销为零(但事实并非如此)。将 3 个 GLfloats 放在坐标节点中(即使你只使用其中的 2 个)比让 GLfloat 数组成为一个单独的分配更少的内存。另外,如果你将其设为单一分配,那么你将获得更好的缓存一致性,这在大多数情况下会转化为更好的性能。

可以对您的其他结构执行相同的分析。

我要说的另一件事是,如果你总是把 next 指针放在你的每个结构的前面,那么一组链表函数就可以处理你所有的列表,所以 IMO 这个比较好

typedef struct _coordnode {
 struct _coordnode *next;
 GLfloat   pts[3];           /* XYZ (vertex) or XY (texture) */
} coordnode;

如果有一天您更改为 GLFloat 的 double 或移动到 64 位架构,那么您的指针将不再与 GLFloats 的大小相同。在那种情况下,最好使用内存将 float 和指针组合在一起。

typedef struct _facenode {
 struct _facenode *next;
 coordnode  *vertices;      /* head of linked list */
 coordnode  *textures;      /* head of linked list */
 GLfloat   *norm;           // XYZ (it might be better to make this an array)
 GLfloat   *color;          // RGBA (it might be better to make this an array)
} facenode;

关于c - 为 OpenGL 程序简洁地存储原子模型数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2278494/

相关文章:

c - 如何遍历具有空项的结构数组?

c - pthreads/等待(&状态)

javascript - 优化 DOM 元素的 native HitTest (Chrome)

exception - 应用程序运行一段时间后Pyspark套接字超时异常

c++ - glm : is not a type or namespace? 我的标题中有令人困惑的错误

c - 在外部函数中分配一个字符串数组

c - 如何获取C指针数组长度?

c++ - AVX中的6元素 double vector 矩阵 vector 相乘

c++ - 如何像这样在 OpenGL 中绘制连接的带状线

java - OpenGL混合: Remove pixels being drawn over (immediate mode)