内存管理:命名该结构
Posted
技术标签:
【中文标题】内存管理:命名该结构【英文标题】:Memory Management: Name that Structure 【发布时间】:2012-03-24 09:22:00 【问题描述】:我正在使用 OpenGL,并使用缓冲区将顶点数据存储在视频内存中。为了效率/方便,我分配了大块视频内存,然后根据需要保留块。我正在使用三种数据结构:
缓冲区本身。 缓冲区的“块” - 缓冲区内的连续内存块。 常规块中的“跳过块”。 OpenGL 允许您交错顶点属性,而这些“skippy chunks”可以让您描述不同的属性是如何在一个块/缓冲区中编织在一起的。现在我认为“缓冲区”是第一个数据结构的好名字,但是另外两个叫什么?我假设有一个技术术语,但我不知道,又不知道怎么找……
这是一个内存布局示例,用于支持我的粗略描述(此缓冲区具有三种类型的属性:颜色、顶点和法线):
+--+--+--+--+--+--+--+--+--+--+--+
|c1|c2|c3|c4|c5|v1|n1|v2|n2|v3|n3|
+--+--+--+--+--+--+--+--+--+--+--+
|------------Buffer--------------| <- Buffer Class
|----chunk1----|------chunk2-----| <- "Chunk" classes
|--| |--| |--| <- "Skippy Chunk" class (vertices)
|--| |--| |--| <- "Skippy Chunk" class (normals)
提前致谢!
【问题讨论】:
OpenGL 文档如何称呼它? @cdeszaq:这些是用户定义的结构,OpenGL 本身并不知道缓冲区对象的内部结构。 【参考方案1】:带有“skippy chunks”的部分类似于interleaved arrays。 在一块线性内存(“缓冲区”)中混合此类数据(顶点、纹理坐标、法线、颜色……)并使用基地址、偏移量和步幅访问它是很常见的。
【讨论】:
这就是我想要做的,但我不清楚术语。 “Interleaved Array”是指整个“Chunk”,每个“Skippy Chunk”都是该Interleaved Array的成员(链?线程?叶子?)在中,还是每个“Skippy Chunk”本身交错数组? 我想说 chunk2 在你的例子中是一个交错数组。您的 buffer 的结构 - 换句话说,您的内存布局的外观,例如,N 字节颜色 c1 到 cN,K 字节 v1, n1 到 vN,cN - 完全取决于您,AFAIK 对此没有专门的术语。 另一方面,我认为依次排列顶点、法线、颜色等会更有效(至少在 CUDA 中)。不过,您的里程可能会有所不同,所以如果你遇到性能问题先做一些基准测试:) 我正在使用 GLSL,我曾以为我看到了一个声称 interleaved 更快的参考。但后来我去寻找一个链接,我只能找到this,这表明两者几乎相同......我将不得不运行一些基准测试,但也许我会杀死那个额外的层复杂性 - 总是一件好事。干杯! 还有一个后续,现在我得到了这个工作:我的“精简版”压力测试显示两者完全相等:10000 帧在 217 秒内 (~46.1 fps) 与一秒计时器粒度。更简单的数据结构万岁!【参考方案2】:Buffer Chunk 实际上是这些最常用的名称。
【讨论】:
以上是关于内存管理:命名该结构的主要内容,如果未能解决你的问题,请参考以下文章
Linux 内核 内存管理物理内存组织结构 ② ( 内存模型 | 平坦内存 | 稀疏内存 | 非连续内存 | 内存管理系统三级结构 | 节点 Node | 区域 Zone | 页 Page )
Linux 内核 内存管理分区伙伴分配器 ③ ( 备用内存区域列表 | ZONELIST_FALLBACK 枚举 | zoneref 结构体 | 备用内存区域借用物理页规则 )