Одной вещью, которая может оказаться полезной, может быть преобразование данных в нечто более «плотное». Так как вас интересует только один бит на пиксель, хранить больше не имеет смысла. Хранение большего количества данных, чем необходимо, означает, что вы получаете меньше использования из своего кэша, что может реально замедлить процесс, если изображение велико и / или доступ очень случайный.
Например, вы можете использовать самое большое «родное» целое число платформы и упаковать в пиксели, чтобы использовать один бит для каждого пикселя. Это сделает доступ немного более сложным, так как вам нужно провести однобитное тестирование, но это может быть победой.
Вы бы сделали что-то вроде этого:
uint32_t image[HEIGHT * ((WIDTH + 31) / 32)];
Затем инициализируйте этот массив, используя метод медленного получения, один раз на пиксель. Затем вы можете прочитать значение пикселя, используя что-то вроде image[y * ((WIDTH + 31) / 32) + (x / 32)] & (1 << (x & 31))
.
Я неясен ("может", "могу" и т. Д.), Поскольку это действительно зависит от вашего шаблона доступа, размера изображения и других вещей. Вы, вероятно, должны проверить это.