• 0
zloid

Медленно перемещаются контролы на Android

Вопросы

Здравствуйте.

 

Пишу приложение на Delphi XE8. Суть его в том, чтобы показывать на экране некие данные, присылаемые по сети. Данные очень простые: короткие тексты разных цветов в разных частях экрана. При этом эти тексты должны иногда перемещаться туда-сюда. Этакий информер.

 

Я использовал компонент TText для вывода. Больше на форме ничего нет, только с десяток этих TText'ов, которые в основном ничего не делают, но по команде перемещаются.

 

Приложение простое и прекрасно работает. Нет, не прекрасно: если в windows всё плавно, на android-телефоне плавно, то на Android-планшете заметны неприятные подтормаживания: элементы двгаются с заметными рывками, иногда случается общий лаг на долю секунды.

 

Пробовал вместо TText'ов кинуть на форму TPaintBox и выводить на Canvas тексты вручную. Не заметил прироста скорости.

 

Помогите. ) Подскажите метод, которым на Android можно быстро выводить простую графику. Желательно пример исходного кода, чтобы я сразу его запустил и сказал "ага, действительно плавно", а там уж я адаптирую свой проект.

 

Просто обидно: всё работает - база, сервер, логика на клиенте, но вот показать пользователю симпатично не выходит, сразу бросается в глаза, что приложение "тормозит".

 

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 ответов на этот вопрос

  • 0

Хоть код покажите - как реализовано перемещение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Может поможет настройка рендеринга приложения, при использовании у меня скорость анимацию увеличивается, а качество изображения незаметно, где то на форуме было:

procedure RenderingSetupCallback(const Sender, Context: TObject; var ColorBits, DepthBits: Integer; var Stencil: Boolean; var Multisamples: Integer); 
begin
  ColorBits := 16; // default is 24
  DepthBits := 0; // default is 24
  Stencil := false; // default is True
  Multisamples := 0; // default depends on TForm.Quality or TForm3D.Multisample
end;

И прописать в событии FormCreate

procedure TForm_main.FormCreate(Sender: TObject); var SetupService: IFMXRenderingSetupService;
begin
  if TPlatformServices.Current.SupportsPlatformService(IFMXRenderingSetupService, IInterface(SetupService))
    then SetupService.Subscribe(RenderingSetupCallback);
end;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Хоть код покажите - как реализовано перемещение.

На форме таймер лежит с Interval=60 (пробовал разные значения), который делает так:

Self.BeginUpdate;
Тут я перебираю все TText'ы, которые хранятся в TList и изменяю плавно их координаты
Self.EndUpdate;

Пробовал вместо таймера приделывать к ним компонент TFloatAnimation - не быстрее.

 

 

Ну и про Canvas тоже рассказывал. В таймере говорил

PaintBox.Repaint; 

А в методе Draw() у ПаинтБокса делал так:

Canvas.BeginScene;
Отрисовываю в цикле все тексты при помощи FillText
Canvas.EndScene;

...

Спасибо. Не знал о таком. Нашёл то же самое в справке:

http://docwiki.embarcadero.com/RADStudio/XE6/en/Overriding_OpenGL_Rendering_Parameters

Но не помогло. TText'ы ведут себя всё так же - иногда подлагивают.

 

В Вашем случае добавление RenderingSetupCallback само по себе лекарство, или Вы как-то по-другому выводите графику на экран? Тоже пользуетесь FMX-компонентами или "рендерите" графику на канву?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Чтобы было понятнее о каких лагах речь, создал мини-приложение, на форме которого всего четыре TText, они движутся по кругу (квадрату, конечно). Код привожу в конце под спойлером.

 

https://www.youtube.com/watch?v=UQSS-BeXSAA

 

На этом видео я последовательно снимаю работу приложения в Windows, в симуляторе IOS и на Android-планшете. В первых двух случаях элементы движутся плавно, а на планшете заметны регулярные рывки. На Android-телефоне, кстати, всё работает плавно (снять не могу, но поверьте на слово).

 



const
SPEED = 10;
MARGIN = 20;

procedure RenderingSetupCallback(const Sender, Context: TObject;
var ColorBits, DepthBits: Integer; var Stencil: Boolean;
var Multisamples: Integer);
begin
// Override OpenGL rendering setup to use custom values.
ColorBits := 16; // default is 24
DepthBits := 0; // default is 24
Stencil := False; // default is True
Multisamples := 0; // default depends on TForm.Quality or TForm3D.Multisample
end;

procedure RegisterRenderingSetup;
var
SetupService: IFMXRenderingSetupService;
begin
if TPlatformServices.Current.SupportsPlatformService
(IFMXRenderingSetupService, IInterface(SetupService)) then
SetupService.Subscribe(RenderingSetupCallback);
// There is also SetupService.Unsubscribe, which removes the hook.
end;

procedure TForm2.Timer1Timer(Sender: TObject);
var
I: Integer;
T: TText;
begin
for I := 1 to 4 do
begin
T := TText(Self.FindComponent('Text' + inttostr(I)));

if T.Tag = 1 then
begin
T.Position.X := T.Position.X + SPEED;
if T.Width + T.Position.X + MARGIN >= Self.Width then
begin
T.Tag := 2;
Continue;
end;
end;

if T.Tag = 2 then
begin
T.Position.Y := T.Position.Y + SPEED;
if T.Height + T.Position.Y + MARGIN >= Self.Height then
begin
T.Tag := 3;
Continue;
end;
end;

if T.Tag = 3 then
begin
T.Position.X := T.Position.X - SPEED;
if T.Position.X - MARGIN <= 0 then
begin
T.Tag := 4;
Continue;
end;
end;

if T.Tag = 4 then
begin
T.Position.Y := T.Position.Y - SPEED;
if T.Position.Y - MARGIN <= 0 then
begin
T.Tag := 1;
Continue;
end;
end;
end;

end;

initialization

RegisterRenderingSetup;

end.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

вот видео

вот текст

var
  Form1: TForm1;


implementation


{$R *.fmx}
const
SPEED = 10;
MARGIN = 20;


procedure TForm1.FormResize(Sender: TObject);
begin
  lbl1.Text := Format('%d x %d',[width, height]);
end;


procedure TForm1.FormShow(Sender: TObject);
begin
  txt1.Position.Point := PointF(margin,MARGIN);
  txt2.Position.Point := pointf(width - margin - txt2.Width, MARGIN);
  txt3.Position.Point := pointf(width - margin - txt3.Width, height - margin - txt3.Height);
  txt4.Position.Point := pointf(margin, height - margin - txt4.Height);


  txt1.Tag := 1;
  txt2.Tag := 2;
  txt3.Tag := 3;
  txt4.Tag := 4;
end;


procedure TForm1.MoveText(t: TText);
begin
  case t.Tag of
    1:begin
      t.Position.X := t.Position.X + SPEED;
      if t.Width + t.Position.X + MARGIN >= Width then
        t.Tag := 2;
    end;
    2:begin
      t.Position.Y := t.Position.Y + SPEED;
      if t.Height + t.Position.Y + MARGIN >= Height then
        t.Tag := 3;
    end;
    3:begin
      t.Position.X := t.Position.X - SPEED;
      if t.Position.X - MARGIN <= 0 then
        t.Tag := 4;
    end;
    4:begin
      t.Position.Y := t.Position.Y - SPEED;
      if t.Position.Y - MARGIN <= 0 then
        t.Tag := 1;
    end;
  end;
//  t.Text := t.Name + ' ' + Format('%d x %d',[round(t.Position.x), Round(t.Position.y)]);
end;


procedure TForm1.tmr1Timer(Sender: TObject);
begin
  MoveText(txt1);
  MoveText(txt2);
  MoveText(txt3);
  MoveText(txt4);
end;


end.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

протестировал на Huawei MediaPad 10, все прекрасно двигается никаких зависании

только я исправил Width -> ClientWidth и Height -> ClientHeight

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

 

вот видео

вот текст









 

 

Ваш код на моём планшете (ONDA, разрешение 1024x768) не дал прироста в скорости, элементы всё так же впадают в транс.

 

Хотел уж было подвести печальный итог, что FMX тормозит на разрешениях выше 360х615, как в Вашем видео, но

 

протестировал на Huawei MediaPad 10, все прекрасно двигается никаких зависании

только я исправил Width -> ClientWidth и Height -> ClientHeight

Обнадёжило, у MediaPad разрешение ещё выше. Может быть у меня просто слабый планшет.

 

 

 

Забыл сказать: я скидываю галочку

bCrijgLYHPM.jpg

Иначе планшет просто выдаёт огромное сообщение, что приложение не поддерживает данное устройство.

 

UPD: наше тестовое приложение с летающими TTExt работает и с галочкой, но скорость такая же. Но для любого другого приложения сложнее HelloWorld, галочку надо скидывать.

Изменено пользователем zloid

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

нужно отметить, что показанное разрешение - виртуальное

экран там 5.5" 1280*720

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

так у тебя тестовый планшет на интеле что ли? 

Нет, ONDA Vi40

ARM Cortex-A8, Allwinner A10 1GHz

Если Ваш ответ к моему примечанию о том, что я скидываю галку, то я обновил своё сообщение. С галочкой всё проседает точно так же.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

Хорошо, спишу всё на высокие требования Delphi+FMX и слабость планшета, хотя всякие игрушки на нём идут, а там не просто четыре квадратика выводятся.

 

Спасибо всем за ответы. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу