Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите периписать маааленький кусочек на асме.


Страницы:   1 2

AlexT1000 ©   (2003-02-05 15:25:00) 

Ребята очень надо для увеличения скорости перекраски скорости .
Сам я асм уже позабыл, к сожалению

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;


AlexT1000   (2003-02-06 13:33:00) [21]

спасибо . сейчас попробую


Sha   (2003-02-05 19:10:00) [22]

Вот. Максимально ускорил. Быстрее крутить невозможно. Цикл требует всего 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;


Sha   (2003-02-05 16:54:00) [23]

Попробуй это. Вдруг заработает? :)
Вызывай 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;


AlexT1000   (2003-02-05 16:14:00) [24]

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 было бы в самый раз
но я не помню как в регистры значения массыва загонять


MBo   (2003-02-05 15:32:00) [25]

здесь ассемблер практически не даст выигрыша


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо