Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите оптимизировать не большой код [D6, XP]


Страницы:   1 2 3

novai ©   (2011-01-26 07:08:00) 

Можно ли оптимизировать данный код:
...
 P: pRGBLine;
..
   for yy:= 0 to Height - 1 do
   begin
     p:= Scanline[yy];

     for xx := 0 to Width - 1 do
     begin
       p^[xx].rgbtRed:= p^[xx].rgbtRed - muldiv(p^[xx].rgbtRed,fade,100);
       p^[xx].rgbtGreen:= p^[xx].rgbtGreen - muldiv(p^[xx].rgbtGreen,fade,100);
       p^[xx].rgbtBlue:= p^[xx].rgbtBlue - muldiv(p^[xx].rgbtBlue,fade,100);
     end;
   end;


чтобы не за 3 такта а за один?
как то так:
p^[xx]:= p^[xx] - (p^[xx] * fade div 100);


novai   (2011-01-26 09:37:00) [21]


> разве он не организует "сжатие" в png, которое не получается
> нужно, а потом "разжатие" для отрисовки,

я не могу объяснить такие тонкости, видимо нет...


RWolf   (2011-01-26 09:30:00) [22]

и да, MMX тут хорошо подходит, имхо.


sniknik   (2011-01-26 09:30:00) [23]

> работаем с TPngObject.
тогда я чего то не понимаю... вывод идет битмапом, обработка идет на битмапе, а работаем почему то с TPngObject. ???
разве он не организует "сжатие" в png, которое не получается нужно, а потом "разжатие" для отрисовки, что точно чего то да занимает по времени.


RWolf   (2011-01-26 09:29:00) [24]

p^[xx].rgbtХХХ неплохо бы заменить на указатель — вычисление этой конструкции занимает лишние такты.


novai   (2011-01-26 09:20:00) [25]


> откуда в сканлайнах 16-битного растра возьмутся p^[xx].rgbtRed
> и т.д.????

я сказал:

> работаем с TPngObject.


MBo   (2011-01-26 09:18:00) [26]

>растр: pf16bit
откуда в сканлайнах 16-битного растра возьмутся p^[xx].rgbtRed и т.д.????


novai   (2011-01-26 09:14:00) [27]

посмотрел

> Graphics32


сделал так:
 if fading then
 begin
   fade:= fade - 2;

   if fade <= 0 then
   begin
     fading:= false;
     fade:= 0;
   end;

   for yy:= 0 to Height - 1 do
   begin
     p:= Scanline[yy];

     for xx := 0 to Width - 1 do
     begin
       r:= p^[xx].rgbtRed;
       g:= p^[xx].rgbtGreen;
       b:= p^[xx].rgbtBlue;

       Dec(r, fade);
       Dec(g, fade);
       Dec(b, fade);

       if r > 255 then r := 255 else if r < 0 then r := 0;
       if g > 255 then g := 255 else if g < 0 then g := 0;
       if b > 255 then b := 255 else if b < 0 then b := 0;

       p^[xx].rgbtRed:= r;
       p^[xx].rgbtGreen:= g;
       p^[xx].rgbtBlue:= b;

     end;
   end;

 end;

при работе if fading then - 60 фпс - нормально, всем спасибо!


novai   (2011-01-26 08:36:00) [28]


> наблюдаю не большое затемнение и окончание работы   if fading
> then

наблюдаю не большое затемнение, потом нормализацию и окончание работы   if fading


novai   (2011-01-26 08:35:00) [29]


> Поскольку fade - одно и тоже, то множитель и величину сдвига
> достаточно подобрать до цикла. Проверить, поможет ли это
> - нетрудно, достаточно
> p^[xx].rgbtRed - muldiv(p^[xx].rgbtRed,fade,100) временно
> поменять на
> (p^[xx].rgbtRed * 100) shr 7,и так в каждой строке

наблюдаю не большое затемнение и окончание работы   if fading then


novai   (2011-01-26 08:30:00) [30]


> Если тормоза действительно в этом коде, то

да(

> если растр 32-битный, а не 24-битный

растр: pf16bit (


MBo   (2011-01-26 08:27:00) [31]

Если тормоза действительно в этом коде, то
1) попробовать заменить muldiv на умножение со сдвигом вправо
Поскольку fade - одно и тоже, то множитель и величину сдвига достаточно подобрать до цикла. Проверить, поможет ли это - нетрудно, достаточно
p^[xx].rgbtRed - muldiv(p^[xx].rgbtRed,fade,100) временно поменять на
(p^[xx].rgbtRed * 100) shr 7,и так в каждой строке

2)использовать MMX. Неплохо пойдет, если растр 32-битный, а не 24-битный

3)использовать графические библиотеки, где нужные операции уже есть, типа Graphics32 и т.д.


novai   (2011-01-26 08:24:00) [32]


> if fading:= true;

читать без IF...


novai   (2011-01-26 08:23:00) [33]

fade: byte;

перед стартом:
выставляется в
fade:= 100;
if fading:= true;

далее

procedure TScene.OnDrawTimer(Sender: TObject);
 ...
 формируем изображение сцены (при  DrawTimer.Interval:= 10 - железные 64 фпс)
 ...

 if fading then
 begin
   fade:= fade - 2;

   if fade <= 0 then
   begin
     fading:= false;
     fade:= 0;
   end;

   for yy:= 0 to Height - 1 do
   begin
     p:= Scanline[yy];

     for xx := 0 to Width - 1 do
     begin
       p^[xx].rgbtRed:= p^[xx].rgbtRed - muldiv(p^[xx].rgbtRed,fade,100);
       p^[xx].rgbtGreen:= p^[xx].rgbtGreen - muldiv(p^[xx].rgbtGreen,fade,100);
       p^[xx].rgbtBlue:= p^[xx].rgbtBlue - muldiv(p^[xx].rgbtBlue,fade,100);
     end;
   end;

 end;

 // отрисуем сцену на DrawCanvas (Form.canvas)
 BitBlt(
   DrawCanvas.Handle,
   0, 0,
   Width, Height + PanelHeight,
   Canvas.Handle,
   0, 0,
   SRCCOPY);

 Drawing:= false;    
end;


Ega23   (2011-01-26 08:14:00) [34]

fade - что такое? Чему равно?


novai   (2011-01-26 07:58:00) [35]

что и понятно... или нет?)


novai   (2011-01-26 07:57:00) [36]


> Поставь 100 для начала.

фпс упал до 9-10(


novai   (2011-01-26 07:55:00) [37]

я сам его создаю, работаю с ним и уничтожаю его


Ega23   (2011-01-26 07:55:00) [38]


> DrawTimer.Interval:= 10;

Почему 10? Ты думаешь, что уложишься? Поставь 100 для начала.


Ega23   (2011-01-26 07:54:00) [39]


> DrawTimer:= TTimer.Create(nil);

Почему от nil?


novai   (2011-01-26 07:42:00) [40]

а при включении кода из первого поста только 14-15 фпс(


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо