Представьте, что у меня в памяти есть изображение, которое представлено array
или std::vector
; Ради этого примера я также предполагаю, что мое изображение имеет размер 400×300 пикселей, и я хочу разделить эту структуру на квадраты (или плитки), которые имеют максимум 64×64 пикселей.
Массив, который я рассматриваю, объявлен так
int a[400*300];
а также не лайк
int a[400][300];
Это 1 хороший непрерывный кусок памяти.
Я хочу сказать, что вы всегда стараетесь поддерживать как можно более линейную структуру данных и доступ к этой структуре данных. Разделение изображения на квадраты включает в себя переход от 1 строки к другой или от 1 столбца к другому в зависимости от того, как изображение расположено в памяти. У меня нет проблем с вычислением границ для квадратов с учетом размера и размеров изображения, но все становится слишком сложным при выражении итерации по этим квадратам, и я не вижу какой-либо реальной выгоды от такого подхода.
Так почему же решение о таких шагах подразделения так популярно? почему бы просто не визуализировать как 1 строку за раз или 1 столбец за раз?
Местность памяти / когерентность кэша. Большинство операций по обработке изображений работают в 2D, и для эффективного доступа к памяти необходимо, чтобы пиксели, которые расположены близко друг к другу в 2D, были расположены близко друг к другу в памяти. Расположение данных в таких блоках означает, что 2 пикселя с одинаковыми координатами x и смежными координатами y будут в среднем иметь более близкие адреса памяти, чем если бы вы использовали простую линейную разметку.
Существуют более сложные способы размещения изображения, которые часто используются для текстур при рендеринге с помощью графических процессоров, которые в среднем обеспечивают еще лучшую локальность памяти.
Других решений пока нет …