Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
4-1255347973
sD
2009-10-12 15:46
2012.04.01
Закрыть приложение


2-1323765953
_qwerty_
2011-12-13 12:45
2012.04.01
узнать значение автоинкрементного поля


15-1321017183
Бездомный
2011-11-11 17:13
2012.04.01
Когда, интересно, появятся компьютеры, способные


1-1290074442
Дмитрий Белькевич
2010-11-18 13:00
2012.04.01
Есть форма fsMDIChild, как добраться до её fsMDIForm?


3-1273743190
Роман
2010-05-13 13:33
2012.04.01
Подключение Delphi к базе Firebird





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский