Форум: "Media";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];
ВнизКак устроить быструю отрисовку прозрачных спрайтов? Найти похожие ветки
← →
Веталь (2003-10-06 13:35) [0]Здравствуйте, господа Профессионалы!!!
У меня вопрос по поводу рисования прозрачных картинок в DelphiX.
Стандартная процедура DrawAlpha меня не устроила своей скоростью, так как только одна небольшая прозрачная картинка уменьшает FPS раза в два. Можно ли как-нибудь сделать эту процедуру более быстрой?
← →
misterix (2003-10-06 18:15) [1]Слушай, это долго объяснять. Если ты юзаешь DelphiX, то посмотри примеры. Там вроде бы все есть.
← →
Mihey (2003-10-06 22:32) [2]В принципе, никак, если нужно то же качество. Однако всё же видел я выход. Есть такая штука, называется юнит PowerTools (не путать с компонентом PowerDraw, который тоже связан с DirectX), который заменяет стандартную функцию альфа-блендинга, в результате идёт прирост скорости для DelphiX. Она весит где-то 1,5 Мб, так что поищи.
← →
Koreolis (2003-10-17 09:08) [3]misterix: Слушай, это долго объяснять.//
Ага! Хороший ответ. Долго объяснять.
Люди, а серьёзно: может кто занимался быстрым выводом с прозрачностью под директ?
Задача такая: есть поверхность источник, есть поверхность приёмник. Приёмник фиксированный по размеру. Для упрощения(и ускорения) источник тоже. Ну, типа как я понимаю, строим табличку для цветов. (размер нислабый, для 16битного режима - $FFFF*$FFFF). Причем прозрачность-то получается на 50%(но мона сделать, чтобы одна половина таблицы - на 20%, другая на 80. А во второй таблице - на 40 и на 60)Но что ни сделаешь ради скорости! А теперь просьба к профи: напишите вывод на поверхность на ассемблере!(с ииспользованием таблички). Вот это было-бы действительно круто!
← →
Mihey (2003-10-17 20:00) [4]Я сам не понимаю, что это, но это писал очень крутой чувак и это по теме и это на асме. Это про альфа-блендинг.
procedure AsmBlt( Src, Dst: TDDSurf; srcR, DstR: TRect; bltType: word );
var Width : integer;
var srcLocked, dstLocked: boolean;
var srcDDSD, dstDDSD : TDDSURFACEDESC2;
begin
fillChar( dstDDSD, sizeOf( TDDSURFACEDESC2 ), #0);
dstDDSD.dwSize := sizeOf( TDDSURFACEDESC2 );
srcDDSD := dstDDSD;
dstLocked:=Dst.Lock( @dstR,dstDDSD,0{DDLOCK_WAIT+DDLOCK_NOSYSLOCK},0)=DD_OK;
srcLocked:=Src.Lock( @srcR,srcDDSD,0{DDLOCK_WAIT+DDLOCK_NOSYSLOCK},0)=DD_OK;
if srcLocked and dstlocked then begin
Width := dstR.Right - dstR.Left;
srcDDSD.lPitch := srcDDSD.lPitch - Width shl 1;
dstDDSD.lPitch := dstDDSD.lPitch - Width shl 1;
asm
push eax
push ebx
push ecx
push edx
push edi
push esi
cmp bltType, blt_Transp
jne @@1
mov ebx, offset @@blt_Transp
jmp @@Start
@@1:cmp bltType, blt_Shadow
jne @@2
mov ebx, offset @@blt_Shadow
jmp @@Start
@@2:cmp bltType, blt_TranspPlus
jne @@3
mov ebx, offset @@blt_TranspPlus
jmp @@Start
@@3:cmp bltType, blt_TranspMinus
jne @@4
mov ebx, offset @@blt_TranspMinus
jmp @@Start
@@4:cmp bltType, blt_Riddle
jne @@5
mov ebx, offset @@blt_Riddle
jmp @@Start
@@5:mov ebx, offset @@PutPoint
@@Start:
mov ecx, srcR.Bottom
sub ecx, srcR.Top
mov esi, srcDDSD.lpSurface
mov edi, dstDDSD.lpSurface
@@nextLine:
push ecx
mov ecx, Width
@@nextPoint:
lodsw
or ax, ax
jz @@shiftPoint // i?ic?a?iay oi?ea, iaoiaei
mov dx, [edi] // i?ic?a?iue iauaeo
jmp EBX
@@blt_Transp:
and dx, ShadowMask
shr dx, 1
and ax, ShadowMask
shr ax, 1
add ax, dx
jmp @@putPoint
@@blt_TranspMinus:
and ax, ShadowMask
shr ax, 1
or ax, dx
jmp @@putPoint
@@blt_TranspPlus:
and dx, ShadowMask
shr dx, 1
or ax, dx
jmp @@putPoint
@@blt_Shadow:
mov ax, [ edi ] // oaiu iauaeoa
and ax, ShadowMask
shr ax, 1
jmp @@putPoint
@@blt_Riddle: // auaiaei ?a?ac 1 oi?eo
pop edx
push edx
test edx, 1
jz @@even
test ecx, 1
jz @@shiftPoint
jmp @@putPoint
@@even:
test ecx, 1
jnz @@shiftPoint
@@putPoint:
stosw
jmp @@getNext
@@shiftPoint:
add edi, 2
@@getNext:
dec ecx
or ecx, ecx
jz @@pointsDone
jmp @@nextPoint
@@pointsDone:
add edi, dstDDSD.lPitch
add esi, srcDDSD.lPitch
pop ecx
dec ecx
or ecx, ecx
jz @@linesDone
jmp @@nextLine
@@linesDone:
pop esi
pop edi
pop edx
pop ecx
pop ebx
pop eax
end;
end;
if srcLocked then Src.unLock( @srcR );
if dstLocked then Dst.Unlock( @dstR );
end;
← →
Zryndins (2003-10-22 15:53) [5]тебе MMX алгоритм не помешает , поковыряй DelphiX...
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.031 c