AVK>А подумать? AVK>Вобще то такие вещи делаются копированием предварительно подготовленных битмапов
Да,да,да. Конечно. Но речь не о том, как делать какую-то конкретную вещь. Речь об общей тормознутости.Можно придумать пример, когда заготовленным битмапом не отделаешься — тогда что?
Приведенный код был специально написан, когда возникла мысль, что рисование тормозит — для окончательной проверки. Удостоверился. Хотя не ожидал, что все ТАК плохо.
Здравствуйте 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 с массивом линий.
Ох-ох-ох... Еще раз... мне НЕ НУЖНА полосатая форма. Меня волнует, что рисование тормозит В ПРИНЦИПЕ.
Здравствуйте Аноним, Вы писали:
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.
AVK>Код номер раз AVK>Консоль: AVK>340
AVK>Код номер два AVK>Консоль: AVK>10
AVK>Что ж, похоже ты прав
То-то и оно... Я тоже на Дельфе проверял...Невооруженным глазом видно.. Ну вот...замерили...
Как-то это все прокомментируют знающие люди? Оптимизатор у C# прекрасный, код генерится отличный, методы вызываются быстро, числа складываются хорошо, вот только в результате — тормознее дельфевого кода в 34 раза
Знать бы, в чем протормоз — в обилии managed кода внутри WinForms.Drawings? Или в чем-то еще? Вообще непонятно, чему там ТАК тормозить... Может, тормоза при обслуживании вызовов не-.net библиотек (gdi)? Это, кстати, не тестировали...
Можно попробовать потестировать — слабать 2 dll-ки — одну — обычную, другую — .net и повызывать функцию/метод класса из одной и из другой много раз. Замерить...
Здравствуйте Igor Trofimov, Вы писали:
IT>Знать бы, в чем протормоз — в обилии managed кода внутри WinForms.Drawings?
Сомнительно
Или в чем-то еще? Вообще непонятно, чему там ТАК тормозить...
Что прикалывает — свинги томозят потомучто там вся отрисовка на жабе. А тут все контролы нативные. И один хрен тормозит.
Может, тормоза при обслуживании вызовов не-.net библиотек (gdi)?
Не, это вряд ли. Тем паче что дотнет использует GDI+ который по идее на новых железках должен быть даже быстрее (на той машине на которой я тесты запускал GeForce2).
IT>Можно попробовать потестировать — слабать 2 dll-ки — одну — обычную, другую — .net и повызывать функцию/метод класса из одной и из другой много раз. Замерить...
Я думаю результат будет тот же. Тут профайлером бы прогнать
Я заглянул 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. И чего ты померяешь?
Здравствуйте Igor Trofimov, Вы писали:
IT>Почему? GDI+ тут не причем, если большие накладные расходы именно на ВЫЗОВ не-safe (с точки зрения .NET) функций.Мы же, опять-таки, не знаем, что кроется за DllImport...
Все таки gdi+ виноват, imho. Где-то уже пробегала инфа, что тормозной он на редкость. Может не отладили еще ребята из Микрософта, не дооптимизировали. Надеюсь, в следующих версиях это поправят.
ЗY>Все таки gdi+ виноват, imho. Где-то уже пробегала инфа, что тормозной он на редкость. Может не отладили еще ребята из Микрософта, не дооптимизировали. Надеюсь, в следующих версиях это поправят.
Мммммм.. Ну будем надеяться... Как-бы это все-таки понадежнее проверить? Ага! Надо налабать программку на чем-то обычном — VC/Delphi с использованием GDI+, которая делает все то же. Будет ясно.
AVK>Что прикалывает — свинги томозят потомучто там вся отрисовка на жабе. А тут все контролы нативные. И один хрен тормозит.
Кстати, не все — нативные. Пресловутый GroupBox имеет метод OnPaint. Кстати говоря — Button или ListBox, растянутые и с Anchor=Left|Right ведут себя превосходно... У них, между прочим — OnPaint'а нету!!
Здравствуйте 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-битным расчетом цвета, сильно сказывается. Правда, сейчас, по слухам, работы ведутся.
R>Связано это с тем, что GDI+ 1.0 вообще не акселерирован — а это, в сочетании с float-координатной системой и 32-битным расчетом цвета, сильно сказывается. Правда, сейчас, по слухам, работы ведутся.
float??????!!!!!!!!!!!!???????? А нафига???? Нет, правда — нафига???
Здравствуйте Igor Trofimov, Вы писали:
R>>Связано это с тем, что GDI+ 1.0 вообще не акселерирован — а это, в сочетании с float-координатной системой и 32-битным расчетом цвета, сильно сказывается. Правда, сейчас, по слухам, работы ведутся.
IT>float??????!!!!!!!!!!!!???????? А нафига???? Нет, правда — нафига???
Про 16-бит лимит координат в 9x слышал? В GDI+ этого ограничения нет (правда, есть другое — где-то на сотнях тысяч обламывается). Плюс возможности координатных преобразований с неплохой (для десктопных приложений) точностью — поворот, зум, перенос.
Да не в float-е дело... Вон, в OpenGL он никого не пугает. Сопроцессор работает параллельно, так что не очень уж это и страшно. Просто все точки рассчитываются программно (похоже, даже без MMX) — а это такая опа...
Есть слухи, что с DirectX 9 прийдет и DDI для GDI+.
Здравствуйте retalik, Вы писали:
R>Связано это с тем, что GDI+ 1.0 вообще не акселерирован — а это, в сочетании с float-координатной системой и 32-битным расчетом цвета, сильно сказывается.
К чему тогда заявления производителей видеокарт о полной аппаратной поддержке GDI+?
Как я понимаю... ответ в этом вопросе...
AVK> Может, тормоза при обслуживании вызовов не-.net библиотек (gdi)? AVK>Не, это вряд ли. Тем паче что дотнет использует GDI+ который по идее на новых железках должен быть даже быстрее (на той машине на которой я тесты запускал GeForce2).
Кто тебе такие сказки про GDI+ расказал? Ты создай пример лна GDI+ и MFC-е. Вот тогда сравнение будет корректное.
Еще одна проблемма — вызов нэйтив-кода. Она еще проценов 30 может отнимать.
PS
Еще интересно было бы слабать пример на обычном GDI, но под нет. Тут все тормоза вылились бы в переход managed-unmanaged.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте AndrewVK, Вы писали:
AVK>Здравствуйте retalik, Вы писали:
R>>Связано это с тем, что GDI+ 1.0 вообще не акселерирован — а это, в сочетании с float-координатной системой и 32-битным расчетом цвета, сильно сказывается. AVK>К чему тогда заявления производителей видеокарт о полной аппаратной поддержке GDI+?
К бабка от продаж.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте Igor Trofimov, Вы писали:
AVK>>Что прикалывает — свинги томозят потомучто там вся отрисовка на жабе. А тут все контролы нативные. И один хрен тормозит.
IT>Кстати, не все — нативные. Пресловутый GroupBox имеет метод OnPaint. Кстати говоря — Button или ListBox, растянутые и с Anchor=Left|Right ведут себя превосходно... У них, между прочим — OnPaint'а нету!!
А ты на них спай натрави.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.