Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2010, 19:17   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Оптимизация

Код:
A[I].rgbRed   := Sub(A[I].rgbRed, 255 - Value);
A[I].rgbGreen := Add(A[I].rgbGreen, Value - 255);
Код:
 Function Add(A,B : Byte): Byte;
  Begin
   If A + B < 255 Then Result := A + B
                Else Result := 255;
  End;

 Function Sub(A,B : Byte): Byte;
  Begin
   If A - B < 000 Then Result := 000
                Else Result := A - B;
  End;
Это поддается оптимизации?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 06.07.2010, 20:37   #2
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Тут не то чтобы оптимизация, а даже ошибка, у тебя переполнение байта идет, сумма всегда будет меньше 255, кроме единственного случая когда сумма будет равна 255. Или так задумано?
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 06.07.2010 в 20:50.
mutabor вне форума Ответить с цитированием
Старый 06.07.2010, 20:38   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Для того и две функи написаны Add и Sub - они предотвращают переполнение.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 06.07.2010, 20:45   #4
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Сообщение от Alex Cones Посмотреть сообщение
Для того и две функи написаны Add и Sub - они предотвращают переполнение.
Почитай, я дополнил предыдущий пост. А, нет, я там ошибся, у тебя все правильно там.

Кстати, а зачем его предотвращать? Это ж не ошибка, просто его нужно с умом использовать. И еще, вызов лишней функции тоже не способствует оптимизации

p.s. Может бинарными операциями нахимичить вместо условий?
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 06.07.2010 в 21:01.
mutabor вне форума Ответить с цитированием
Старый 06.07.2010, 22:00   #5
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
Кстати, а зачем его предотвращать?
Ну вот например мы увеличиваем яркость изображения по всем каналам. Например пиксель $FE00FE мы хотим увеличить на 5 в кажом канале. Получаем $030503, а должны были $FF05FF.

Просто я сейчас пользуюсь Get\SetDIBBits, и думал, что они быстрые. Попробовал - около 800 х 600 пикселей\секунда. Думаю, что проблема не в способе, а в том, что я нахомичил:
Код:
Procedure EffectBrigthness(Var T : TTexture; Value : Integer);
 Var
  BI  : BitMapInfo;
  A   : Array of RGBQuad;
  I   : Integer;
  Loc : HDC;
 Begin
  Loc := CreateCompatibleDC(Warehouse.Buffer.DC);
  SelectObject(Loc, T.Bitmap);
  ZeroMemory(@BI, SizeOf(BI));
  BI.bmiHeader.biWidth := T.Width;
  BI.bmiHeader.biHeight := T.Height;
  BI.bmiHeader.biSize := SizeOf(BitMapInfoHeader);
  BI.bmiHeader.biCompression := BI_RGB;
  BI.bmiHeader.biBitCount := 32;
  BI.bmiHeader.biPlanes := 1;
  SetLength(A, T.Height * T.Width * 4);
  GetDIBits(Loc, T.Bitmap, 0, T.Height, @A[0], @BI, DIB_RGB_COLORS);

//  A[X + Y * T.Width].rgbBlue := $FF;
  For I := 0 to Length(A) - 1 Do
   Begin
    If Value < 255 Then
     Begin
      A[I].rgbRed   := Sub(A[I].rgbRed, 255 - Value);
      A[I].rgbGreen := Sub(A[I].rgbGreen, 255 - Value);
      A[I].rgbBlue  := Sub(A[I].rgbBlue, 255 - Value);
     End
      Else
     Begin
      A[I].rgbRed   := Add(A[I].rgbRed, Value - 255);
      A[I].rgbGreen := Add(A[I].rgbGreen, Value - 255);
      A[I].rgbBlue  := Add(A[I].rgbBlue, Value - 255);
     End;
   End;

  SetDIBits(Loc, T.Bitmap, 0, T.Height, @A[0], @BI, DIB_RGB_COLORS);
  DeleteDC(Loc);
 End;
