Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Ускорить работу с графикой не переписвая программу


Автор: Cheburek 1.5.2006, 19:16
рисую я на TImage, с помощью TCanvas... по пикселям
Код

pic.Canvas.Pixels[round(x),round(WinY/2+R*sin(fi))] := THColor;

но когда начинаю двигать объект - картинка начинает попросту лагать.. вот пример функции которая рисует линзу, и заодно ее описывает физически
Код

procedure OptOs.OFRLinze(h,R,xl,Nsr:real;pic:TImage;k,THColor:integer);
var fi,FiM,xs,x:real;
        y:integer;
begin
    FiM := arcsin((h/(2*R)));
  xs := xl - R*cos(FiM);
    fi:=-FiM;
    WHILE fi <= FiM DO begin
    x := xs + R*cos(FiM);
    WHILE  x <= (xs + R) DO begin
     IF x < round(xs+R*cos(fi)) THEN begin
            pic.Canvas.Pixels[round(x),round(WinY/2+R*sin(fi))] := THColor;
        KoafPr[round(x),round(WinY/2+R*sin(fi))] := Nsr;
        YgNorm[round(x),round(WinY/2+R*sin(fi))] := k*fi;
        IF  (R*sin(fi-(1/R)) < 0) and (0<R*sin(fi+(1/R))) THEN begin
         YgNorm[round(x),round(WinY/2+R*sin(fi))] := 0;
        end;
      end;
      x:=x+1;
    end;
    fi:=fi+(1/R);
    end;
  FOR y := round(WinY/2 - (h/2)) TO  round(WinY + (h/2)) DO begin
    YgNorm[round(xl),y] := 0;
  end;
end;


с объектами которые попроще все нормально, но чем сложнее объект тем больше лагает((( 
Вроде почитал у вас использовать Bitmap быстрее.... А вот как вопрос не переписывая программу полностью, можно ускорить работу с графикой??? 
Как вот конкретно можно  строчку pic.Canvas.Pixels[round(x),round(WinY/2+R*sin(fi))] := THColor; можно заменить ипользуя bitmap??? 

Автор: Kesh 1.5.2006, 21:14
Cheburek, используй функцию scanline... 

Автор: Cheburek 1.5.2006, 21:54
Kesh, 
вот этим щас и занимался... хоть и меньше но всеравно лагает
Код

procedure OptOs.OFRLinze(h,R,xl,Nsr:real;pic:TImage;k,THColor:integer);
var fi,FiM,xs,x:real;
        y:integer;
    p: PARGB;
begin
    FiM := arcsin((h/(2*R)));
  xs := xl - R*cos(FiM);
    fi:=-FiM;
     IF bmp = nil THEN begin
       bmp := TBitmap.Create;
        bmp.pixelformat := pf24bit;
        bmp.width :=round(R - R*cos(FiM));
        bmp.height := pic.Height;
      end;
    WHILE fi <= FiM DO begin
    x := xs + R*cos(FiM);
    WHILE  x <= (xs + R) DO begin
     IF x < round(xs+R*cos(fi)) THEN begin
    {pic.Canvas.Pixels[round(x),round(WinY/2+R*sin(fi))] := THColor;}
        p := bmp.scanline[round(WinY/2+R*sin(fi))];
        p[round(x-(xs + R*cos(FiM)))].r := 150;
        p[round(x-(xs + R*cos(FiM)))].b := 200;
        p[round(x-(xs + R*cos(FiM)))].g := 10;
        KoafPr[round(x),round(WinY/2+R*sin(fi))] := Nsr;
        YgNorm[round(x),round(WinY/2+R*sin(fi))] := k*fi;
        IF  (R*sin(fi-(1/R)) < 0) and (0<R*sin(fi+(1/R))) THEN begin
         YgNorm[round(x),round(WinY/2+R*sin(fi))] := 0;
        end;
      end;
      x:=x+1;
    end;
    fi:=fi+(1/R);
    end;
  FOR y := round(WinY/2 - (h/2)) TO  round(WinY + (h/2)) DO begin
    YgNorm[round(xl),y] := 0;
  end;
  pic.Canvas.Draw(round(xl),0,bmp);
end;


кстати как перевести TColor -> RGB?  Что вообще в этом коде занимает больше всего времени? 

Автор: darkart 1.5.2006, 23:01
Цитата(Cheburek @  1.5.2006,  22:54 Найти цитируемый пост)
кстати как перевести TColor -> RGB? 

GetRValue, GetGValue, GetBValue
По мерцанию - рисуй на вспомогательном Canvase, затем копируй 

Автор: Cheburek 2.5.2006, 01:38
Цитата(darkart @  1.5.2006,  23:01 Найти цитируемый пост)
По мерцанию - рисуй на вспомогательном Canvase, затем копируй 

не понял совсем)) как это?
 

Автор: Alexeis 2.5.2006, 08:59
Цитата(darkart @  1.5.2006,  22:01 Найти цитируемый пост)
По мерцанию - рисуй на вспомогательном Canvase, затем копируй 

Cheburek, я думаю что речь идет о рисовании на вспомогательном Битмапе, потому что Canvas служит для отображения, а битмап для хранения изображения. 

Автор: darkart 2.5.2006, 09:47
Ссори, конечно на битмапеsmile 

Автор: Cheburek 3.5.2006, 00:27
darkart,  я вот что-то всеравно не понимаю..
что значит по мерцанию? И чем такой вариант хуже, и вообще чем он отличаеться от вашего?
Код

        p := bmp.scanline[round(WinY/2+R*sin(fi))];    
        p[round(x-(xs + R*cos(FiM)))].r := 150;    
        p[round(x-(xs + R*cos(FiM)))].b := 200;    
        p[round(x-(xs + R*cos(FiM)))].g := 10;
 
а потом так..
Код

        pic.Canvas.Draw(round(xl),0,bmp);
 

Автор: Alexeis 3.5.2006, 09:20
Cheburek, конечно же ни чем!
Очень медленно выполняются синус и косинус.
желательно выполнить:
Код

var
 t : integer;
...........
t := round(x-(xs + R*cos(FiM)));
p := bmp.scanline[round(WinY/2+R*sin(fi))];     
p[t].r := 150;     
p[t].b := 200;     
p[t].g := 10;


Для ускорения работы я как правило еще сохраняю адреса всех строк полученных при помощи scnline в отдельный масив, и использую этот массив вместо постоянного вызова донной функции. 
 

Автор: vovos 3.5.2006, 10:17
Еще вместо ScanLine можеш попробовать API функцию: SetBitmapBits - она перекидывает содержимое масива байт в битмап 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)