Здравствуйте Аноним, Вы писали:
Z>>Хех, а ты лучше линии пачкой выводи... Z>>Используй e.Graphics.DrawLines с массивом линий.
А>Ох-ох-ох... Еще раз... мне НЕ НУЖНА полосатая форма. Меня волнует, что рисование тормозит В ПРИНЦИПЕ.
Ну, так импортируй старое доброе GDI и тормозов будет куда меньше...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте Igor Trofimov, Вы писали:
IT>Кстати... Для сравнения скорости работы очень полезно скачать с www.devexpress.com демо-программки к ихним библиотекам.
IT>Можете скачать для сравнения демки к нативным (ActiveX, VCL) библиотекам и к .NET библиотекам.
IT>Эти парни — не дураки и уж если у них так тормозит, значит, точно что-то не так... в .net ((
Я бы качал чё нибудь от Инфрогистик (бывший Шаридан). Они на .Net серьезные бабки делать хотят.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте AndrewVK, Вы писали:
AVK>Здравствуйте retalik, Вы писали:
R>>Связано это с тем, что GDI+ 1.0 вообще не акселерирован — а это, в сочетании с float-координатной системой и 32-битным расчетом цвета, сильно сказывается. AVK>К чему тогда заявления производителей видеокарт о полной аппаратной поддержке GDI+?
А какие проблемы? Аппаратный alpha-blending есть, вывод текстур в 32 битах есть, scaling/stretching есть — чем не полная поддержка GDI+?
Другое дело, GDI+ их пока не поддерживает (DDI нету).
Здравствуйте Yurik, Вы писали:
Y>Здравствуйте Igor Trofimov, Вы писали:
IT>>Почему? GDI+ тут не причем, если большие накладные расходы именно на ВЫЗОВ не-safe (с точки зрения .NET) функций.Мы же, опять-таки, не знаем, что кроется за DllImport... Y>Все таки gdi+ виноват, imho. Где-то уже пробегала инфа, что тормозной он на редкость. Может не отладили еще ребята из Микрософта, не дооптимизировали. Надеюсь, в следующих версиях это поправят.
GDI+ медленный не из-за того, что "ребята из Микрософта" недоотладили, а из-за того, что он рисует все по-другому — антиалиасинг, нецелочисленные координаты и проч... В микрософтовской ньюсгруппе по GDI периодически встает вопрос, почему GDI+ медленней простого GDI, и постоянно возникает ответ — они не сравнимы.
Здравствуйте Simontsev Andrew, Вы писали:
SA>GDI+ медленный не из-за того, что "ребята из Микрософта" недоотладили, а из-за того, что он рисует все по-другому — антиалиасинг, нецелочисленные координаты и проч... В микрософтовской ньюсгруппе по GDI периодически встает вопрос, почему GDI+ медленней простого GDI, и постоянно возникает ответ — они не сравнимы.
Ну, "не сравнимы" — это очень сильно сказано. Если две системы предназначены для решения одних и тех же (или похожих, по крайней мере) задач, то сравнивать их можно и нужно. Другое дело — по каким параметрам. Итак, с параметром "скорость" все ясно. А другие мы здесь не обсуждаем.
Заявление о том, что GDI+ — абсолютно другая система, imho, нужно просто понимать так, что ускорения в следующих версиях ждать не стоит, по крайней мере глобального. В таком случае, очень жаль, что в .NET нет классовой обертки вокруг простого GDI. Типа VCL-ного TCanvas.
Здравствуйте Yurik, Вы писали:
Y>Здравствуйте VladD2, Вы писали:
VD>>Я бы качал чё нибудь от Инфрогистик (бывший Шаридан). Они на .Net серьезные бабки делать хотят. Y>Ссылочку можно?
Y>> В таком случае, очень жаль, что в .NET нет классовой обертки вокруг простого GDI. Типа VCL-ного TCanvas. VD>Ну, так сделай. Кто тебе мешает. У MS даже есть нэймспэйс с описанием всех апишниых функций.
Так что отсается только запернуть...
Угу... Вот только в стандартной-то библиотеке — хрен чего поменяешь
Это тогда по хорошему и стандартную библиотеку контролов надо здорово переработать — чтобы под этой оберткой пахала...
Здравствуйте Yurik, Вы писали:
Y>Здравствуйте Simontsev Andrew, Вы писали:
SA>>GDI+ медленный не из-за того, что "ребята из Микрософта" недоотладили, а из-за того, что он рисует все по-другому — антиалиасинг, нецелочисленные координаты и проч... В микрософтовской ньюсгруппе по GDI периодически встает вопрос, почему GDI+ медленней простого GDI, и постоянно возникает ответ — они не сравнимы.
Y>Ну, "не сравнимы" — это очень сильно сказано. Если две системы предназначены для решения одних и тех же (или похожих, по крайней мере) задач, то сравнивать их можно и нужно. Другое дело — по каким параметрам. Итак, с параметром "скорость" все ясно. А другие мы здесь не обсуждаем.
GDI+ предназначен для более широкого круга задач. В частности в старом GDI не было антиалиасинга, полупрозрачностей, геометрических преобразований...
Y>Заявление о том, что GDI+ — абсолютно другая система, imho, нужно просто понимать так, что ускорения в следующих версиях ждать не стоит, по крайней мере глобального. В таком случае, очень жаль, что в .NET нет классовой обертки вокруг простого GDI. Типа VCL-ного TCanvas.
Ну для тех кому важна только скорость действительно стоило бы сделать... Правда можно и самому написать при большом желании... GDI+ и GDI в принципе совместимы (т.е. у гдиплюсных объектов можно запрашивать гдишный хэндл)...
Здравствуйте Igor Trofimov, Вы писали:
Y>>> В таком случае, очень жаль, что в .NET нет классовой обертки вокруг простого GDI. Типа VCL-ного TCanvas. VD>>Ну, так сделай. Кто тебе мешает. У MS даже есть нэймспэйс с описанием всех апишниых функций. IT>Так что отсается только запернуть...
IT>Угу... Вот только в стандартной-то библиотеке — хрен чего поменяешь IT>Это тогда по хорошему и стандартную библиотеку контролов надо здорово переработать — чтобы под этой оберткой пахала...
Так, а стандартная, она на обычных вин-контролах базируется. Так что перехватывай назные виндузные сообщения и делай, что хочешь. Мне вот когда пример к одной статье писал нужно было сделать выделение в текстбоксе... ну, и чё? Послал пару Edit-овых месаг окошку и все в порядке.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте VladD2, Вы писали:
VD>Ну, так импортируй старое доброе GDI и тормозов будет куда меньше...
Когда-то давно вставал похожий вопрос: а почему GDI такой тормозной?
И вообще то он еще не снят.
Может имело бы смысл его аппартно ускорять?
Здравствуйте AndrewVK, Вы писали:
AVK>Код номер два
AVK>procedure Test.Paint;
// Входим в процу
// Canvas залочен!
AVK>begin
// Чего-то там рисуем в Canvas, типа что-то в буфер
AVK>end;
// Вышли из процы.
// Далее работает тот, кто вызвал:
// Canvas разлочивается и отрисовывается один раз!
// Чего-то там рисуем
// А кто сказал, что при каждом DrawLine окну не посылается WP_PAINT?
AVK> }
Я, конечно, могу очень сильно ошибаться.
Если так то простите за вмешательство.
Re[5]: Отрисовка в C# тормозит ПО СТРАШНОМУ
От:
Аноним
Дата:
04.08.02 20:53
Оценка:
Здравствуйте Gagarkin, Вы писали:
G>// Чего-то там рисуем G>// А кто сказал, что при каждом DrawLine окну не посылается WP_PAINT?
Тогда бы все зациклилось, ибо эта процедура как раз и вызывается по WM_PAINT
G>Я, конечно, могу очень сильно ошибаться. G>Если так то простите за вмешательство.
Чего то ты поздновато опомнился, последенее сообщение в треде было давным давно
Здравствуйте ...
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);
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);
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;
Здравствуйте 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.)
Добавлю.
Система: Operating System = Windows 2000 version 5.0 running on x86
с Service Pack 2.
Во время запуска было отожрано другими приложениями порядка 197 Мб памяти. И это на 128 Мб оперативки.
:user:
ZEN>Видели? Меньше секунды! ZEN>А говорят, что Swing тормозит.
1. При чем тут свинг?
2. Давно уж выяснили, что причина тормознутости — в GDI+. Напиши с использованием GDI+ (если это возможно на жабе) — вот тогда будет адекватно.
3. Ты ж писал тесты для Дельфи тоже — ну так и тест отрисовки продублируй что-ли на Дельфе...интересно.
Здравствуйте 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: