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

Вниз

Оптимизация кода   Найти похожие ветки 

 
Вова   (2013-07-01 16:36) [80]

и в добавок эта битовая математика ад какой то, я ничего не могу в ней понять ) откуда все понимают какие маски накладывать и все такое..


 
Sha ©   (2013-07-01 17:12) [81]

> Sapersky
> В целом, насчёт ускорения в 5-10 раз Sha всё-таки загнул.
> ещё вариант - обрабатывать пачками по 4 пикселя


как бы нам это проверить... )

> Вова
> и в добавок эта битовая математика ад какой то


если скорость нужна, научишься и разберешься: )

var
 ColorMap: array[0..16*16*16-1] of integer;
procedure ShaConvert(p: pIntegerArray; rowcount, pixelcount: integer);
var
 i, j, t, rest: integer;
begin;
 pixelcount:=pixelcount*3;
 while rowcount>0 do begin;
   rest:=pixelcount;
   while rest>=6 do begin;
     i:=p[0];
     j:=p[1];
     t:=ColorMap[i shr 24 and $F0 or j shr 4 and $F0F];
     i:=ColorMap[i and $F0 or i shr 12 and $F0F];
     p[0]:=i or t shl 24;
     if rest<12 then begin;
       pWordArray(p)[2]:=t shr 8;
       inc(pAnsiChar(p),6);
       dec(rest,6);
       break;
       end;
     i:=p[2];
     j:=ColorMap[j shr 16 and $F0 or j shr 28 and $F or i shl 4 and $F00];
     p[1]:=t shr 8 or j shl 16;
     p[2]:=j shr 16 or ColorMap[i shr 8 and $F0 or i shr 20 and $F0F] shl 8;
     inc(pAnsiChar(p),12);
     dec(rest,12);
     end;
   if rest>0 then begin; //последний нечетный пиксел
     i:=pWordArray(p)[0]+pByteArray(p)[2] shl 16;
     i:=ColorMap[i and $F0 or i shr 12 and $F0F];
     pWordArray(p)[0]:=i;
     pByteArray(p)[2]:=i shr 16;
     end;
   dec(rowcount);
   inc(pAnsiChar(p),(4-pixelcount) and 3);
   end;
 end;


 
Вова   (2013-07-01 17:22) [82]

омг, ну ради такого профита можно перейти и на 32, но вот только все эти i and $F0 это писец ) статью выше я читал, понял не очень, но это по сравнению с той статьей вообще космос )


 
Sha ©   (2013-07-01 17:24) [83]

результат давай: проценты или разы?


 
Вова   (2013-07-01 17:24) [84]

есть где нибудь описание "на пальцах" как вот это i shr 24 and $F0 or j shr 4 and $F0F понять? )


 
Sha ©   (2013-07-01 17:38) [85]

Там в коде [81] ошибочка вкралась, исправить надо:

   if rest>0 then begin; //последний нечетный пиксел
     i:=pWordArray(p)[0]+pByteArray(p)[2] shl 16;
     i:=ColorMap[i and $F0 or i shr 12 and $F0F];
     pWordArray(p)[0]:=i;
     pByteArray(p)[2]:=i shr 16;
     inc(pAnsiChar(p),3);    
     end;


 
RWolf ©   (2013-07-01 17:41) [86]


> есть где нибудь описание "на пальцах"

учебник по информатике, 7-й класс.


 
Вова   (2013-07-01 17:42) [87]


> результат давай: проценты или разы?


пока только ошибка j:=p[1];

Если p := tbmp.Scanline(tbmp.Height-1)


 
Sha ©   (2013-07-01 17:46) [88]

У меня компилится без проблем. Ты мой код меняй.
Свой меняй. И свою секретную ошибку сюда давай.


 
Sha ©   (2013-07-01 17:46) [89]

* Ты мой код не меняй.


 
Вова   (2013-07-01 17:49) [90]

я твой не менял, просто передал в функцию вот это...


 
Вова   (2013-07-01 17:50) [91]

оно компилицо, оно при выполнении вылетает с access violation


 
Sha ©   (2013-07-01 17:51) [92]

Ошибка-то какая?


 
Вова   (2013-07-01 17:54) [93]

First chance exception at $006389F5. Exception class $C0000005 with message "access violation at 0x006389f5: read of address 0x0444f000". Process SDIAPP.exe (66676)


 
Sha ©   (2013-07-01 17:54) [94]

а высоту в строках, ширину в точках передал?


 
Вова   (2013-07-01 17:59) [95]


T := GetTickCount;

p:= tbmp2.ScanLine[tbmp2.Height-1];

for I := 0 to 1000 do
   ShaConvert(p, tbmp2.Height, tbmp2.Height*tbmp2.Width);
T := GetTickCount-T;


 
Sha ©   (2013-07-01 18:00) [96]

ShaConvert(p, tbmp2.Height, tbmp2.Width);


 
Вова   (2013-07-01 18:01) [97]

хм.....да уж))


 
Вова   (2013-07-01 18:05) [98]

3 миллисекунды, но меня смущает, что со второго раза в цикле, он начинает колбасить уже переколбашеный в первом цикле массив )


 
Sha ©   (2013-07-01 18:07) [99]

И че, ему все равно что колбасить, скорость процесса постоянна )

Ну, так все-таки разы? ))


 
Вова   (2013-07-01 18:08) [100]

вместо желтого красный, появился голубой...


 
Вова   (2013-07-01 18:10) [101]

ну по скорости да, но я как понял, 32 проще ) да и на 1 миллисекунду быстрее ))


 
Sha ©   (2013-07-01 18:12) [102]

1. правильные цвета будут только после однократного конвертирования,
конвертирование отконвертированного все ломает.

2. эта битовая математика - сущий ад, может что и не доглядел - найди и исправь )


 
Вова   (2013-07-01 18:13) [103]

и потом это все же перевернутая картинка ) после переворачивания будет те же 10 мс ) т.е. чтобы извлечь профит надо с такой же как в памяти работать.

правда у купикселей, она встает по человечески по умолчанию, так что не проверить ( кроме того купиксели работают с одинаковой скоростью и с 24 битами и с 32 (

ну я отягощен мыслью что все нужно переделывать )))


 
Sha ©   (2013-07-01 18:15) [104]

> но я как понял, 32 проще ) да и на 1 миллисекунду быстрее ))

быстрее будет раза 2,
причем развернутый цикл легко переделать из моей процедуры


 
Sha ©   (2013-07-01 18:17) [105]

> и потом это все же перевернутая картинка )
> после переворачивания будет те же 10 мс

во-первых, нафига переворачивать?

во-вторых, ты вроде прогаммист, а программист может
перевернуть картинку в процессе обработки в том же цикле.


 
Sha ©   (2013-07-01 18:18) [106]

> купикселей, она встает по человечески по умолчанию

выпал в осадок


 
Вова   (2013-07-01 18:19) [107]

ну когда я первый раз попробовал мне это дало лишних 10 миллисекунд, хотя там цикл был другой.

Переворачивать потому что у меня шаблоны то перевернутые, так что либо шаблоны переделывать, либо это переворачивать под шаблоны..


 
Sha ©   (2013-07-01 18:21) [108]

Шаблоы переворачивать один раз, картинку - постоянно.
Что выгоднее?
уууууу


 
Вова   (2013-07-01 18:24) [109]

ну вот я и говорю, что нужно переделывать, чтоб шаблоны были перевернутые.


 
Вова   (2013-07-01 18:25) [110]

вернее не перевернутые )


 
Вова   (2013-07-01 18:41) [111]

интересно, а через SetDIBits будет еще быстрее чем через сканлайн? )
может уже чтобы 2 раза потом не переделывать разобраться)


 
Sha ©   (2013-07-01 20:12) [112]

> Вова   (01.07.13 18:41) [111]

Если преобразовывать цвет в цвет, то быстрее [81,85] для 24-битного цвета не получится.
А если цвет в булеан, то можно отжать еще несколько процентов.

32-битный цвет, наверно, будет в 1.2-2.0 раза быстрее в зависимости от процессора.


 
Sapersky   (2013-07-02 07:19) [113]

Ну, так все-таки разы? ))

Разы.
Мне показалось, что было утверждение вроде "выкинь купиксели и будет тебе 5-10 раз", только за счёт выкидывания. А оказывается в [57] уже была запланирована развёртка цикла с выравниванием доступа к памяти, кто бы мог подумать :)


 
Sha ©   (2013-07-02 08:10) [114]

кто ж всю лапшу сразу вываливает на клиента, так можно отпугнуть )


 
Вова   (2013-07-02 13:25) [115]

блиииин! жил же спокойно (( раз рассказали все это теперь расскажите и что это значит

старший байт тот что в конце (слева направо)?


i := p[0]; //Берем первые 4 байта в строке (BGR + 1 байт канал B от следующего пикселя)

j := p[1]; //Берем вторые 4 байта в строке

Дальше ад:
T := ColorMap[i shr 24 and $F0 or j shr 4 and $F0F];

i shr 24 - смещение вправо 3 байт, т.е. остается канал B первого пикселя? правда он теперь на месте B второго пикселя. объединяется с `11110000` опять же не понятно как, i это же 4 байта, а не 1, или он только с последним самым правым байтом или со всеми по очереди? И главное - какой в этом смысл? Блин ну это ведь что то значит ) просто так наложили какую то лажу на канал цвета, что это с цветом то делает? ) т.е. 4 последних бита обнуляются, но нафига???

