У меня есть приложение Delphi 6, которое изменяет растровые изображения в режиме реального времени.В настоящее время я использую код, показанный ниже, чтобы быстро увеличить яркость и контрастность.Если бы операция была просто сложением или просто умножением, я мог бы увидеть, как можно использовать SIMD, но так как в нем используются как сложение, так и умножение, а также есть операция Trunc (), ограничивающая диапазонБайт, я не уверен, можно ли здесь использовать SIMD.Вот мои вопросы:
- Можно ли использовать SIMD с этим кодом, и знаете ли вы хороший пример кода, с которым я мог бы работать?Какое повышение скорости можно ожидать?
- Не будет ли (потенциальное) заполнение линий сканирования проблемой?
- Какие-либо общие советы по оптимизации для ускорения кода?
;
// A fast version of this function would be to only allow range reductions
// as a power of 2 and then use shl operations instead of divisions.
procedure doBrightnessAndContrast(var clip: tbitmap; compressionRatio: double; shiftValue: Byte);
var
p0: PByte;
x,y: Integer;
begin
for y := 0 to clip.Height-1 do
begin
p0 := clip.scanline[y];
// Can't just do the whole buffer as a big block of bytes since the
// individual scan lines may be padded for CPU alignment.
for x := 0 to clip.Width - 1 do
begin
// Red
p0^ := IntToByte(Trunc(p0^ * compressionRatio) + shiftValue);
Inc(p0);
// Green
p0^ := IntToByte(Trunc(p0^ * compressionRatio) + shiftValue);
Inc(p0);
// Green
p0^ := IntToByte(Trunc(p0^ * compressionRatio) + shiftValue);
Inc(p0);
end;
end;
end;