Отрисовка в 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'а нету!!


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

Z>>Хех, а ты лучше линии пачкой выводи...

Z>>Используй e.Graphics.DrawLines с массивом линий.

А>Ох-ох-ох... Еще раз... мне НЕ НУЖНА полосатая форма. Меня волнует, что рисование тормозит В ПРИНЦИПЕ.


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

IT>Кстати... Для сравнения скорости работы очень полезно скачать с www.devexpress.com демо-программки к ихним библиотекам.


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


IT>Эти парни — не дураки и уж если у них так тормозит, значит, точно что-то не так... в .net ((


Я бы качал чё нибудь от Инфрогистик (бывший Шаридан). Они на .Net серьезные бабки делать хотят.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: retalik www.airbandits.com/
Дата: 15.02.02 05:27
Оценка:
Здравствуйте AndrewVK, Вы писали:

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


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

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

А какие проблемы? Аппаратный alpha-blending есть, вывод текстур в 32 битах есть, scaling/stretching есть — чем не полная поддержка GDI+?
Другое дело, GDI+ их пока не поддерживает (DDI нету).

Если кто хочет почитать, как это задумывалось (тогда еще она GDI2k называлась), то есть перевод статьи с MSDN на Reactor Critical: http://www.reactor.ru/white-ms-gdi2000/white-ms-gdi2000.shtml

Может, когда-нибудь до этого и доживем...
Успехов,
Виталий.
Re[3]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: Yurik США  
Дата: 15.02.02 15:16
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Я бы качал чё нибудь от Инфрогистик (бывший Шаридан). Они на .Net серьезные бабки делать хотят.

Ссылочку можно?
Re[8]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: Simontsev Andrew Россия  
Дата: 15.02.02 19:59
Оценка:
Здравствуйте Yurik, Вы писали:

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


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

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


GDI+ медленный не из-за того, что "ребята из Микрософта" недоотладили, а из-за того, что он рисует все по-другому — антиалиасинг, нецелочисленные координаты и проч... В микрософтовской ньюсгруппе по GDI периодически встает вопрос, почему GDI+ медленней простого GDI, и постоянно возникает ответ — они не сравнимы.
Sincerely yours,
Andrew Simontsev.
Re[9]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: Yurik США  
Дата: 15.02.02 21:29
Оценка:
Здравствуйте Simontsev Andrew, Вы писали:

SA>GDI+ медленный не из-за того, что "ребята из Микрософта" недоотладили, а из-за того, что он рисует все по-другому — антиалиасинг, нецелочисленные координаты и проч... В микрософтовской ньюсгруппе по GDI периодически встает вопрос, почему GDI+ медленней простого GDI, и постоянно возникает ответ — они не сравнимы.


Ну, "не сравнимы" — это очень сильно сказано. Если две системы предназначены для решения одних и тех же (или похожих, по крайней мере) задач, то сравнивать их можно и нужно. Другое дело — по каким параметрам. Итак, с параметром "скорость" все ясно. А другие мы здесь не обсуждаем.
Заявление о том, что GDI+ — абсолютно другая система, imho, нужно просто понимать так, что ускорения в следующих версиях ждать не стоит, по крайней мере глобального. В таком случае, очень жаль, что в .NET нет классовой обертки вокруг простого GDI. Типа VCL-ного TCanvas.
Re[10]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.02.02 22:43
Оценка:
Здравствуйте Yurik, Вы писали:

Y> В таком случае, очень жаль, что в .NET нет классовой обертки вокруг простого GDI. Типа VCL-ного TCanvas.


Ну, так сделай. Кто тебе мешает. У MS даже есть нэймспэйс с описанием всех апишниых функций. Так что отсается только запернуть...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.02.02 22:49
Оценка:
Здравствуйте Yurik, Вы писали:

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


VD>>Я бы качал чё нибудь от Инфрогистик (бывший Шаридан). Они на .Net серьезные бабки делать хотят.

Y>Ссылочку можно?

Пожайлуста.

http://infragistics.com/sections/dotnet.asp
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: Igor Trofimov  
Дата: 16.02.02 07:58
Оценка:
Y>> В таком случае, очень жаль, что в .NET нет классовой обертки вокруг простого GDI. Типа VCL-ного TCanvas.
VD>Ну, так сделай. Кто тебе мешает. У MS даже есть нэймспэйс с описанием всех апишниых функций.
Так что отсается только запернуть...

Угу... Вот только в стандартной-то библиотеке — хрен чего поменяешь
Это тогда по хорошему и стандартную библиотеку контролов надо здорово переработать — чтобы под этой оберткой пахала...
Re[10]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: Андрей Симонцев Россия  
Дата: 16.02.02 15:02
Оценка:
Здравствуйте Yurik, Вы писали:

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


SA>>GDI+ медленный не из-за того, что "ребята из Микрософта" недоотладили, а из-за того, что он рисует все по-другому — антиалиасинг, нецелочисленные координаты и проч... В микрософтовской ньюсгруппе по GDI периодически встает вопрос, почему GDI+ медленней простого GDI, и постоянно возникает ответ — они не сравнимы.


Y>Ну, "не сравнимы" — это очень сильно сказано. Если две системы предназначены для решения одних и тех же (или похожих, по крайней мере) задач, то сравнивать их можно и нужно. Другое дело — по каким параметрам. Итак, с параметром "скорость" все ясно. А другие мы здесь не обсуждаем.


GDI+ предназначен для более широкого круга задач. В частности в старом GDI не было антиалиасинга, полупрозрачностей, геометрических преобразований...

Y>Заявление о том, что GDI+ — абсолютно другая система, imho, нужно просто понимать так, что ускорения в следующих версиях ждать не стоит, по крайней мере глобального. В таком случае, очень жаль, что в .NET нет классовой обертки вокруг простого GDI. Типа VCL-ного TCanvas.


Ну для тех кому важна только скорость действительно стоило бы сделать... Правда можно и самому написать при большом желании... GDI+ и GDI в принципе совместимы (т.е. у гдиплюсных объектов можно запрашивать гдишный хэндл)...
Sincerely yours,
Andrew Simontsev.
Re[12]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.02.02 00:03
Оценка:
Здравствуйте Igor Trofimov, Вы писали:

Y>>> В таком случае, очень жаль, что в .NET нет классовой обертки вокруг простого GDI. Типа VCL-ного TCanvas.

VD>>Ну, так сделай. Кто тебе мешает. У MS даже есть нэймспэйс с описанием всех апишниых функций.
IT>Так что отсается только запернуть...

IT>Угу... Вот только в стандартной-то библиотеке — хрен чего поменяешь

IT>Это тогда по хорошему и стандартную библиотеку контролов надо здорово переработать — чтобы под этой оберткой пахала...

Так, а стандартная, она на обычных вин-контролах базируется. Так что перехватывай назные виндузные сообщения и делай, что хочешь. Мне вот когда пример к одной статье писал нужно было сделать выделение в текстбоксе... ну, и чё? Послал пару Edit-овых месаг окошку и все в порядке.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: Андрей Россия  
Дата: 19.02.02 04:51
Оценка:
Здравствуйте VladD2, Вы писали:


VD>У MS даже есть нэймспэйс с описанием всех апишниых функций. Так что отсается только запернуть...


А имечко этого namespace не опубликуешь? Я что-то не нашел, видимо, плохо искал.

PS Microsoft.Win32 не предлагать.
Re[4]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: Kurchenko Oleg E. Россия  
Дата: 26.07.02 10:49
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Ну, так импортируй старое доброе GDI и тормозов будет куда меньше...

Когда-то давно вставал похожий вопрос: а почему GDI такой тормозной?
И вообще то он еще не снят.
Может имело бы смысл его аппартно ускорять?
Crescite, nos qui vivimus, multiplicamini
Re[4]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: Gagarkin  
Дата: 01.08.02 07:38
Оценка: -1
Здравствуйте AndrewVK, Вы писали:

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


AVK>procedure Test.Paint;


// Входим в процу
// Canvas залочен!

AVK>begin


// Чего-то там рисуем в Canvas, типа что-то в буфер

AVK>end;

// Вышли из процы.
// Далее работает тот, кто вызвал:
// Canvas разлочивается и отрисовывается один раз!


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


// Входим в процу
// Graphics залочен? — Сомневаюсь.
AVK> private void PanelPaint(object sender, PaintEventArgs e) {

// Чего-то там рисуем
// А кто сказал, что при каждом DrawLine окну не посылается WP_PAINT?

AVK> }


Я, конечно, могу очень сильно ошибаться.
Если так то простите за вмешательство.
Re[5]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: Аноним  
Дата: 04.08.02 20:53
Оценка:
Здравствуйте Gagarkin, Вы писали:

G>// Чего-то там рисуем

G>// А кто сказал, что при каждом DrawLine окну не посылается WP_PAINT?
Тогда бы все зациклилось, ибо эта процедура как раз и вызывается по WM_PAINT

G>Я, конечно, могу очень сильно ошибаться.

G>Если так то простите за вмешательство.
Чего то ты поздновато опомнился, последенее сообщение в треде было давным давно
Re[6]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: Gagarkin  
Дата: 05.08.02 09:17
Оценка:
Здравствуйте ...

G>>// Чего-то там рисуем

G>>// А кто сказал, что при каждом DrawLine окну не посылается WP_PAINT?
А>Тогда бы все зациклилось, ибо эта процедура как раз и вызывается по WM_PAINT
Ну, тормознулся я, ну с кем не бывает? (Утро, еще не выпито было достаточно кофе).

Я хотел сказать (написать) не WM_PAINT, я что-то в духе того, что рисование в Delphe идет в некоторый CompatibleDevice, а в Framework Forms в текущий DC напрямую.
Мне казалось, что когда рисование происходит в CompatibleDevice, то это намного быстрее.
Но... (как всегда это "НО" ) оно то конечно быстрее, но Borland как оказалось тоже рисует напрямую в DC (точнее в CompatibleBitmap).
И если написать подобным образом (извините за Paclas, и не кидайте камнем, даже те, кто и не грешен),
как в <Sample1[Paint]>, то получается подобный эффект, как в программке на До-диез (C#).

Далее идут два варианта <Sample2[WM_PAINT]> (кто хочет, можете поиграться:
надо все лишь комментировать "message WM_PAINT;", размер окна лучше не делать более 400*300).
В процедуре onWM_PAINT1 ривание идет в CompatibleDevice, а затем один раз выкидывается
(BitBlt), т.е. появляется сначала пустое окно, а затем через несколько секунд решетка.
Второй же вариант аналог того, как сделано у Borland в TWinControl.WMPaint(var Msg : TWMPaint).
В среднем первый вариант в два раза быстрее (но видимым это становится только при достаточно огромном рисовании, как например:
for j := 0 to 1000 do begin )!

Это я все просто оправдываюсь за чушь, которую спорол.
Что первое пришло в голову, то и написал — не проверив.

<ВЫВОД>:
Лично для меня загадка, почему GDI+ на столько медленее.
Поживем увидим.Хочется надеятся,
что они там просто где-то сделали ошибочку
(интересно, в MS перешли представители BUGland или Borland),
а может специально понавставляли туда sleep'ов (уж больно похож эффект в <Sample1[Paint]>).


[+]--------------------------8<-----------
// Sample1[Paint]
...
type
TForm1 = class(TForm)
private
public
procedure Paint; override;
end;
...
procedure TForm1.Paint;
var
i : integer;
begin
inherited;

for i := 0 to Self.Width do begin

if i and 1 > 0 then begin
Self.Canvas.Pen.Color := clWindow;
end else begin
Self.Canvas.Pen.Color := clWindowText;
end;
sleep(1);

Self.Canvas.MoveTo(i,0);
Self.Canvas.LineTo(i,Self.Height);
end;
end;
[-]--------------------------8<-----------

[+]--------------------------8<-----------
// Sample2[WM_PAINT]
unit WMPAINTUnit;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
private
{ Private declarations }
public
procedure onWM_PAINT1(var Msg : TWMPaint); message WM_PAINT;
procedure onWM_PAINT2(var Msg : TWMPaint); //message WM_PAINT;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.onWM_PAINT1(var Msg: TWMPaint);
var
ps : TPaintStruct;
dc : THandle;
i : integer;
j : integer;
pp : PPoint;
phOld : THandle;
ph1, ph2 : THandle;

hx : THandle;
hb : THandle;

st0 : TDateTime;
st1 : TDateTime;
begin
pp := nil;

st0 := Now;

hx := BeginPaint(Self.Handle, ps);
dc := CreateCompatibleDC(hx);
hb := CreateCompatibleBitmap(dc, Self.ClientWidth, Self.ClientHeight);
SelectObject(dc, hb);

ph1 := CreatePen(PS_SOLID, 1, clBlack);
ph2 := CreatePen(PS_SOLID, 1, clWhite);
phOld := SelectObject(dc, ph2);
for i := 0 to Self.ClientWidth do begin
if (i and 1)>0 then begin
SelectObject(dc, ph1);
end else begin
SelectObject(dc, ph2);
end;
for j := 0 to 1000 do begin
MoveToEx(dc, i, Self.ClientHeight, pp);
LineTo(dc, i,0);
end;
end;
SelectObject(dc, phOld);

BitBlt( hx, 0,0, Self.ClientWidth, Self.ClientHeight,
dc, 0,0,
SRCCOPY);

EndPaint(hx, ps);

DeleteObject(ph1);
DeleteObject(ph2);

DeleteObject(hb);
DeleteDC(dc);

st1 := Now;
Self.Caption := IntToStr(round((double(st1)-double(st0))*24*60*60*1000));
end;

procedure TForm1.onWM_PAINT2(var Msg: TWMPaint);
var
ps : TPaintStruct;
dc : THandle;
i : integer;
j : integer;
pp : PPoint;


phOld : THandle;
ph1, ph2 : THandle;

hb : THandle;
hbOld : THandle;

st0 : TDateTime;
st1 : TDateTime;
begin
pp := nil;

st0 := Now;

dc := BeginPaint(Self.Handle, ps);
hb := CreateCompatibleBitmap(dc, Self.ClientWidth, Self.ClientHeight);
hbOld := SelectObject(dc, hb);

ph1 := CreatePen(PS_SOLID, 1, clBlack);
ph2 := CreatePen(PS_SOLID, 1, clWhite);
phOld := SelectObject(dc, ph2);
for i := 0 to Self.ClientWidth do begin
if (i and 1)>0 then begin
SelectObject(dc, ph1);
end else begin
SelectObject(dc, ph2);
end;
for j := 0 to 1000 do begin
MoveToEx(dc, i, Self.ClientHeight, pp);
LineTo(dc, i,0);
end;
end;

BitBlt( dc, 0,0, Self.ClientWidth, Self.ClientHeight,
hb, 0,0,
SRCCOPY);

SelectObject(dc, phOld);
SelectObject(dc, hbOld);
EndPaint(dc, ps);

DeleteObject(ph1);
DeleteObject(ph2);

DeleteObject(hb);

st1 := Now;
Self.Caption := IntToStr(round((double(st1)-double(st0))*24*60*60*1000));
end;

end.
[-]--------------------------8<-----------
Re: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: iZEN СССР  
Дата: 06.08.02 05:55
Оценка: -1
Здравствуйте 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> }

package drawtest;
/**
 * Title:        Тест отрисовки в 2D
 * Description:  Простой тест на скорость заполнения линиями разного цвета формы 1024x768
 * Copyright:    Copyright (c) 06.08.2002
 * @author iZEN
 * @version 1.0
 */
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class DrawTestFrame extends JFrame {
 JPanel contentPane;
 BorderLayout borderLayout1 = new BorderLayout();

 /**Construct the frame*/
 public DrawTestFrame() {
  enableEvents(AWTEvent.WINDOW_EVENT_MASK);
  try {
   jbInit();
  }
  catch(Exception e) {
   e.printStackTrace();
  }
 }
 /**Component initialization*/
 private void jbInit() throws Exception  {
  //setIconImage(Toolkit.getDefaultToolkit().createImage(DrawTestFrame.class.getResource("[Your Icon]")));
  contentPane = (JPanel) this.getContentPane();
  contentPane.setLayout(borderLayout1);
  this.setSize(new Dimension(1024, 768));
  this.setTitle("DrawTest");
 }
 /**Overridden so we can exit when window is closed*/
 protected void processWindowEvent(WindowEvent e) {
  super.processWindowEvent(e);
  if (e.getID() == WindowEvent.WINDOW_CLOSING) {
   System.exit(0);
  }
 }
 public void paint(Graphics g) {
  super.paint(g);   
  long st = System.currentTimeMillis();
  //Pen p1 = new Pen(Color.Black);
  //Pen p2 = new Pen(Color.White);
  Color black = Color.black;
  Color white = Color.white;
  for(int i = 0; i < 1024; i++) {
   if((i&1) == 0)
    g.setColor(black);
   else
    g.setColor(white);   
   g.drawLine(i,0,i,768);
  }
  System.out.println("Время отрисовки: " + (System.currentTimeMillis() - st) + " миллисекунд");
 }
 public static void main(String[] args) {
  DrawTestFrame frame = new DrawTestFrame();
  frame.setVisible(true);
 }
}

Несколько закрытий/открытий окна:
Время отрисовки: 40 миллисекунд
Время отрисовки: 30 миллисекунд
Время отрисовки: 20 миллисекунд
Время отрисовки: 10 миллисекунд
Время отрисовки: 10 миллисекунд
Время отрисовки: 20 миллисекунд
Время отрисовки: 30 миллисекунд
Время отрисовки: 30 миллисекунд
Время отрисовки: 20 миллисекунд
Время отрисовки: 30 миллисекунд


Видели? Меньше секунды!

Вы будете смеяться, но это было сделано на платформе: PentiumII/350МГц/128Мбайт PC133 RAM/Riva TNT2
Sun Java2 Platform, Standard Edition v.1.4.0 (Java; VM; Vendor = 1.4.0; Java HotSpot(TM) Client VM 1.4.0-b92; Sun Microsystems Inc.)

А говорят, что Swing тормозит. :)))
Re[2]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: iZEN СССР  
Дата: 06.08.02 06:02
Оценка:
Добавлю.
Система: Operating System = Windows 2000 version 5.0 running on x86
с Service Pack 2.
Во время запуска было отожрано другими приложениями порядка 197 Мб памяти. И это на 128 Мб оперативки.
:user:
Re[2]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: Igor Trofimov  
Дата: 06.08.02 06:10
Оценка:
ZEN>Видели? Меньше секунды!
ZEN>А говорят, что Swing тормозит.

