Отрисовка в C# тормозит ПО СТРАШНОМУ
От: Igor Trofimov  
Дата: 13.02.02 12:14
Оценка:
Все эти тесты, которые тут публиковались — это конечно хорошо.... Жаль, что они охватывают не все аспекты программирования...

Может, я конечно, делаю что-то очень-очень неправильно, но следующий код отрисовывает форму размером 1024x768 ОКОЛО СЕКУНДЫ!!!!!!!

private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
using ( Pen p1 = new Pen(Color.Black),
p2 = new Pen(Color.White) )
{
for (int x = 0; x < Width; x++)
if ( (x & 1) > 0)
e.Graphics.DrawLine(p1, x, 0, x, Height-1);
else
e.Graphics.DrawLine(p2, x, 0, x, Height-1);
}
}

22.12.03 15:53: Перенесено модератором из '.NET' — AVK
Re: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.02.02 13:26
Оценка:
Здравствуйте Igor Trofimov, Вы писали:

IT>private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)

IT> {
IT> using ( Pen p1 = new Pen(Color.Black),
IT> p2 = new Pen(Color.White) )
IT> {
IT> for (int x = 0; x < Width; x++)
IT> if ( (x & 1) > 0)
IT> e.Graphics.DrawLine(p1, x, 0, x, Height-1);
IT> else
IT> e.Graphics.DrawLine(p2, x, 0, x, Height-1);
IT> }
IT> }

А подумать?

Вобще то такие вещи делаются копированием предварительно подготовленных битмапов
AVK Blog
Re[2]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: Аноним  
Дата: 13.02.02 13:33
Оценка:
AVK>А подумать?
AVK>Вобще то такие вещи делаются копированием предварительно подготовленных битмапов

Да,да,да. Конечно. Но речь не о том, как делать какую-то конкретную вещь. Речь об общей тормознутости.Можно придумать пример, когда заготовленным битмапом не отделаешься — тогда что?
Приведенный код был специально написан, когда возникла мысль, что рисование тормозит — для окончательной проверки. Удостоверился. Хотя не ожидал, что все ТАК плохо.
Re: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: Zilog Россия  
Дата: 13.02.02 14:08
Оценка:
Здравствуйте Igor Trofimov, Вы писали:

IT>Все эти тесты, которые тут публиковались — это конечно хорошо.... Жаль, что они охватывают не все аспекты программирования...


IT>Может, я конечно, делаю что-то очень-очень неправильно, но следующий код отрисовывает форму размером 1024x768 ОКОЛО СЕКУНДЫ!!!!!!!


IT>private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)

IT> {
IT> using ( Pen p1 = new Pen(Color.Black),
IT> p2 = new Pen(Color.White) )
IT> {
IT> for (int x = 0; x < Width; x++)
IT> if ( (x & 1) > 0)
IT> e.Graphics.DrawLine(p1, x, 0, x, Height-1);
IT> else
IT> e.Graphics.DrawLine(p2, x, 0, x, Height-1);
IT> }
IT> }

Хех, а ты лучше линии пачкой выводи...
Используй e.Graphics.DrawLines с массивом линий.
Don't work hard, work smart.
Re[2]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: Аноним  
Дата: 13.02.02 14:21
Оценка:
Z>Хех, а ты лучше линии пачкой выводи...
Z>Используй e.Graphics.DrawLines с массивом линий.

Ох-ох-ох... Еще раз... мне НЕ НУЖНА полосатая форма. Меня волнует, что рисование тормозит В ПРИНЦИПЕ.
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
Re[4]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: Igor Trofimov  
Дата: 13.02.02 14:48
Оценка:
AVK>Код номер раз
AVK>Консоль:
AVK>340

AVK>Код номер два

AVK>Консоль:
AVK>10

AVK>Что ж, похоже ты прав


То-то и оно... Я тоже на Дельфе проверял...Невооруженным глазом видно.. Ну вот...замерили...
Как-то это все прокомментируют знающие люди? Оптимизатор у C# прекрасный, код генерится отличный, методы вызываются быстро, числа складываются хорошо, вот только в результате — тормознее дельфевого кода в 34 раза

Знать бы, в чем протормоз — в обилии managed кода внутри WinForms.Drawings? Или в чем-то еще? Вообще непонятно, чему там ТАК тормозить... Может, тормоза при обслуживании вызовов не-.net библиотек (gdi)? Это, кстати, не тестировали...

Можно попробовать потестировать — слабать 2 dll-ки — одну — обычную, другую — .net и повызывать функцию/метод класса из одной и из другой много раз. Замерить...
Re[5]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.02.02 16:15
Оценка:
Здравствуйте Igor Trofimov, Вы писали:

IT>Знать бы, в чем протормоз — в обилии managed кода внутри WinForms.Drawings?

Сомнительно
Или в чем-то еще? Вообще непонятно, чему там ТАК тормозить...
Что прикалывает — свинги томозят потомучто там вся отрисовка на жабе. А тут все контролы нативные. И один хрен тормозит.
Может, тормоза при обслуживании вызовов не-.net библиотек (gdi)?
Не, это вряд ли. Тем паче что дотнет использует GDI+ который по идее на новых железках должен быть даже быстрее (на той машине на которой я тесты запускал GeForce2).

IT>Можно попробовать потестировать — слабать 2 dll-ки — одну — обычную, другую — .net и повызывать функцию/метод класса из одной и из другой много раз. Замерить...

Я думаю результат будет тот же. Тут профайлером бы прогнать
AVK Blog
Re[6]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: Igor Trofimov  
Дата: 13.02.02 16:35
Оценка:
Я заглянул ildasm'ом в Windows.Drawings... там кода — с гулькин нос — проверка pen на null, еще чего-то..и вызов метода класса Windows.Drawings.SafeNativeDrawings.DrawLine или что-то в этом роде... Ну а в этом объекте — как я понял — просто прописано, что этот метод DllImport....

IT>>Знать бы, в чем протормоз — в обилии managed кода внутри WinForms.Drawings?

AVK>Сомнительно

Да, не в этом дело.

AVK>Что прикалывает — свинги томозят потомучто там вся отрисовка на жабе. А тут все контролы нативные. И один хрен тормозит.


Ага...

AVK> Может, тормоза при обслуживании вызовов не-.net библиотек (gdi)?

AVK>Не, это вряд ли.

Почему? GDI+ тут не причем, если большие накладные расходы именно на ВЫЗОВ не-safe (с точки зрения .NET) функций.Мы же, опять-таки, не знаем, что кроется за DllImport...

AVK>Я думаю результат будет тот же. Тут профайлером бы прогнать

Померить участки кода? А какие? Сомнитеьно, чтобы много времени уходило на мой(или твой) C#-код. Ясно, что проблема — в вызове DrawLine. И чего ты померяешь?
Re[7]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: Yurik США  
Дата: 13.02.02 18:37
Оценка:
Здравствуйте Igor Trofimov, Вы писали:

IT>Почему? GDI+ тут не причем, если большие накладные расходы именно на ВЫЗОВ не-safe (с точки зрения .NET) функций.Мы же, опять-таки, не знаем, что кроется за DllImport...

Все таки gdi+ виноват, imho. Где-то уже пробегала инфа, что тормозной он на редкость. Может не отладили еще ребята из Микрософта, не дооптимизировали. Надеюсь, в следующих версиях это поправят.
Re[8]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: Igor Trofimov  
Дата: 13.02.02 18:47
Оценка:
ЗY>Все таки gdi+ виноват, imho. Где-то уже пробегала инфа, что тормозной он на редкость. Может не отладили еще ребята из Микрософта, не дооптимизировали. Надеюсь, в следующих версиях это поправят.

Мммммм.. Ну будем надеяться... Как-бы это все-таки понадежнее проверить? Ага! Надо налабать программку на чем-то обычном — VC/Delphi с использованием GDI+, которая делает все то же. Будет ясно.
Re[6]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: Igor Trofimov  
Дата: 13.02.02 18:50
Оценка:
AVK>Что прикалывает — свинги томозят потомучто там вся отрисовка на жабе. А тут все контролы нативные. И один хрен тормозит.

Кстати, не все — нативные. Пресловутый GroupBox имеет метод OnPaint. Кстати говоря — Button или ListBox, растянутые и с Anchor=Left|Right ведут себя превосходно... У них, между прочим — OnPaint'а нету!!
Re: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: Igor Trofimov  
Дата: 14.02.02 10:07
Оценка:
Кстати... Для сравнения скорости работы очень полезно скачать с www.devexpress.com демо-программки к ихним библиотекам.

Можете скачать для сравнения демки к нативным (ActiveX, VCL) библиотекам и к .NET библиотекам.

