想象一下,我在内存中有一个由anarray
或an表示的图像std::vector
;对于本示例,我还假设我的图像为400x300像素,并且我想将此结构细分为最大为64x64像素的正方形(或图块)。
我正在考虑的数组这样声明
int a[400*300];
而且不喜欢
int a[400][300];
这是1个不错的连续内存块。
我的观点是,您始终尝试使数据结构和对该数据结构的访问尽可能地保持线性。将图像细分为正方形涉及根据图像在内存中的布局方式从第一行跳到另一行或从第一列跳到另一列。在给定图像的大小和尺寸的情况下,在计算正方形的边界时我没有任何问题,但是在此正方形上表达迭代时,事情变得有点太复杂了,而我没有看到使用这种方法的真正好处。
那么,为何有关这种细分步骤的解决方案如此流行?为什么不只一次渲染1行,一次渲染1列呢?
内存局部性/缓存一致性。大多数图像处理操作都以2D进行操作,为了有效访问内存,您希望2D中彼此靠近的像素在内存中彼此靠近。像这样将数据按块排列意味着,与使用简单的线性布局相比,具有相同x坐标和相邻y坐标的2个像素平均具有更近的内存地址。
有多种更复杂的布局图像的方法,这些图像通常由GPU渲染时用于纹理,它们平均可以提供更好的内存局部性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句