Почему движки рендеринга делят изображение на маленькие квадраты?

Представьте, что у меня в памяти есть изображение, которое представлено array или std::vector; Ради этого примера я также предполагаю, что мое изображение имеет размер 400×300 пикселей, и я хочу разделить эту структуру на квадраты (или плитки), которые имеют максимум 64×64 пикселей.

Массив, который я рассматриваю, объявлен так

int a[400*300];

а также не лайк

int a[400][300];

Это 1 хороший непрерывный кусок памяти.

Я хочу сказать, что вы всегда стараетесь поддерживать как можно более линейную структуру данных и доступ к этой структуре данных. Разделение изображения на квадраты включает в себя переход от 1 строки к другой или от 1 столбца к другому в зависимости от того, как изображение расположено в памяти. У меня нет проблем с вычислением границ для квадратов с учетом размера и размеров изображения, но все становится слишком сложным при выражении итерации по этим квадратам, и я не вижу какой-либо реальной выгоды от такого подхода.

Так почему же решение о таких шагах подразделения так популярно? почему бы просто не визуализировать как 1 строку за раз или 1 столбец за раз?

1

Решение

Местность памяти / когерентность кэша. Большинство операций по обработке изображений работают в 2D, и для эффективного доступа к памяти необходимо, чтобы пиксели, которые расположены близко друг к другу в 2D, были расположены близко друг к другу в памяти. Расположение данных в таких блоках означает, что 2 пикселя с одинаковыми координатами x и смежными координатами y будут в среднем иметь более близкие адреса памяти, чем если бы вы использовали простую линейную разметку.

Существуют более сложные способы размещения изображения, которые часто используются для текстур при рендеринге с помощью графических процессоров, которые в среднем обеспечивают еще лучшую локальность памяти.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]