1. При чем тут свинг?
2. Давно уж выяснили, что причина тормознутости — в GDI+. Напиши с использованием GDI+ (если это возможно на жабе) — вот тогда будет адекватно.
3. Ты ж писал тесты для Дельфи тоже — ну так и тест отрисовки продублируй что-ли на Дельфе...интересно.
Re[3]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: iZEN СССР  
Дата: 06.08.02 06:35
Оценка:
Здравствуйте Igor Trofimov, Вы писали:

ZEN>>Видели? Меньше секунды!

ZEN>>А говорят, что Swing тормозит. :)))

IT>1. При чем тут свинг?

IT>2. Давно уж выяснили, что причина тормознутости — в GDI+. Напиши с использованием GDI+ (если это возможно на жабе) — вот тогда будет адекватно.
IT>3. Ты ж писал тесты для Дельфи тоже — ну так и тест отрисовки продублируй что-ли на Дельфе...интересно.

Пожалуйста:
unit Unit1;
(*
 * Title:        Тест отрисовки в 2D (с помощью GDI)
 * Description:  Простой тест на скорость заполнения линиями разного цвета формы 1024x768
 * Copyright:    Copyright (c) 06.08.2002
 * @author iZEN
 * @version 1.0
*)
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TDrawTestForm = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  DrawTestForm: TDrawTestForm;

implementation

{$R *.dfm}

procedure TDrawTestForm.FormCreate(Sender: TObject);
begin
  Self.Width := 1024;
  Self.Height := 768;
end;

procedure TDrawTestForm.FormPaint(Sender: TObject);
var
  st: Cardinal;
  i: Integer;
  black, white: Integer;
begin
  st := Windows.GetTickCount();
  //Pen p1 = new Pen(Color.Black);
  //Pen p2 = new Pen(Color.White);
  black := clBlack;
  white := clWhite;
  for i := 0 to 1024 do begin
    if ((i AND 1) = 0) then
      Canvas.Pen.Color := black
   else
      Canvas.Pen.Color := white;
   Canvas.MoveTo(i, 0);
   Canvas.LineTo(i, 768);
  end;
  ShowMessage('Время отрисовки: ' + IntToStr(Windows.GetTickCount() - st) + ' миллисекунд'); //20-30мс на PII/350МГц
end;

end.


Несколько закрытий/открытий окна:
Время отрисовки: 30 миллисекунд
Время отрисовки: 20 миллисекунд
Время отрисовки: 20 миллисекунд
Время отрисовки: 30 миллисекунд
Время отрисовки: 20 миллисекунд
Время отрисовки: 20 миллисекунд
Время отрисовки: 20 миллисекунд
Время отрисовки: 20 миллисекунд
Время отрисовки: 20 миллисекунд
Время отрисовки: 30 миллисекунд


Это было сделано на той же платформе: PentiumII/350МГц/128Мбайт PC133 RAM/Riva TNT2
ОС: Windows2000 Proffessional RUS, Service Pack 2
IDE: Delphi 6 Enterprise Edition.
Отожрано памяти другими приложениями порядка 160 Мб.

Вывод: Java2 v.1.4.0 Swing ничуть не уступает по скорости приложениям Delphi 6 с выполнением простой 2D графики через GDI.
:super:
Re[3]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: TK Лес кывт.рф
Дата: 06.08.02 06:49
Оценка:
Здравствуйте Igor Trofimov, Вы писали:

ZEN>>Видели? Меньше секунды!

ZEN>>А говорят, что Swing тормозит.

IT>1. При чем тут свинг?

IT>2. Давно уж выяснили, что причина тормознутости — в GDI+. Напиши с использованием GDI+ (если это возможно на жабе) — вот тогда будет адекватно.
IT>3. Ты ж писал тесты для Дельфи тоже — ну так и тест отрисовки продублируй что-ли на Дельфе...интересно.

Дались Вам эти пчелы... Зачем заставлять библиотеку делать то, для чего она не предназначена...
Вот этот код на той-же машине уже работает раз в 10 быстрее...

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

    e.Graphics.DrawImageUnscaled(Bitmap, 0, 0);
}
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[4]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: TK Лес кывт.рф
Дата: 06.08.02 07:16
Оценка:
Здравствуйте iZEN, Вы писали:

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


ZEN>>>Видели? Меньше секунды!

ZEN>>>А говорят, что Swing тормозит.

IT>>1. При чем тут свинг?

IT>>2. Давно уж выяснили, что причина тормознутости — в GDI+. Напиши с использованием GDI+ (если это возможно на жабе) — вот тогда будет адекватно.
IT>>3. Ты ж писал тесты для Дельфи тоже — ну так и тест отрисовки продублируй что-ли на Дельфе...интересно.

А если линии сделать толщиной например 10 и пусть они будут с небольшим наклоном (грудусов 10 например)... Одна например синяя, а другая красная с коэффициэнтом прозрачности 0.1 и 0.2 соответственно... Что-бы это было явно видно выведем их поверх какой-нибудь картинки... (то, что линии рисуются с эффектом сглаживания — это само собой ясно)

Какие тогда тогда будут соотношения производительности? (ява, дельфи, .NET)


ZEN>Это было сделано на той же платформе: PentiumII/350МГц/128Мбайт PC133 RAM/Riva TNT2

ZEN>ОС: Windows2000 Proffessional RUS, Service Pack 2
ZEN>IDE: Delphi 6 Enterprise Edition.
ZEN>Отожрано памяти другими приложениями порядка 160 Мб.

ZEN>Вывод: Java2 v.1.4.0 Swing ничуть не уступает по скорости приложениям Delphi 6 с выполнением простой 2D графики через GDI.

ZEN>

На дворе 21-й век. Кому нужна примитивная графика?
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[4]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: iZEN СССР  
Дата: 06.08.02 08:57
Оценка:
Здравствуйте TK, Вы писали:

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


ZEN>>>Видели? Меньше секунды!

ZEN>>>А говорят, что Swing тормозит. :)))

IT>>1. При чем тут свинг?

IT>>2. Давно уж выяснили, что причина тормознутости — в GDI+. Напиши с использованием GDI+ (если это возможно на жабе) — вот тогда будет адекватно.
IT>>3. Ты ж писал тесты для Дельфи тоже — ну так и тест отрисовки продублируй что-ли на Дельфе...интересно.

TK>Дались Вам эти пчелы... Зачем заставлять библиотеку делать то, для чего она не предназначена...

TK>Вот этот код на той-же машине уже работает раз в 10 быстрее...

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

TK>    e.Graphics.DrawImageUnscaled(Bitmap, 0, 0);
TK>}
TK>


А вот этот код во сколько раз быстрее? :))
package drawtest;
/**
 * Title:        Тест отрисовки в 2D
 * Description:  Простой тест на скорость заполнения линиями разного цвета формы 1024x768
 * Copyright:    Copyright (c) 06.08.2002
 * @author iZEN
 * @version 1.1
 */
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.geom.*;
import java.awt.image.BufferedImage;

public class DrawTestFrame extends JFrame {
   /**Construct the frame*/
   public DrawTestFrame() {
      enableEvents(AWTEvent.WINDOW_EVENT_MASK);
      try {
         jbInit();
      } catch(Exception e) {
         e.printStackTrace();
      }
   }
   /**Component initialization*/
   private void jbInit() throws Exception  {
      this.setSize(new Dimension(1024, 768));
      this.setTitle("Draw Test");
   }
   /**Overridden so we can exit when window is closed*/
   protected void processWindowEvent(WindowEvent e) {
      super.processWindowEvent(e);
      if (e.getID() == WindowEvent.WINDOW_CLOSING) {
         System.exit(0);
      }
   }
   public void paint(Graphics g) {
      super.paint(g);   
      paint2D(g);
   }
   private boolean firstTime = true;//Флагинициализации буфера
   private BufferedImage bi = null;//Буферный кадр
   private Graphics2D big = null;//Буферный 2D
   public void paint2D(Graphics g) {
      Graphics2D g2 = (Graphics2D)g;
      if (firstTime){
         Dimension dim = this.getSize();
         int w = dim.width;
         int h = dim.height;
         bi = (BufferedImage)createImage(w, h);
         big = bi.createGraphics();
         big.setColor(Color.white);
         big.clearRect(0, 0, w, h);
         for (int i = 0; i < w; i++) {
            if ((i&1) == 0)
               big.setColor(Color.black);
            else
               big.setColor(Color.white); 
            Line2D line = new Line2D.Double(i, 0, i, h);
            big.draw(line);
         }
         firstTime = false;
      }
      long st = System.currentTimeMillis();
      // Draws the buffered image to the screen.
      g2.drawImage(bi, 0, 0, this);
      System.out.println("Время отрисовки в Graphics2D: " + (System.currentTimeMillis() - st) + " миллисекунд"); 
   }
   public static void main(String[] args) {
      DrawTestFrame frame = new DrawTestFrame();
      frame.setVisible(true);
   }
}

Замечание
Строчка:
Line2D line = new Line2D.Double(i, 0, i, h);

создаёт линию с координатами в действительном пространстве (плавающая точка! как в GDI+).

Консольный вывод после нескольких сворачиваний/разворачиваний/перекрытий/изм.размеров окна:
Время отрисовки в Graphics2D: 40 миллисекунд
Время отрисовки в Graphics2D: 471 миллисекунд
Время отрисовки в Graphics2D: 50 миллисекунд
Время отрисовки в Graphics2D: 30 миллисекунд
Время отрисовки в Graphics2D: 40 миллисекунд
Время отрисовки в Graphics2D: 0 миллисекунд
Время отрисовки в Graphics2D: 0 миллисекунд
Время отрисовки в Graphics2D: 0 миллисекунд
Время отрисовки в Graphics2D: 0 миллисекунд
Время отрисовки в Graphics2D: 0 миллисекунд
Время отрисовки в Graphics2D: 0 миллисекунд
Время отрисовки в Graphics2D: 0 миллисекунд
Время отрисовки в Graphics2D: 0 миллисекунд
Время отрисовки в Graphics2D: 0 миллисекунд

Платформа:
PentiumII/350МГц/128Мбайт PC133 RAM/Riva TNT2-32Мб
ОС: Windows2000 Proffessional RUS, Service Pack 2
Sun Java2 Platform, Standard Edition v.1.4.0 (Java; VM; Vendor = 1.4.0; Java HotSpot(TM) Client VM 1.4.0-b92; Sun Microsystems Inc.)
На момент запуска отожрано памяти другими процессами порядка 205 Мбайт.

:))

P.S. Двойная буферизация, конечно, иногда всё "исправляет" в плане быстродействия. :-\
Re[4]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: Igor Trofimov  
Дата: 06.08.02 08:57
Оценка:
TK>Дались Вам эти пчелы... Зачем заставлять библиотеку делать то, для чего она не предназначена...
TK>Вот этот код на той-же машине уже работает раз в 10 быстрее...

Слушай, почитай тред с самого начала, а?

Уже сто раз всем объяснял, что пример приводился ИСКЛЮЧИТЕЛЬНО ДЛЯ ПРОВЕРКИ СКОРОСТИ РИСОВАНИЯ В .NET.
Соответственно, мне НЕ НУЖНА ТУТ СКОРОСТЬ. Мне нужна была оценка времени исполнения АНАЛОГИЧНОГО КОДА по сравнению с другими платформами.

Выяснили вроде, что тормозит GDI+, потому что в .NET это стандарт рисования, а аппаратно он пока не поддержан. Все, вроде бы тема закрыта, нет, подняли снова.... Ну, впрочем, вот IZEN на жабе аналогичный тест привел... за что ему наша большая человеческая благодарность...

Правда, надо бы по-хорошему, увеличить хотя бы на порядок трудоемкость тестов... 20-30 мс — это слишком мало..там погрешность велика и всякие мелкие накладные расходы... надо бы, чтобы самые быстрые около секунды выполняли.
Re[5]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: iZEN СССР  
Дата: 06.08.02 09:28
Оценка:
Здравствуйте Igor Trofimov, Вы писали:

У меня встречная просьба (не откажите уж).
Пожалуйста, укажите платформу, на которой вы проводили свой тест.
Хочется оценить показатели.

IT>Правда, надо бы по-хорошему, увеличить хотя бы на порядок трудоемкость тестов... 20-30 мс — это слишком мало..там погрешность велика и всякие мелкие накладные расходы... надо бы, чтобы самые быстрые около секунды выполняли.


Конечно, это легко сделать, вычерчивая замысловатые, но простые фигуры (окружности, овалы, дуги и т.д.), которые отрабатываются в основном командами GDI/GDI+/Net, а не прикладным кодом.
Тогда и можно будет посмотреть реальную работу ядра GDI/GDI+/Net.
Re[5]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: iZEN СССР  
Дата: 06.08.02 10:12
Оценка:
Здравствуйте TK, Вы писали:

TK>А если линии сделать толщиной например 10 и пусть они будут с небольшим наклоном (грудусов 10 например)... Одна например синяя, а другая красная с коэффициэнтом прозрачности 0.1 и 0.2 соответственно... Что-бы это было явно видно выведем их поверх какой-нибудь картинки... (то, что линии рисуются с эффектом сглаживания — это само собой ясно)


От наклона линий производительность, по крайней мере в Java2, не зависит! Я уже убедился на собственном опыте. Толщина линий и альфа-канал предполагают заливку, а вот где это будет происходить: в самом ядре GDI/GDI+ или на прикладном уровне библиотек я пока не изучал и не знаю. Из примеров к JSDK, в частности jdk\Demo\jfc\Java2D\Java2Demo.jar, можно оценить производительность 2D-графики с включенным и с выключенным альфа-каналом, с текстурированием, с анти-алиасингом. "Вклад" каждой из составляющих -- порядка 20..30% уменьшения производительности на слабых машинках и 3..5% -- на современных монстрах. Кроме того, многое зависит от прикладного кода библиотек и приложения, возможна серьёзная оптимизация и на этом уровне.

TK>Какие тогда тогда будут соотношения производительности? (ява, дельфи, .NET)

Я думаю, соотношения будут равными (когда .Net окончательно доделают:))). Но на сегодня: Java чуть-чуть отстаёт от Delphi на вычислительных задачах, но серьёзно (иногда в 2-3 раза) обгоняет её на комбинаторных алгоритмах (строки, буферы, потоки данных).

TK>На дворе 21-й век. Кому нужна примитивная графика?


Всем. Или вы решили использовать OpenGL и DirectX для отрисовки иконок на кнопках? :))
Re[6]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: TK Лес кывт.рф
Дата: 06.08.02 10:31
Оценка:
Здравствуйте iZEN, Вы писали:

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


ZEN>От наклона линий производительность, по крайней мере в Java2, не зависит! Я уже убедился на собственном опыте. Толщина линий и альфа-канал предполагают заливку, а вот где это будет происходить: в самом ядре GDI/GDI+ или на прикладном уровне библиотек я пока не изучал и не знаю. Из примеров к JSDK, в частности jdk\Demo\jfc\Java2D\Java2Demo.jar, можно оценить производительность 2D-графики с включенным и с выключенным альфа-каналом, с текстурированием, с анти-алиасингом. "Вклад" каждой из составляющих -- порядка 20..30% уменьшения производительности на слабых машинках и 3..5% -- на современных монстрах. Кроме того, многое зависит от прикладного кода библиотек и приложения, возможна серьёзная оптимизация и на этом уровне.

Я и не говорил, что она от наклона зависит Так сглаживание лучше видно...
PS.
А на современных монстрах, что аппаратное ускорение для 2D графики включается? Благодаря чему экономится достигается подобная экономия?

TK>>Какие тогда тогда будут соотношения производительности? (ява, дельфи, .NET)

ZEN>Я думаю, соотношения будут равными (когда .Net окончательно доделают. Но на сегодня: Java чуть-чуть отстаёт от Delphi на вычислительных задачах, но серьёзно (иногда в 2-3 раза) обгоняет её на комбинаторных алгоритмах (строки, буферы, потоки данных).
А причем тут доработки .NET и GDI+ (единственное, что только появились примерно в одно время)?

TK>>На дворе 21-й век. Кому нужна примитивная графика?


ZEN>Всем. Или вы решили использовать OpenGL и DirectX для отрисовки иконок на кнопках?

До этого пока еще не дошло... А сглаживание, полупрозрачность это нужно уже сейчас.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[5]: Отрисовка в C# тормозит ПО-СТРАШНОМУ
От: iZEN СССР  
Дата: 06.08.02 10:39
Оценка:
Здравствуйте TK.

TK>А если линии сделать толщиной например 10 и пусть они будут с небольшим наклоном (грудусов 10 например)... Одна например синяя, а другая красная с коэффициэнтом прозрачности 0.1 и 0.2 соответственно... Что-бы это было явно видно выведем их поверх какой-нибудь картинки... (то, что линии рисуются с эффектом сглаживания — это само собой ясно)

TK>Какие тогда тогда будут соотношения производительности? (ява, дельфи, .NET)

Встречное предложение.
Давайте протестируем приложения, работающие в 3D-графике и использующие OpenGL и DirectX.
Это не проблема для Delphi(оболочки прямых вызовов API библиотек) и Java(с пакетом Java3D под эти два интерфейса).
А как обстоят дела с 3D в .Net?

Если соберёмся, то хочется оценить несколько параметров, в частности: быстродействие вызовов "сервера" OpenGL/DirectX прикладным кодом; трудоёмкость написания приложения (грубо: количество строк кода); функциональность на количество строк -- тоже грубо.:user:
Re[6]: Отрисовка в C# тормозит ПО-СТРАШНОМУ
От: TK Лес кывт.рф
Дата: 06.08.02 11:44
Оценка:
Здравствуйте iZEN, Вы писали:

ZEN>Здравствуйте TK.


TK>>А если линии сделать толщиной например 10 и пусть они будут с небольшим наклоном (грудусов 10 например)... Одна например синяя, а другая красная с коэффициэнтом прозрачности 0.1 и 0.2 соответственно... Что-бы это было явно видно выведем их поверх какой-нибудь картинки... (то, что линии рисуются с эффектом сглаживания — это само собой ясно)

TK>>Какие тогда тогда будут соотношения производительности? (ява, дельфи, .NET)

ZEN>Встречное предложение.

ZEN>Давайте протестируем приложения, работающие в 3D-графике и использующие OpenGL и DirectX.
ZEN>Это не проблема для Delphi(оболочки прямых вызовов API библиотек) и Java(с пакетом Java3D под эти два интерфейса).
ZEN>А как обстоят дела с 3D в .Net?

ZEN>Если соберёмся, то хочется оценить несколько параметров, в частности: быстродействие вызовов "сервера" OpenGL/DirectX прикладным кодом; трудоёмкость написания приложения (грубо: количество строк кода); функциональность на количество строк -- тоже грубо.:user:


Никаких проблем MC++ и OpenGL.
DirectX — так с использованием COM объектов тоже никаких проблем нет...

Может быть .NET это и новая разработка, но использовать старые никто не запрещал :)
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[6]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От: Igor Trofimov  
Дата: 06.08.02 12:05
Оценка:
ZEN>Всем. Или вы решили использовать OpenGL и DirectX для отрисовки иконок на кнопках?

К тому все идет. Не мы, так MS
Кнопки будут делать с шершавыми текстурами и bumpmapping'ом — чтобы больше на настоящие походили, тень отбрасывали реалистичную...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.