Форум: "Прочее";
Текущий архив: 2012.04.01;
Скачать: [xml.tar.bz2];
ВнизFireMonkey Найти похожие ветки
← →
DVM © (2011-12-05 22:49) [40]
> Кто б сомневался © (05.12.11 22:47) [39]
лучше Form1.cs посмотри, оно больше похоже на VCL
← →
И. Павел © (2011-12-05 22:53) [41]
> Кто б сомневался © (05.12.11 22:44) [37]
В обработчике нажатия кнопки (той, которая изначально на форме) написал код для заполнения массива из 1000 кнопок. Присвоил им Top = i / 20 * 20 и Lwft = i % 20 * 50 (i - индекс кнопки в массиве). потом запустил таймер с интервалом в 50мс. В таймере смещал кнопки на 2 пикселя вправо, пока у первой кнопки не станет left > 300. Тогда шел влево до left = 0 и т.д. (через переменную, хранящую направление +1/-1)
← →
И. Павел © (2011-12-05 22:54) [42]Lwft -> Left
← →
Rouse_ © (2011-12-05 23:39) [43]Накидал на скорую руку на дельфе, помедленней конечно на порядок чем WPF, но вроде побыстрей этих ваших WinForms. (Еще раз просьба - у кого есть ХЕ2, сделайте аналог на FireMonkey для теста, плз)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
MoveToRight: Boolean;
ButtonsOffset: ShortInt;
Buttons: array [0..999] of TButton;
function CalcButtonsOffset: Integer;
procedure CreateThousandButtnos;
procedure MoveButtons(Value: ShortInt);
procedure ReleseButtons;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
CreateThousandButtnos;
end;
function TForm1.CalcButtonsOffset: Integer;
begin
if MoveToRight then
Dec(ButtonsOffset)
else
Inc(ButtonsOffset);
if ButtonsOffset < 1 then
MoveToRight := False;
if ButtonsOffset > 16 then
MoveToRight := True;
Result := ButtonsOffset;
end;
procedure TForm1.CreateThousandButtnos;
var
I: Integer;
begin
for I := 0 to 999 do
begin
Buttons[I] := TButton.Create(nil);
Buttons[I].Parent := Self;
Buttons[I].Caption := IntToStr(I);
end;
Timer1.Enabled := True;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1.Enabled := False;
MoveToRight := False;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ReleseButtons;
end;
procedure TForm1.MoveButtons(Value: ShortInt);
var
I: Integer;
D: THandle;
begin
D := BeginDeferWindowPos(1000);
try
for I := 0 to 999 do
D := DeferWindowPos(D, Buttons[I].Handle,
0, (I * 75) mod (20 * 75) + Value,
I div 20 * 20 + Panel1.Height, 75, 20, SWP_NOZORDER or SWP_NOREDRAW);
finally
EndDeferWindowPos(D);
end;
RedrawWindow(Handle, nil, 0, RDW_INVALIDATE or RDW_ALLCHILDREN or RDW_UPDATENOW);
end;
procedure TForm1.ReleseButtons;
var
I: Integer;
begin
for I := 0 to 999 do
Buttons[I].Free;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
MoveButtons(CalcButtonsOffset);
end;
end.
← →
Rouse_ © (2011-12-05 23:44) [44]зы: таймер на полтинник, алигн панели вверх, на панели Button1...
← →
DVM © (2011-12-05 23:47) [45]
> Rouse_ © (05.12.11 23:39) [43]
А если вмеcто TButton взять TSpeedButton? Так оно более честно по сравнению с WPF.
← →
DVM © (2011-12-05 23:48) [46]
> Rouse_ © (05.12.11 23:44) [44]
> зы: таймер на полтинник, алигн панели вверх, на панели Button1.
> ..
>
>
Дай DFM а лучше весь проект сделаю XE2 + FM
← →
Rouse_ © (2011-12-05 23:53) [47]
> DVM © (05.12.11 23:47) [45]
>
>
> > Rouse_ © (05.12.11 23:39) [43]
>
> А если вмеcто TButton взять TSpeedButton?
Ща попробую...
← →
Rouse_ © (2011-12-05 23:57) [48]Не получится, этож график контрол. Хэндла нема, стало быть править положение через Buttons[I].SetBounds придется с дикими тормозами, проще сразу на канве как нужно и оч быстро всю эту байду нарисовать.
Вот DFM:object Form1: TForm1
Left = 0
Top = 0
Caption = "Form1"
ClientHeight = 337
ClientWidth = 635
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = "Tahoma"
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
OnDestroy = FormDestroy
PixelsPerInch = 96
TextHeight = 13
object Panel1: TPanel
Left = 0
Top = 0
Width = 635
Height = 41
Align = alTop
TabOrder = 0
ExplicitLeft = 120
ExplicitTop = 144
ExplicitWidth = 185
object Button1: TButton
Left = 8
Top = 8
Width = 75
Height = 25
Caption = #1057#1090#1072#1088#1090
TabOrder = 0
OnClick = Button1Click
end
end
object Timer1: TTimer
Interval = 50
OnTimer = Timer1Timer
Left = 88
Top = 8
end
end
← →
DVM © (2011-12-06 00:00) [49]FM на создании тысячи кнопок стал нереально тормозить. Короче даже окно двигается с ними с трудом.
← →
Rouse_ © (2011-12-06 00:01) [50]Да и на создании тыщи обычных кнопок дельфя секунды три курит...
← →
DVM © (2011-12-06 00:02) [51]
> Rouse_ © (06.12.11 00:01) [50]
У меня он минуту уже курит.
← →
Rouse_ © (2011-12-06 00:03) [52]
> DVM © (06.12.11 00:02) [51]
>
>
> > Rouse_ © (06.12.11 00:01) [50]
>
> У меня он минуту уже курит.
>
Ну тогда интересно - отрисовывать то он их хоть быстро будет или не? :)
← →
DVM © (2011-12-06 00:12) [53]
> Rouse_ © (06.12.11 00:03) [52]
Отрисовывает и двигает нормально, но очень медленно. Примерно шаг в 1 секунду.
← →
DVM © (2011-12-06 00:25) [54]http://narod.ru/disk/33450847001/Project2.zip.html
вот для FM. Экзешник правда здоровый 8 мег.
← →
Rouse_ © (2011-12-06 00:29) [55]Удалено модератором
Примечание: 404
← →
DVM © (2011-12-06 00:31) [56]
> 404 выдает
вроде нормально уже
← →
Rouse_ © (2011-12-06 00:35) [57]Хм, скачал.
Быстрее работает чем в моей демке и WebForm.
Медленней чутка чем в WPF, но совсем чутка и однозначно быстрее чем остальные.
← →
icelex © (2011-12-06 00:47) [58]
> Кто б сомневался © (05.12.11 18:58) [9]
> 5. Давайте чтобы решить спор - напишем 2 программы - VCL(WinForms)
> и WPF - в которых по форме будут быстро перемещаться несколько
> стандартных виз. компонентов. (либо 50 прогресс баров) Это
> уже делали на одном форуме кстати, года 4 назад.
я не спорил, я спросил
мне фигней заниматься некогда и письками с кем-нибудь другим меряйся :)
← →
знайка (2011-12-06 01:29) [59]Прикольно во время отрисовки еще и порисайзить окно.
← →
Кто б сомневался © (2011-12-06 05:25) [60]
> Да и на создании тыщи обычных кнопок дельфя секунды три
> курит...
Нужно поменять местами строчки
Buttons[I].Parent := Self;
Buttons[I].Caption := IntToStr(I);
Родителя нужно присваивать в конце, получаем полторы секунды (иначе лишний раз отрисовывается).
WPF явно быстрее при передвижении кнопок, вот только разницы в тормозах нет что на виртуальной машине, что на реальной с GTS 450 - проц грузится по максимуму, а тормоза те же. Видяха явно не слабая. Видимо все таки подгружает проц, как и в WinControls. Возможно там используется по умолчанию двойная буферизация, с ней и со стандартными контролами Windows не должно быть тормозов.
Но в целом ощущения неповоротливости от .Net программ, главным образом от интерфейсов остается. Реакция пользователя > <задержка> > отклик интерфейса. Возможно это проблемы реализации, но что-то слишком часто они встречаются, причем в качественных продуктах.
← →
DVM © (2011-12-06 10:15) [61]
> Rouse_ © (06.12.11 00:35) [57]
Я тоже попробовал на другой машине - весьма шустро работает. Первый раз пробовал на нетбуке, не шибко мощном, вероятно там с поддержкой OpenGL в драйверах видеокарты не очень.
← →
icelex © (2011-12-06 11:14) [62]
> Но в целом ощущения неповоротливости от .Net программ, главным
> образом от интерфейсов остается.
"Серебро-то нашлось. А вот остаток неприятный таки остался." (С)
← →
han_malign (2011-12-06 15:57) [63]
> А если вмеcто TButton взять TSpeedButton? Так оно более честно по сравнению с WPF.
> Хэндла нема, стало быть править положение через Buttons[I].SetBounds придется с дикими тормозамиTControl
...
protected
procedure UpdateBoundsRect(const R: TRect);
...
- ну а Invalidate уж - не мелочась - всему родителю...
Хотя там и так, кроме 2000 x InvalidateRect, особо тормозов не должно быть...
← →
Кто б сомневался © (2011-12-06 17:37) [64]
> icelex © (06.12.11 11:14) [62]
Не совсем нашлось то что искалось.
GPU так и не использовалось вместо него CPU. Причем разницы что на эмулируемой видяхе, что на реальной с кнопками+формой нет.
Кстати
Требования к ресурсам выше на пустых активных формах с кнопкой (1072\5288 PrivateWS; 7792\21036 WS) выше у .net
3. Мелочь но все таки - Если ресайзить пустую форму обоих проектов (.Net и нативного) - форма .Net медленнее ресайзиться, при быстрой смене размера, видны черные прямоугольники, в VCL такого нет, и форма ресайзится плавнее (проверял на виртуалке).
Наверняка есть и другие ньюансы в плане производительности. Должно быть объяснение неповоротливости .net программ, врядли это эффекты конкретной реализации.
← →
Rouse_ © (2011-12-06 18:53) [65]
> han_malign (06.12.11 15:57) [63]
Угу, в таком варианте работает побыстрее даже WPF.unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Buttons;
type
TFriendlySpeedButton = class(TSpeedButton);
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
MoveToRight: Boolean;
ButtonsOffset: ShortInt;
Buttons: array [0..999] of TFriendlySpeedButton;
function CalcButtonsOffset: Integer;
procedure CreateThousandButtnos;
procedure MoveButtons(Value: ShortInt);
procedure ReleseButtons;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
CreateThousandButtnos;
end;
function TForm1.CalcButtonsOffset: Integer;
begin
if MoveToRight then
Dec(ButtonsOffset)
else
Inc(ButtonsOffset);
if ButtonsOffset < 1 then
MoveToRight := False;
if ButtonsOffset > 16 then
MoveToRight := True;
Result := ButtonsOffset;
end;
procedure TForm1.CreateThousandButtnos;
var
I: Integer;
begin
for I := 0 to 999 do
begin
Buttons[I] := TFriendlySpeedButton.Create(nil);
Buttons[I].Caption := IntToStr(I);
Buttons[I].Parent := Self;
end;
Timer1.Enabled := True;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1.Enabled := False;
MoveToRight := False;
DoubleBuffered := True;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ReleseButtons;
end;
procedure TForm1.MoveButtons(Value: ShortInt);
var
I: Integer;
// D: THandle;
R: TRect;
begin
// D := BeginDeferWindowPos(1000);
// try
// for I := 0 to 999 do
// D := DeferWindowPos(D, Buttons[I].Handle,
// 0, (I * 75) mod (20 * 75) + Value,
// I div 20 * 20 + Panel1.Height, 75, 20, SWP_NOZORDER or SWP_NOREDRAW);
// finally
// EndDeferWindowPos(D);
// end;
// LockWindowUpdate(Handle);
for I := 0 to 999 do
begin
R.Left := (I * 75) mod (20 * 75) + Value;
R.Top := I div 20 * 20 + Panel1.Height;
R.Right := R.Left + 75;
R.Bottom := R.Top + 20;
Buttons[I].UpdateBoundsRect(R);
end;
// LockWindowUpdate(0);
// RedrawWindow(Handle, nil, 0, RDW_INVALIDATE or RDW_ALLCHILDREN or RDW_UPDATENOW);
Invalidate;
end;
procedure TForm1.ReleseButtons;
var
I: Integer;
begin
for I := 0 to 999 do
Buttons[I].Free;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
MoveButtons(CalcButtonsOffset);
end;
end.
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2012.04.01;
Скачать: [xml.tar.bz2];
Память: 0.6 MB
Время: 0.005 c