TickCount поставить руки не доходят, но думаю это все моя "химия" в цикле I.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 06.07.2010, 23:19   #6
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Сообщение от Alex Cones Посмотреть сообщение
TickCount поставить руки не доходят, но думаю это все моя "химия" в цикле I.
Поставь, никогда не помешает, может ты и ошибаешься.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 06.07.2010 в 23:22.
mutabor вне форума Ответить с цитированием
Старый 06.07.2010, 23:24   #7
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Цитата:
но думаю это все моя "химия" в цикле I.
Мне кажется не только.
Во-первых. Здесь два раза копируется весь битмап в память (сначала в массив А, затем обратно в DIB). Это как минимум не оптимально.
Ну и само выделение памяти под этот самый массив тоже наверное какое-то время занимает (не уверен).
Это неправильно, надо напрямую работать с массивом точек.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 06.07.2010, 23:49   #8
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Зачем отдельно Add и Sub? Я бы сделал как-нибудь так

Код:
function IntToByte(i: Integer): Byte;
asm
    or   eax, eax
    jns  @1        // > 0
    xor  eax, eax
    ret
@1: cmp  eax, 0FFh
    jbe  @2        // <= 255
    or  eax, 0FFh
@2:
end;

for x := 0 to Bitmap.Width - 1 do
begin
  A[x].rgbtRed := IntToByte(A[x].rgbtRed + value);
  A[x].rgbtGreen := IntToByte(A[x].rgbtGreen + value);
  A[x].rgbtBlue := IntToByte(A[x].rgbtBlue + value);
end;
Вложения
Тип файла: rar brightness.rar (185.7 Кб, 14 просмотров)
пыщь
JTG вне форума Ответить с цитированием
Старый 07.07.2010, 07:32   #9
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Странно, неужели TickCount дает такие неточные значения?
Код:
 Procedure Tick(Smes : String);
 Var
  S : string;
  F : textFile;
 Begin
  Str(GetTickCount, S);
  AssignFile(F, 'D:\log.txt');
  Append(F);
  Writeln(F, S + ' ' + Smes);
  CloseFile(F);
 End;
Код:
...SelectObject(Loc, T.Bitmap);
  Tick('SelectObject(Loc, T.Bitmap);');
  ZeroMemory(@BI, SizeOf(BI));
  Tick('ZeroMemory(@BI, SizeOf(BI));');
  BI.bmiHeader.biWidth := T.Width;
  Tick('BI.bmiHeader.biWidth := T.Width;');
  BI.bmiHeader.biHeight := T.Height;
  ...
Результат:
Код:
1355781 Lets begin
1355781 Loc := CreateCompatibleDC(Warehouse.Buffer.DC);
1355781 SelectObject(Loc, T.Bitmap);
1355781 ZeroMemory(@BI, SizeOf(BI));
1355781 BI.bmiHeader.biWidth := T.Width;
1355781 BI.bmiHeader.biHeight := T.Height;
1355781 BI.bmiHeader.biSize := SizeOf(BitMapInfoHeader);
1355781 BI.bmiHeader.biCompression := BI_RGB; 
1355781 BI.bmiHeader.biBitCount := 32;
1355781 BI.bmiHeader.biPlanes := 1;
1355796 SetLength(A, T.Height * T.Width * 4);
1355812 GetDIBits(Loc, T.Bitmap, 0, T.Height, @A[0], @BI, DIB_RGB_COLORS);
1355859 For I := 0 to Length(A) - 1 Do
1355859 SetDIBits(Loc, T.Bitmap, 0, T.Height, @A[0], @BI, DIB_RGB_COLORS);
1355859 DeleteDC(Loc);
Причем до этого мерил на глаз - было явно около секунды на вю процедуру изменения яркости. Сейчас запустил в цикле из ста процедур - по секундомеру ровно 9 секунд.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 07.07.2010 в 07:35.
Alex Cones вне форума Ответить с цитированием
Старый 07.07.2010, 08:47   #10
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Ты померяй несколько раз , кроме тебя за компом еще и винда работает.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация If + Or Alex Cones Общие вопросы Delphi 6 09.06.2010 01:42
Оптимизация Viper1287 Операционные системы общие вопросы 7 13.09.2009 15:33
Оптимизация Flangini Microsoft Office Excel 5 11.06.2009 11:48
Оптимизация Terran Общие вопросы Delphi 3 03.05.2008 19:03
Оптимизация программ Jeni Свободное общение 17 14.06.2007 18:45