1

想象一下,我在内存中有一个由 anarray或 an表示的图像std::vector;为了这个例子,我还假设我的图像是 400x300 像素,我想将此结构细分为最大 64x64 像素的正方形(或平铺)。

我正在考虑的数组是这样声明的

int a[400*300];

喜欢_

int a[400][300];

这是 1 个很好的连续内存块。

我的观点是你总是尽量保持数据结构和对该数据结构的访问尽可能线性。将图像细分为正方形涉及从 1 行跳转到另一行或从 1 列跳转到另一行,具体取决于图像在内存中的布局方式。在给定图像的大小和尺寸的情况下,我在计算正方形的边界时没有问题,但是在表达对这个正方形的迭代时,事情变得有点太复杂了,我没有看到这种方法有什么真正的好处。

那么为什么这种细分步骤的解决方案如此受欢迎呢?为什么不一次渲染 1 行或 1 列?

4

1 回答 1

3

内存局部性/缓存一致性。大多数图像处理操作都在 2D 中运行,并且为了有效的内存访问,您希望 2D 中彼此接近的像素在内存中彼此接近。像这样将数据排列在块中意味着,与使用简单的线性布局相比,具有相同 x 坐标和相邻 y 坐标的 2 个像素平均具有更接近的内存地址。

有更复杂的布局图像的方法,这些方法在由 GPU 渲染时通常用于纹理,平均而言,它们提供了更好的内存局部性。

于 2013-11-09T06:24:37.947 回答