想象一下,我在内存中有一个由array
或std::vector
表示的图像;为了这个例子,我还假设我的图像像400x300像素,我想在最大64x64像素的正方形(或图块)中细分这个结构。
我正在考虑的数组就像这样宣布了
int a[400*300];
和不喜欢
int a[400][300];
这是一个很好的连续内存块。
我的观点是,您总是尽量保持数据结构和对该数据结构的访问尽可能线性。在正方形中细分图像涉及从1行跳到另一行或从1列跳到另一列,具体取决于图像在内存中的布局方式。考虑到图像的大小和尺寸,我在计算正方形的边界方面没有问题,但是当在这个正方形上表示迭代时,事情变得有点过于复杂,而我没有看到采用这种方法的任何实际好处。
那么为什么关于这种细分步骤的解决方案如此受欢迎呢?为什么不只是在时间或1列时间渲染?
答案 0 :(得分:3)
内存位置/缓存一致性。大多数图像处理操作都是在2D中运行,为了有效进行内存访问,您希望2D中彼此接近的像素在内存中彼此靠近。像这样在块中排列数据意味着具有相同x坐标和相邻y坐标的2个像素平均具有比使用简单线性布局更接近的存储器地址。
在GPU渲染时,有更复杂的方法来布局通常用于纹理的图像,这样可以提供更好的内存局部性。