Эти парни — не дураки и уж если у них так тормозит, значит, точно что-то не так... в .net ((
Re[8]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: retalik www.airbandits.com/
Дата: 14.02.02 11:31
Оценка:
Здравствуйте Yurik, Вы писали:

Y>Здравствуйте Igor Trofimov, Вы писали:


IT>>Почему? GDI+ тут не причем, если большие накладные расходы именно на ВЫЗОВ не-safe (с точки зрения .NET) функций.Мы же, опять-таки, не знаем, что кроется за DllImport...


Да, дело именно в GDI+ — так как он является родной графической средой для .NET. Расходы на маршалинг вызовов тоже есть, но они сравнительно малы (в этом просто убедиться — вместо рисования выполнять другие операции Win32).
В той же .NET есть методы типа ControlPaint.DrawReversibleFrame. Так как GDI+ не поддерживает инверсию вывода (типа XOR), они реализованы через GDI. Эти методы выполняются со свистом, несмотря на маршалинг.

Y>Все таки gdi+ виноват, imho. Где-то уже пробегала инфа, что тормозной он на редкость. Может не отладили еще ребята из Микрософта, не дооптимизировали. Надеюсь, в следующих версиях это поправят.


По черновым замерам, отрисовка примитивов в десятки раз медленнее. С битмапами немного лучше, но все равно, тормоза те еще.

Связано это с тем, что GDI+ 1.0 вообще не акселерирован — а это, в сочетании с float-координатной системой и 32-битным расчетом цвета, сильно сказывается. Правда, сейчас, по слухам, работы ведутся.

Если успею, про это в новой статье будет сказано.
Успехов,
Виталий.
Re[9]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: Igor Trofimov  
Дата: 14.02.02 12:14
Оценка:
R>Связано это с тем, что GDI+ 1.0 вообще не акселерирован — а это, в сочетании с float-координатной системой и 32-битным расчетом цвета, сильно сказывается. Правда, сейчас, по слухам, работы ведутся.

float??????!!!!!!!!!!!!???????? А нафига???? Нет, правда — нафига???
Re[10]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: retalik www.airbandits.com/
Дата: 14.02.02 13:08
Оценка:
Здравствуйте Igor Trofimov, Вы писали:

R>>Связано это с тем, что GDI+ 1.0 вообще не акселерирован — а это, в сочетании с float-координатной системой и 32-битным расчетом цвета, сильно сказывается. Правда, сейчас, по слухам, работы ведутся.


IT>float??????!!!!!!!!!!!!???????? А нафига???? Нет, правда — нафига???


Про 16-бит лимит координат в 9x слышал? В GDI+ этого ограничения нет (правда, есть другое — где-то на сотнях тысяч обламывается). Плюс возможности координатных преобразований с неплохой (для десктопных приложений) точностью — поворот, зум, перенос.

Да не в float-е дело... Вон, в OpenGL он никого не пугает. Сопроцессор работает параллельно, так что не очень уж это и страшно. Просто все точки рассчитываются программно (похоже, даже без MMX) — а это такая опа...
Есть слухи, что с DirectX 9 прийдет и DDI для GDI+.
Успехов,
Виталий.
Re[9]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.02.02 16:35
Оценка:
Здравствуйте retalik, Вы писали:

R>Связано это с тем, что GDI+ 1.0 вообще не акселерирован — а это, в сочетании с float-координатной системой и 32-битным расчетом цвета, сильно сказывается.

К чему тогда заявления производителей видеокарт о полной аппаратной поддержке GDI+?
AVK Blog
Re[6]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.02.02 22:22
Оценка:
Здравствуйте AndrewVK, Вы писали:

Как я понимаю... ответ в этом вопросе...

AVK> Может, тормоза при обслуживании вызовов не-.net библиотек (gdi)?

AVK>Не, это вряд ли. Тем паче что дотнет использует GDI+ который по идее на новых железках должен быть даже быстрее (на той машине на которой я тесты запускал GeForce2).


Кто тебе такие сказки про GDI+ расказал? Ты создай пример лна GDI+ и MFC-е. Вот тогда сравнение будет корректное.

Еще одна проблемма — вызов нэйтив-кода. Она еще проценов 30 может отнимать.

PS

Еще интересно было бы слабать пример на обычном GDI, но под нет. Тут все тормоза вылились бы в переход managed-unmanaged.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.02.02 22:26
Оценка:
Здравствуйте AndrewVK, Вы писали:

AVK>Здравствуйте retalik, Вы писали:


R>>Связано это с тем, что GDI+ 1.0 вообще не акселерирован — а это, в сочетании с float-координатной системой и 32-битным расчетом цвета, сильно сказывается.

AVK>К чему тогда заявления производителей видеокарт о полной аппаратной поддержке GDI+?

К бабка от продаж.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.02.02 22:27
Оценка:
Здравствуйте Igor Trofimov, Вы писали:

AVK>>Что прикалывает — свинги томозят потомучто там вся отрисовка на жабе. А тут все контролы нативные. И один хрен тормозит.


IT>Кстати, не все — нативные. Пресловутый GroupBox имеет метод OnPaint. Кстати говоря — Button или ListBox, растянутые и с Anchor=Left|Right ведут себя превосходно... У них, между прочим — OnPaint'а нету!!


А ты на них спай натрави.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.