or j - первых 4 байта у которых значащими остались только первые 4 бита в последнем байте, накладываются на вторые 4 байта, получается вообще непонятно что )
j shr 4 - 4 правых бита от j удаляются. получается 4 байта с пустыми 4 битами в начале, и с какой то непонятной лажей (получившейся в результате or j) в самых правых 4 битах, а потом вообще ппц объединение с 111100001111, это ж полтора байта, как оно вообще накладывается (( на 4 байта! Обнуляются первые 4 бита правого байта? сдается мне что это не так, т.к почему тогда не 0F? ( но что за хрень это тогда?

В общем, к данному моменту кода у меня в голове полная каша не позволяющая идти дальше. Напоминает школу ) "В результате тривиальных вычислений получаем....." что получаем, откуда непонятно ( и как результат 10 впустую потраченных лет.

i := ColorMap[i and $F0 or i shr 12 and $F0F]; ну это понятно, см. выше ((

p[0] := i or T shl 24; - объединение 2х абракадабр, если у shl приоритет такой же как у or то вообще какая то херня, выкинули 3 байта остался 1 Оо

Все что я нашел об этом, это надписи о том, что в интернете куча статей об этом, видимо не такая уж и куча....Дайте ссылку хоть на одну! то что "1111000" or "00001111" = "11111111" это я вроде понял, только вот это никак не помогает понять, что в этом коде написано.


 
Вова   (2013-07-02 13:28) [116]

блин (((


 
Sha ©   (2013-07-02 13:51) [117]

1. Байты в integer нумеруются с 0 до 3. Младший байт содержит содержит младшие 8 бит, т.е. остаток от деления на 256.

2. В теории, в голове и на бумаге младший байт обычно изображают слева, старший справа, (это похоже на десятичную систему, только здесь она 256-ричная).

3. В памяти машины с архитектурой IA-32 адрес integer совпадает с адресом его младшего байта, байт номер 1 хранится по адресу на 1 больше, старший байт - по адресу на 3 больше. Можно считать, что адреса растут справа налево.  

4. Команды shr и shl имеют дело с представлением 2, причем сдвиг в действительности выполняется на указанное число бит, взятое по модулю размера операнда (т.е. 32 для integer).

5. Команды and и or с integer-операндами выполняются побитно, т.е. i and 1 вернет значение младшего бита младшего байта (1 для нечетного числа, 0 для четного), a i or 1 вернет первое нечетное после i для четного i или само i для нечетного i.


 
Sha ©   (2013-07-02 13:54) [118]

Зарапортовался, все с точностью до наоборот:

2. В теории, в голове и на бумаге младший байт обычно изображают справа, старший слева,


 
Sha ©   (2013-07-02 14:10) [119]

Допустим в переменной i лежит цвет,
интесивность каждой составляющей в своем байте (байты 0..2).
Пусть
 i:=$00aabbcc;
Каждую из них усекаем до старших 4х битов:
 i:=i and $F0F0F0;
Получаем
 i:=$00a0b0c0;
Формируем число от 0 до 16*16*16-1 - будущий индекс цвета в таблице:
 i:=(i shr 12 and $F) + (i and $F0) + (i shr 12 and $F00);
Получаем
 i:=$00000acb;
Tот же самый результат дает
 i:=i and $F0 or i shr 12 and $F0F;


 
Sha ©   (2013-07-02 14:39) [120]

Обрабатывать цвет по определению надо триплетами, читать-писать для скорости надо двойными словами.
Из-за этого небольшого противоречия возникают некоторые сложности с пониманием алгоритма )

Давай посмотрим это на простом примере. Пусть в памяти m последовательно лежат 4 байта. Надо первый из них увеличить на 1, второй умножить на 2, третий разделить на 3, четвертый оставить без изменений. Читать и писать переменную m разрешается только 1 раз.
Решение:

i:=m;
m:=(i  + 1) and $FF
  or i and $7F00 shl 1
  or i shr 16 and $FF div 3 shl 16
  or i and $FF000000;



Страницы: 1 2 3 4 5 6 вся ветка

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

Наверх





Память: 0.68 MB
Время: 0.017 c
3-1299090765
John_Vattic
2011-03-02 21:32
2014.07.06
Access 2007 и Delphi 7


15-1387349417
DevilDevil
2013-12-18 10:50
2014.07.06
Россия. Доходы. Цифры


15-1386273085
Rouse_
2013-12-05 23:51
2014.07.06
о вреде курения


15-1387570707
Несусвет
2013-12-21 00:18
2014.07.06
Как сохранить блог?


15-1387485002
Юрий
2013-12-20 00:30
2014.07.06
С днем рождения ! 20 декабря 2013 пятница





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