Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.034 c
8-80036
нет
2003-10-20 12:38
2004.02.25
База Windows Media Player


1-80013
hfa
2004-02-13 08:15
2004.02.25
Составление формул


14-80100
Layner
2004-02-05 14:52
2004.02.25
Выводил ли кто нибудь WMZ (WebMoney) в наличку?


7-80313
Shiza
2003-12-03 13:54
2004.02.25
Скорость CD


1-79847
Серёга
2004-02-10 18:55
2004.02.25
Файлы *.dcu





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский