Текущий архив: 2003.02.17;
Скачать: CL | DM;
ВнизПомогите периписать маааленький кусочек на асме. Найти похожие ветки
← →
AlexT1000 (2003-02-05 15:25) [0]Ребята очень надо для увеличения скорости перекраски скорости .
Сам я асм уже позабыл, к сожалению
procedure TColorBalanceAction.DoRow(P: PClr32Array; W: integer);
Var i : integer ;
begin
for i :=0 to W -1 do with P[i] do begin
red := RL[red];
green := GL[green];
blue := BL[blue];
end;
end;
PClr32Array = ^TClr32Array;
TClr32Array = array [0..0] of TColor32Rec;
TColor32Rec = packed record
Blue : byte;
Green : byte;
Red : byte;
Alpha : byte;
end;
RL,GL,BL : array [Byte] of Byte;
← →
MBo (2003-02-05 15:32) [1]здесь ассемблер практически не даст выигрыша
← →
AlexT1000 (2003-02-05 16:14) [2]MBo - жаль. а хотелось.
по коду дельфи они вообще не используют eax и дублируют некоторые операции
//дельфи дизасм
red := RL[red];
xor ebx,ebx
mov bl,[ecx+$02]
mov bl,[eax+ebx+$0000b4]
mov[ecx+$02],bl
я бы загнал цвет в eax и обрабатывал бы его
примерно так
MOV EAX , цвет // EaX <- Xa Xr Xg Xb
MOV EBX , EAX // EaX <- Xa Xr Xg Xb
AND EAX,$00FF00FF // EAX <- 00 Xr 00 Xb
AND EBX,$FF00FF00 // EBX <- Xa 00 Xg 00
выдели цвета и погнал думаю немного бы выиграл. мне как раз немножечко прибавить и нужно . процентов 10 было бы в самый раз
но я не помню как в регистры значения массыва загонять
← →
Sha (2003-02-05 16:54) [3]Попробуй это. Вдруг заработает? :)
Вызывай PrepareColors один раз в самом начале проги. Она просто копирует цвета в массив cl.
Можно крутить чуть быстрее, но будет не так красиво.
var
cl: array[0..256*3-1] of byte;
pcl: pchar;
procedure PrepareColors;
begin;
pcl:=@cl[0];
move(bl[0],cl[0],256);
move(gl[0],cl[256],256);
move(rl[0],cl[512],256);
end;
procedure DoRowAsm(P: PClr32Array; W: integer);
asm
push ebx
xor ebx,ebx
mov ecx,pcl
shl edx,2
add edx,eax
@loop:
sub edx,4
mov bl,[edx]
mov bl,[ebx+ecx]
mov [edx],bl
mov bl,[edx+1]
mov bl,[ebx+ecx+256]
mov [edx+1],bl
mov bl,[edx+2]
mov bl,[ebx+ecx+512]
mov [edx+2],bl
cmp edx,eax
ja @loop
pop ebx
end;
← →
Sha (2003-02-05 19:10) [4]Вот. Максимально ускорил. Быстрее крутить невозможно. Цикл требует всего 6 тактов CPU. Правда, ради этого пришлось чуть-чуть нарушить красоту и исправить имена твоих переменных так, чтобы они не совпадали с именами регистров процессора. Поэтому процедура PrepareColors теперь не нужна.
var
clRL,clGL,clBL : array [Byte] of Byte;
procedure DoRowAsm(P: PClr32Array; W: integer);
asm
push ebx
xor ebx,ebx
xor ecx,ecx
shl edx,2
add edx,eax
@loop:
mov cl,[eax]
mov bl,[eax+1]
mov cl,[ecx+clBL]
mov bl,[ebx+clGL]
mov [eax],cl
mov [eax+1],bl
mov cl,[eax+2]
add eax,4
mov cl,[ecx+clRL]
cmp eax,edx
mov [eax+2],cl
jb @loop
pop ebx
end;
← →
AlexT1000 (2003-02-06 13:33) [5]спасибо . сейчас попробую
← →
AlexT1000 (2003-02-06 13:42) [6]
у меня выдает ошибку на этой строке
mov cl,[ecx+clBL]
operand size mismatch
← →
Sha (2003-02-06 15:41) [7]У меня на D6 работает.
Попробуй mov cl,byte ptr [ecx+clBL]
В третьей строке снизу опечатка, надо mov [eax-2],cl
← →
AlexT1000 (2003-02-06 17:09) [8]У меня D5 .
mov cl,byte ptr [ecx+clBL]
пробовал уже. Accsess violation происходит.
В третьей строке снизу опечатка, надо mov [eax-2],cl
учту. спасибо
← →
AlexT1000 (2003-02-06 17:13) [9]у меня
clRL,clGL,clBL
приватные переменные класса.
это может влиять?! я не думаю, конечно, но мало ли
← →
MBo (2003-02-06 17:16) [10]>это может влиять?!
Да.
← →
Sha (2003-02-06 17:22) [11]2 AlexT1000 (06.02.03 17:13)
вынеси их оттуда.
← →
Sha (2003-02-06 17:24) [12]я имею ввиду из класса, а не из привата.
← →
AlexT1000 (2003-02-06 17:31) [13]вынес. через эти строчки проехало. но только гдето в цикле снова
Accsess violation
вроде на mov cl,[eax]
т.e наверное выход за границы массива P
← →
AlexT1000 (2003-02-06 17:38) [14]и еще . как этот код модифицировать чтобы массивы все-аки оставались переменными класса?
← →
Sha (2003-02-06 17:40) [15]не передавай W=0 и все будет нормально.
еще имеется фича :) первый параметр не указатель на массив, а адрес первого элемента. Поэтому вызов такой
DoRowAsm(@a[0], 1024);
← →
Sha (2003-02-06 17:41) [16]Модифицируем. Пусть сначала задышет.
← →
Sha (2003-02-06 17:50) [17]Да, надеюсь, у тебя сейчас DoRowAsm не метод класса?
Это должна быть (пока) обычная процедура.
← →
AlexT1000 (2003-02-06 17:55) [18]таки - была методом
вынес - заработала .
но что удивительно по-моему в пророста нет даже минимального .
во всяком случае визуально даже вроде медленней стало.
я конечно сейчас попробую по времени проверить на здаровенном битмапе каком -либо
← →
Sha (2003-02-06 18:01) [19]2 AlexT1000 (06.02.03 17:55)
Прирост сильно зависит от типа процессора.
На Р4 - в несколько раз, на AMD-K6 может не быть никакого.
← →
Sha (2003-02-06 18:04) [20]У меня даже на P4 на больших битмапах иногда почему-то конвейер простаивает.
← →
AlexT1000 (2003-02-06 18:14) [21]Да судя по всему прирост в скорости минимален.
5 в лучшем случае 10 процентов.
← →
Sha (2003-02-06 18:18) [22]Процессор какой?
← →
AlexT1000 (2003-02-06 18:27) [23]игра не стоила свеч. как и говорил MBo
скорость большинства операций получилась в принципе такая-же как и у фотошопа
сильно тормозит дело перерисовка прогресса в статусбаре.
даже если его рисовать через 10 процентов
и еще ты ,как я понял , тоже обрабатываешь битмапы.
у меня сильно хромает перекраска HSL вместе три параметра (как и у фотошопы) не знаешь как это ускорить . там алгоритм страшнючия я его из GIMP выдрал .
как фотошоповцам удается так быстро HSL пересчитывать?!
← →
Sha (2003-02-06 18:32) [24]Не рисуй прогресс, или рисуй с большим интервалом, или расуй его сам.
Малый прирост ОБЩЕЙ производительности может означать, что еще где-нибудь есть тормоза. Надо оптимизировать ВСЕ емкие по времени процедуры, а не только эту.
Если же именно на ней свет сошелся клином, то этот код можно оптимизировать под конкретный процессор, чтобы упростить дешифрование команд и все максимально ускорить даже на самых простеньких процах.
1. Выравниваем массивы на 256.
2. Вместо операций типа xor ebx,ebx пишем lea ebx,[clGL], а вместо mov bl,[ebx+clGL] пишем mov bl,[ebx]
3. Впридачу можно цикл развернуть, если очень надо.
4. Можно вместо вызова процедуры сделать asm-вставки, если совсем прижало.
Кардинальное решение сменить процессор.
← →
AlexT1000 (2003-02-06 18:46) [25]спасибо за советы. все это я конечно делать не буду.
Кардинальное решение сменить процессор. - это коммерческий продукт. так что ни о какой смене процессора не может идти речи.
Спасибо за помощь. ветка закрыта.
Страницы: 1 вся ветка
Текущий архив: 2003.02.17;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.016 c