Здравствуйте Аноним, Вы писали:
AVK>>А подумать?
AVK>>Вобще то такие вещи делаются копированием предварительно подготовленных битмапов
А>Да,да,да. Конечно. Но речь не о том, как делать какую-то конкретную вещь. Речь об общей тормознутости.Можно придумать пример, когда заготовленным битмапом не отделаешься — тогда что?
А>Приведенный код был специально написан, когда возникла мысль, что рисование тормозит — для окончательной проверки. Удостоверился. Хотя не ожидал, что все ТАК плохо.
Код номер раз
using System.Windows.Forms;
using System.Drawing;
public class Test : Form {
Panel pnl = new Panel();
public Test() {
Size = new Size(1024,768);
pnl.Dock = DockStyle.Fill;
pnl.Paint += new PaintEventHandler(PanelPaint);
Controls.Add(pnl);
}
private void PanelPaint(object sender, PaintEventArgs e) {
int st = System.Environment.TickCount;
Pen p1 = new Pen(Color.Black);
Pen p2 = new Pen(Color.White);
for(int i = 0; i < 1024; i++) {
if((i&1) == 0)
e.Graphics.DrawLine(p1,i,0,i,768);
else
e.Graphics.DrawLine(p2,i,0,i,768);
}
System.Console.WriteLine((System.Environment.TickCount - st));
}
static void Main() {
Test test = new Test();
Application.Run(test);
}
}
Консоль:
340
Код номер два
uses
Forms,Graphics,Windows;
type
Test = class(TForm)
procedure Paint; override;
end;
procedure Test.Paint;
var
i : integer;
p1,p2 : TPen;
st : integer;
begin
st := GetTickCount;
p1 := TPen.Create();
p2 := TPen.Create();
p1.Color := clWhite;
p2.Color := clBlack;
for i := 1 to 1024 do begin
if((i and 1) = 0) then
Canvas.Pen := p1
else
Canvas.Pen := p2;
Canvas.MoveTo(i,0);
Canvas.LineTo(i,768);
end;
WriteLn(GetTickCount - st);
end;
var
form : Test;
{$R test.DFM}
begin
Application.CreateForm(Test,form);
form.Width := 1024; form.Height := 768;
Application.Run;
end.
Консоль:
10
Что ж, похоже ты прав