Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];

Вниз

Canvas.Pixels быстрее?   Найти похожие ветки 

 
debuger ©   (2004-09-30 20:43) [0]

Доброго всем всего.
Я явно чего-то недопонимаю, потому хочу услышать ваше мнение.

for i := 0 to 100 do
 for j := 0 to 100 do
   bArray[ i, j ] := vBitMap.vCanvas.Pixels[ i, j ] xor $0000FF;  


скорость (разница GetTickTime) = 50 мс.

for j := 0 to 100 do
 begin
   ptr := vBitMap.ScanLine[ j ];
   for i := 0 to 100 do
     bArray[ i, j ] := p[ i shl 2 ];
 end;  

скорость (разница GetTickTime) = 350 мс. !!!


 
debuger ©   (2004-09-30 20:46) [1]

Вопрос к тому, что вроде как через сканлайн должно быть быстрее.


 
debuger ©   (2004-09-30 21:45) [2]

Кто-то мне сказал, что shl слишком трудоемко.
Заменил ее на * 4, результаты те же!

Кто говорил, что ScanLine быстрее?


 
GuAV ©   (2004-09-30 22:05) [3]

поменяй местами в bArray i и j после чего используй move.
тога scanline быстрее


 
debuger ©   (2004-09-30 22:11) [4]

Как move? когда мне нужно каждый четвертый байт из того, что возвращает ScanLine.

Тут шутка в том, что в битмапе грэйскейл изображение, и мне нужно только одну составляющую RGB. Вообще-то задача в том чтобы из битмапа получить двумерный массив байт (елемент массива - значение интенсивности на битмапе), и даже 50 мс для меня очень много! Хотя бы 10-20.

И все-таки на счет мува поподробней...


 
Рыба ©   (2004-09-30 22:11) [5]

>for j := 0 to 100 do
> begin
>  ptr := vBitMap.ScanLine[ j ];
>  for i := 0 to 100 do
>   bArray[ i, j ] := p[ i shl 2 ];
> end;  

Мдя :))


 
DiamondShark ©   (2004-09-30 22:13) [6]

Никто не говорил, что ScanLine быстрее.


 
Рыба ©   (2004-09-30 22:14) [7]

>DiamondShark ©  (30.09.04 22:13) [6]
>Никто не говорил, что ScanLine быстрее.

Плюнь в лицо этому никто!! ;-))


 
DiamondShark ©   (2004-09-30 22:15) [8]

Работай с битмапами напрямую через API. Компоненты для этого слишком тяжёлые.


 
debuger ©   (2004-09-30 22:16) [9]

2 Рыба.

Кроме этой опечатки, ты еще не нашел vBitMap.vCanvas.

PS: Если любишь указывать всем на их опечатки, то указывай сразу на все, каждую отдельным постом плохо читается...

2 DiamindShark. Говорили, на этом же сайте...


 
DiamondShark ©   (2004-09-30 22:17) [10]


> Рыба ©   (30.09.04 22:14) [7]

Ты с битмапами работал, или это твоя святая вера?
А код смотрел?


 
DiamondShark ©   (2004-09-30 22:18) [11]


> debuger ©   (30.09.04 22:16) [9]

У тебя всегда есть выбор: верить тому, что говорят, или верить своим глазам.


 
Рыба ©   (2004-09-30 22:23) [12]

Я с битмапом работал и точно знаю, что ScanLine в десятки раз быстрее Canvas.Pixels.


 
Рыба ©   (2004-09-30 22:31) [13]

Попробуй сравнить скорость попиксельной заливки.

procedure FillBmpWithPixels(Bmp: TBitmap; R, G, B: Byte);
var x, y: Integer;
   Color: TColor;
begin
 Color := RGB(R, G, B);
 for x := 0 to Bmp.Width - 1 do
   for y := 0 to Bmp.Height - 1 do
     Bmp.Canvas.Pixels[x, y] := Color;
end;

procedure FillBmpWithScanLine(Bmp: TBitmap; R, G, B: Byte);
var x, y: Integer;
   p: pByteArray;
begin
 Bmp.PixelFormat := pf24Bit;
 for y := 0 to Bmp.Height - 1 do
 begin
   p := Bmp.ScanLine[y];
   for x := 0 to Bmp.Width - 1 do
   begin
     p[x*3]   := B;
     p[x*3+1] := G;
     p[x*3+2] := R;
   end;
 end;
end;


 
Mihey_temporary ©   (2004-09-30 22:41) [14]

Поддерживаю Рыбу. Протестировал код debuger © (30.09.04 20:43) у себя - при тех же числах (сканится 100х100) использование Canvas.Pixels даёт 30 мс, а Scanline - 1 мс. При этом не совсем понял, как p[ i shl 2 ] работает (т.к. Delphi матюгался), поэтому использовал что-то вроде этого:


type PByteArray = ^TByteArray;
 TByteArray = array [0..500] of TRGBTriple;

var i, j: Integer;
   p: PByteArray;
begin
for j := 0 to 100 do
begin
  p := vBitMap.ScanLine[ j ];
  for i := 0 to 100 do
    bArray[ i, j ] := p[i].rgbtBlue;
end;


 
Рыба ©   (2004-09-30 22:42) [15]

>debuger ©  (30.09.04 21:45) [2]
>Кто-то мне сказал, что shl слишком трудоемко.

Плюнь ему в глаз!! :о)))


 
DiamondShark ©   (2004-09-30 22:50) [16]

Да, это я нагнал, извиняюсь :(


 
DiamondShark ©   (2004-09-30 22:53) [17]

Вариант со сканлайн дал измеримый результат лишь для размеров выше 1024х1024.

Что-то там не то намеряли...


 
Рыба ©   (2004-09-30 22:59) [18]

>debuger ©

Почитай
http://www.delphimaster.ru/articles/pixels/index.html
Может пригодится ;)


 
debuger ©   (2004-10-03 16:51) [19]

Думаю плевать ни в кого особо не нужно.

Весь прикол был BitMap.HandleType = bmDDB, когда он bmDIB сканлайн нереально решает, где-то около 5 мс.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.039 c
1-1096030574
misha123
2004-09-24 16:56
2004.10.17
утечка памяти


14-1096282330
Vlad Oshin
2004-09-27 14:52
2004.10.17
Опять написал :)... Стих.


6-1091911289
RaPToR_1
2004-08-08 00:41
2004.10.17
socks5


3-1095835304
Pashkerton
2004-09-22 10:41
2004.10.17
Real time изменение записей!


9-1087305854
Developer
2004-06-15 17:24
2004.10.17
А как сделать заставку в начале, которая плавно появляеться..





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский