代码之家  ›  专栏  ›  技术社区  ›  amphetamachine

简洁地存储OpenGL程序的原子模型数据

  •  2
  • amphetamachine  · 技术社区  · 14 年前

    我希望能够在我正在编写的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程序,我对经验丰富的程序员的问题是,这个特定的方法是否存在不一致或效率低下,或者它是否存储了足够的数据。

    更多信息,不一定相关:

    • 内存中只有几个对象,其中两个对象将参与碰撞检测。
    • 一个模型将具有部分透明度。
    • 一个模型将提升渲染文本应用于模型的面,并根据重力矢量移动。
    • 基于外部输入,两个模型将一起旋转。
    1 回复  |  直到 14 年前
        1
  •  2
  •   John Knoeller    14 年前

    假设您使用的是32位体系结构,并且glgloat被类型化为32位浮点型此结构

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

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

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

    总是16字节,加上一个更少的失败点,因为它是一个分配而不是两个。

    所以,即使您的分配器开销为零(而它没有)。将3个glfloat放入coordnode(即使您只使用其中的2个)比将glfloat数组作为单独的分配要少一些内存。另外,如果将此分配为单个分配,则可以获得更好的缓存一致性,这在大多数情况下都会转化为更好的性能。

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

    我要说的另一件事是如果你总是把 next 首先在每个结构中使用指针,然后一组链表函数可以处理所有的列表,所以imo这更好

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

    如果有一天您将glfloat改为double或改为64位体系结构,那么您的指针将不再与glfloat大小相同。在这种情况下,最好使用内存将浮点数和指针组合在一起。

    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;