Re[3]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.02.02 14:33
Оценка:
Здравствуйте Аноним, Вы писали:

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

Что ж, похоже ты прав
AVK Blog
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.