![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите оптимизировать не большой код [D6, XP]
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 фпс(